@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
@@ -0,0 +1,275 @@
1
+ 'use strict'
2
+
3
+ // Los comandos que leen y validan un planning: qué está mal, qué hay, qué toca ahora y qué se archiva.
4
+ // Los cuatro trabajan sobre el mismo estado, que `planning/state.js` compone una vez.
5
+
6
+ const fs = require('node:fs')
7
+ const path = require('node:path')
8
+ const P = require('../planning/parser')
9
+ const B = require('../planning/business-rules')
10
+ const PC = require('../planning/contracts')
11
+ const ST = require('../planning/state')
12
+ const I = require('../integrations/registry')
13
+ const O = require('../core/ownership')
14
+ const OB = require('../core/onboarding')
15
+ const C = require('../config/validate')
16
+ const AG = require('../agents/catalog')
17
+ const F = require('../core/files')
18
+ const { fail } = require('./io')
19
+
20
+ // Qué dimensiones enumera el molde de `organization/` y cuáles dejaron de estar. Un agente que reescribe
21
+ // esos archivos tiende a quedarse con el contenido y perder la estructura: el resultado se lee entero y
22
+ // completo, y nadie va a pedir después la dimensión que falta porque nada indica que faltaba.
23
+ //
24
+ // Va como advertencia y no como error: la empresa es dueña de esos archivos y puede reestructurarlos a
25
+ // propósito. Lo que no puede pasar es que una dimensión desaparezca sin que se vea.
26
+ function check(dir, cli) {
27
+ const root = path.resolve(dir || '.')
28
+ const errors = []
29
+ const warnings = []
30
+ const required = ['BACKLOG.md', 'WIP.md', 'DONE.md', 'INBOX.md', 'HUMAN_ACTIONS.md', 'PROTOCOL.md']
31
+ for (const file of required) if (!fs.existsSync(path.join(root, file))) errors.push(`falta ${file}`)
32
+
33
+ const configPath = path.join(root, '..', 'ops.config.json')
34
+ if (fs.existsSync(configPath)) {
35
+ try {
36
+ const raw = fs.readFileSync(configPath, 'utf8')
37
+ const config = JSON.parse(raw)
38
+ if (!raw.includes('{{')) {
39
+ errors.push(...C.validateOpsConfig(config))
40
+ if (Array.isArray(config.workspaceRoots)) {
41
+ for (const workspace of config.workspaceRoots) {
42
+ if (workspace && workspace.name && workspace.path
43
+ && !fs.existsSync(path.resolve(path.dirname(configPath), workspace.path))) {
44
+ errors.push(`ops.config.json: no existe la raíz ${workspace.name} (${workspace.path})`)
45
+ }
46
+ }
47
+ }
48
+ }
49
+ } catch (error) {
50
+ errors.push(`ops.config.json: JSON inválido (${error.message})`)
51
+ }
52
+ } else {
53
+ warnings.push(`no existe ${path.relative(root, configPath)}`)
54
+ }
55
+
56
+ const epics = P.readEpics(root)
57
+ const milestones = P.readBacklog(root)
58
+ const done = P.readDone(root)
59
+ errors.push(...B.validate(path.join(root, 'business-rules')))
60
+ errors.push(...PC.validateRoadmapStructure(root))
61
+ errors.push(...PC.validateBacklogStructure(root))
62
+ errors.push(...PC.validateRules(root))
63
+ errors.push(...PC.validateAdr(root))
64
+ const backlog = milestones.flatMap((milestone) => milestone.tasks)
65
+ const backlogSlugs = new Set(backlog.map((task) => task.slug))
66
+ const epicNums = new Set()
67
+ const storySlugs = new Set()
68
+
69
+ const roles = new Set(AG.list(path.resolve(root, '..')).map((role) => role.slug))
70
+ const wip = P.readWip(root)
71
+ errors.push(...PC.oversizedUnits({ epics, milestones }))
72
+ errors.push(...PC.validateState({
73
+ epics, milestones, done, wip, roles, humanActions: P.readHumanActions(root),
74
+ }))
75
+
76
+ const integration = I.validate(path.resolve(root, '..'))
77
+ errors.push(...integration.errors)
78
+ warnings.push(...integration.warnings)
79
+
80
+ // Sobrescribir una entrada de system/ es legítimo y esperado; lo que no puede pasar es que
81
+ // ocurra en silencio, porque esa entrada deja de recibir las mejoras del toolkit.
82
+ for (const override of O.overrides(path.resolve(root, '..'))) {
83
+ warnings.push(`${override.collection}/${override.project} sobrescribe ${override.system} (override explícito)`)
84
+ }
85
+ // Misma regla para los cargos, que es donde más caro sale: un fork se hace una vez y se olvida.
86
+ const FK = require('../agents/fork')
87
+ for (const entry of FK.drift(path.resolve(root, '..'))) warnings.push(FK.driftLine(entry))
88
+
89
+ warnings.push(...OB.missingSections(path.resolve(root, '..')))
90
+ warnings.push(...OB.orphanCredentials(path.resolve(root, '..')))
91
+
92
+ if (cli.has('--json')) {
93
+ console.log(JSON.stringify({
94
+ ok: !errors.length,
95
+ epics: epics.length,
96
+ queued: backlog.length,
97
+ done: done.entries.length,
98
+ wip: wip ? wip.task : null,
99
+ errors,
100
+ warnings,
101
+ }))
102
+ if (errors.length) process.exit(1)
103
+ return
104
+ }
105
+
106
+ for (const warning of warnings) console.warn(`⚠ ${warning}`)
107
+ for (const error of errors) console.error(`✗ ${error}`)
108
+ if (errors.length) fail(`\n${errors.length} error(es), ${warnings.length} advertencia(s)`)
109
+ console.log(
110
+ `✓ planning válido: ${epics.length} épica(s), ${backlog.length} tarea(s) en cola, ` +
111
+ `${done.entries.length} terminada(s)`,
112
+ )
113
+ }
114
+
115
+ // Estado observable de planning sin mutar nada; base común de `tree` y de sus salidas.
116
+ function treeJson({ epics, milestones, done, wip, inbox, queued }) {
117
+ const state = (slug) => done.set.has(slug) ? 'done' : queued.has(slug) ? 'queued' : 'pending'
118
+ console.log(JSON.stringify({
119
+ roadmap: epics.map((epic) => ({
120
+ num: epic.num,
121
+ title: epic.title,
122
+ status: epic.status,
123
+ stories: epic.stories.map((story) => ({ slug: story.slug, state: state(story.slug) })),
124
+ })),
125
+ backlog: milestones.map((milestone) => ({
126
+ slug: milestone.slug,
127
+ tasks: milestone.tasks.map((task) => ({ slug: task.slug, tier: task.tier || '' })),
128
+ })),
129
+ wip: wip ? { task: wip.task, phase: wip.phase, complete: wip.complete, pending: wip.pending } : null,
130
+ inbox: { deuda: inbox.deuda, ideas: inbox.ideas, propuestas: inbox.propuestas, lecciones: inbox.lecciones },
131
+ done: done.entries.length,
132
+ }))
133
+ }
134
+
135
+ function tree(dir, cli) {
136
+ const root = path.resolve(dir || '.')
137
+ const state = ST.snapshot(root)
138
+ if (cli.has('--json')) return treeJson(state)
139
+ const { epics, milestones, done, wip, inbox, queued } = state
140
+ const color = process.stdout.isTTY && !cli.has('--no-color')
141
+ const paint = (code, text) => color ? `\x1b[${code}m${text}\x1b[0m` : text
142
+ console.log(`\n${paint('1', 'CAUCE')}\n`)
143
+ console.log(paint('1', 'ROADMAP'))
144
+ if (!epics.length) console.log(' (sin épicas)')
145
+ for (const epic of epics) {
146
+ const mark = epic.status === 'closed' ? '✓' : epic.status === 'active' ? '◐' : '●'
147
+ console.log(` ${mark} epic-${epic.num} ${epic.title} [${epic.status}]`)
148
+ for (const story of epic.stories) {
149
+ const mark = done.set.has(story.slug) ? '✓' : queued.has(story.slug) ? '▶' : '○'
150
+ console.log(` ${mark} ${story.slug}`)
151
+ }
152
+ }
153
+ console.log(`\n${paint('1', 'BACKLOG')}`)
154
+ if (!milestones.length) console.log(' (sin hitos activos)')
155
+ for (const milestone of milestones) {
156
+ console.log(` ${milestone.heading}`)
157
+ for (const task of milestone.tasks) console.log(` ☐ ${task.slug}${task.tier ? ` [${task.tier}]` : ''}`)
158
+ }
159
+ const wipText = wip
160
+ ? `▶ ${wip.task} · ${wip.phase} · ${wip.complete}✓/${wip.pending}○`
161
+ : 'idle'
162
+ console.log(`\n${paint('1', 'WIP')} ${wipText}`)
163
+ console.log(
164
+ `${paint('1', 'INBOX')} ${inbox.deuda} deuda · ${inbox.ideas} ideas · ` +
165
+ `${inbox.propuestas} propuestas · ${inbox.lecciones} lecciones` +
166
+ // Sin esto, doce viñetas sin nombre se veían como un inbox vacío y nadie se enteraba.
167
+ (inbox.skipped ? ` (${inbox.skipped} sin contar: falta el nombre en **negrita**)` : ''),
168
+ )
169
+ console.log(`${paint('1', 'DONE')} ${done.entries.length} tareas\n`)
170
+ }
171
+
172
+ // Contexto mínimo suficiente para ejecutar una tarea, en lugar de releer roadmap, BACKLOG y WIP enteros.
173
+ function context(dir, cli) {
174
+ const root = path.resolve(dir || '.')
175
+ const state = ST.snapshot(root)
176
+ const gate = path.join(root, 'AWAITING_REVIEW.md')
177
+ const humanActions = ST.pendingHumanActions(root)
178
+ const { task, skipped } = ST.currentTask(state, humanActions)
179
+ const epic = task ? state.epics.find((candidate) => candidate.num === task.epic) : null
180
+ const criteria = epic ? epic.criteria.filter((criterion) => task.criteria.includes(criterion.id)) : []
181
+ const report = {
182
+ // Toda la cola trabada por una persona no es lo mismo que no tener cola, y decir lo segundo manda a
183
+ // buscar trabajo que no existe en vez de a resolver la fila que lo destraba.
184
+ blocked: fs.existsSync(gate) ? 'awaiting-review' : (!task && skipped.length ? 'blocked-on-human' : ''),
185
+ task: task && {
186
+ slug: task.slug, hito: task.hito, tier: task.tier, cast: task.cast, service: task.service,
187
+ // Una tarea puede heredar su aceptación del criterio citado; el runner necesita el texto, no la cita.
188
+ acceptance: task.acceptance || criteria.map((criterion) => criterion.text).join(' '),
189
+ epic: task.epic,
190
+ },
191
+ criteria,
192
+ epic: epic ? { num: epic.num, title: epic.title, status: epic.status } : null,
193
+ wip: state.wip ? { phase: state.wip.phase, complete: state.wip.complete, pending: state.wip.pending } : null,
194
+ queued: state.milestones.reduce((total, milestone) => total + milestone.tasks.length, 0),
195
+ blockedTasks: skipped,
196
+ humanActions,
197
+ }
198
+ if (cli.has('--json')) return console.log(JSON.stringify(report))
199
+
200
+ if (report.blocked === 'awaiting-review') {
201
+ const first = P.read(gate).split('\n').find((line) => line.trim() && !line.startsWith('#')) || ''
202
+ return console.log(`BLOCKED awaiting-review — ${first.trim()}`)
203
+ }
204
+ if (report.blocked === 'blocked-on-human') {
205
+ const row = humanActions.find((action) => skipped.includes(action.task)) || humanActions[0]
206
+ return console.log(`BLOCKED blocked-on-human — ${row.task}: ${row.action}`)
207
+ }
208
+ if (!report.task) return console.log('TASK (sin tarea disponible)')
209
+ console.log(`TASK ${report.task.slug}${report.task.tier ? ` [${report.task.tier}]` : ''}` +
210
+ `${report.task.service ? ` service: ${report.task.service}` : ''}` +
211
+ `${report.task.hito ? ` hito: ${report.task.hito}` : ''}`)
212
+ if (report.task.cast.build) {
213
+ const review = report.task.cast.review
214
+ console.log(`CAST ${report.task.cast.build}${review.length ? ` → ${review.join(', ')}` : ''}`)
215
+ }
216
+ if (report.epic) console.log(`EPIC ${report.epic.num} ${report.epic.title} [${report.epic.status}]`)
217
+ if (report.task.acceptance) console.log(`ACEPT ${report.task.acceptance}`)
218
+ for (const criterion of criteria) console.log(`${criterion.id.padEnd(6)} ${criterion.text}`)
219
+ const wip = report.wip ? `${report.wip.phase} · ${report.wip.complete}✓/${report.wip.pending}○` : 'idle'
220
+ console.log(`WIP ${wip}`)
221
+ if (report.blockedTasks.length) console.log(`SKIP ${report.blockedTasks.join(', ')} (acción humana abierta)`)
222
+ for (const action of report.humanActions) console.log(`HUMAN ${action.task}: ${action.action}`)
223
+ }
224
+
225
+ // El historial de acciones humanas se acumula en un solo archivo y no por épica: una fila no pertenece
226
+ // a ninguna, y esperar el cierre de una épica dejaría sin archivar las de un planning que todavía no
227
+ // cerró ninguna —que es justo cuando el archivo se vuelve ilegible—.
228
+ function archiveHumanActions(root) {
229
+ const source = path.join(root, 'HUMAN_ACTIONS.md')
230
+ const rows = P.readHumanActions(root).filter((row) => row.resolved)
231
+ if (!rows.length) return console.log('= no hay filas resueltas')
232
+ const target = path.join(root, 'done', 'human-actions.md')
233
+ const header = '| Tarea | Estado | Origen | Acción concreta y condición de desbloqueo |\n|---|---|---|---|'
234
+ const previous = P.read(target).trimEnd()
235
+ const head = previous || `---\nstatus: archived\n---\n\n# Acciones humanas resueltas\n\n${header}`
236
+ fs.mkdirSync(path.dirname(target), { recursive: true })
237
+ F.atomicWrite(target, `${head}\n${rows.map((row) => row.raw).join('\n')}\n`)
238
+ const drop = new Set(rows.map((row) => row.raw))
239
+ const kept = P.read(source).split('\n').filter((line) => !drop.has(line))
240
+ F.atomicWrite(source, `${kept.join('\n').trimEnd()}\n`)
241
+ return console.log(`✓ ${rows.length} fila(s) archivadas`)
242
+ }
243
+
244
+ function archive(dir, rawNum) {
245
+ const root = path.resolve(dir || '.')
246
+ if (String(rawNum || '') === 'human-actions') return archiveHumanActions(root)
247
+ const num = String(rawNum || '').padStart(3, '0')
248
+ if (!/^\d{3}$/.test(num)) fail('La épica debe ser NNN, o human-actions.', 2)
249
+ const epic = P.readEpics(root).find((candidate) => candidate.num === num)
250
+ if (!epic) fail(`No existe epic-${num}.`, 2)
251
+ if (epic.status !== 'closed') fail(`epic-${num} no está cerrada (status: ${epic.status}).`)
252
+ const target = path.join(root, 'done', `epic-${num}.md`)
253
+ const source = path.join(root, 'DONE.md')
254
+ const content = P.read(source)
255
+ const slugs = new Set(epic.stories.map((story) => story.slug))
256
+ const entries = P.readDone(root).entries.filter((entry) => entry.source === 'DONE.md' && slugs.has(entry.slug))
257
+ if (!entries.length) {
258
+ if (fs.existsSync(target)) return console.log(`= epic-${num} ya estaba archivada`)
259
+ fail(`No hay entradas de epic-${num} en DONE.md.`)
260
+ }
261
+ let updated = content
262
+ for (const entry of entries) updated = updated.replace(entry.raw, '').replace(/\n{3,}/g, '\n\n')
263
+ fs.mkdirSync(path.dirname(target), { recursive: true })
264
+ if (!fs.existsSync(target)) {
265
+ F.atomicWrite(
266
+ target,
267
+ `---\nepic: ${num}\nstatus: archived\n---\n\n# DONE — ${epic.title}\n\n` +
268
+ `${entries.map((entry) => entry.raw).join('\n\n')}\n`,
269
+ )
270
+ }
271
+ F.atomicWrite(source, `${updated.trimEnd()}\n`)
272
+ console.log(`✓ epic-${num}: ${entries.length} entrada(s) archivadas`)
273
+ }
274
+
275
+ module.exports = { check, tree, context, archive }
@@ -0,0 +1,273 @@
1
+ 'use strict'
2
+
3
+ // Lo que conecta la instancia con el afuera: qué hay en el workspace, qué falta para arrancar, los
4
+ // proveedores externos y el wiring del runner. Ninguno decide sobre planning; los cuatro escriben o leen
5
+ // configuración de borde.
6
+
7
+ const fs = require('node:fs')
8
+ const path = require('node:path')
9
+ const F = require('../core/files')
10
+ const I = require('../integrations/registry')
11
+ const A = require('../automation')
12
+ const SC = require('../core/scan')
13
+ const OB = require('../core/onboarding')
14
+ const IN = require('./instance')
15
+ const { fail, opsRoot } = require('./io')
16
+
17
+ const MAX_LISTED = 20
18
+
19
+
20
+ const INTEGRATION = {
21
+ list: {
22
+ run: (root) => {
23
+ for (const [name, entry] of Object.entries(providerRegistry(root).config.providers || {})) {
24
+ const state = I.providerState(root, name)
25
+ const mark = !entry.enabled ? '○' : { ready: '●', incomplete: '◐', unreadable: '⚠' }[state]
26
+ const note = mark === '◐'
27
+ ? ` — falta completar integrations/${name}/config.json y poner enabled: true`
28
+ : mark === '⚠'
29
+ ? ` — integrations/${name}/config.json no se puede leer: "integration check" dice por qué`
30
+ : ''
31
+ console.log(`${mark} ${name} [${entry.adapter}]${note}`)
32
+ }
33
+ },
34
+ },
35
+ enable: {
36
+ missing: 'Falta <provider>.',
37
+ run: (root, provider) => {
38
+ const source = path.join(IN.PROJECT_ROOT, 'template', 'integrations', provider)
39
+ if (!fs.existsSync(source)) fail(`Cauce no trae un adaptador para ${provider}.`, 2)
40
+ // Habilitar no es inicializar: repone lo que falte y conserva lo que ya esté. Una instancia que
41
+ // trae el andamiaje de una versión anterior —o que ya tiene snapshots— sólo quiere el interruptor.
42
+ providerRegistry(root)
43
+ IN.copyTemplate(source, path.join(root, 'integrations', provider), {}, true)
44
+ switchProvider(root, provider, true)
45
+ console.log(`✓ ${provider}: conectado al proyecto y andamiaje en integrations/${provider}/.`)
46
+ // Sólo se pide lo que falta: reencender un proveedor ya configurado no debería mandar a
47
+ // completar un archivo que la empresa terminó hace meses.
48
+ const state = I.providerState(root, provider)
49
+ if (state === 'ready') {
50
+ console.log(` Su configuración ya estaba completa: "integration sync" puede correr.`)
51
+ return
52
+ }
53
+ if (state === 'unreadable') {
54
+ console.log(` Su configuración existe y no se puede leer: "integration check" dice por qué.`)
55
+ return
56
+ }
57
+ console.log(` Falta lo tuyo: completá integrations/${provider}/config.json y poné enabled: true ahí.`)
58
+ console.log(` Hasta entonces "integration sync" se niega, que es lo correcto: no hay a dónde apuntar.`)
59
+ },
60
+ },
61
+ // Apagar no desinstala: `integrations/<proveedor>/` puede tener snapshots y borradores de la
62
+ // empresa, y borrarlos para desconectar una integración sería perder trabajo suyo. El andamiaje
63
+ // queda, callado, y volver a encenderlo no pierde nada.
64
+ disable: {
65
+ missing: 'Falta <provider>.',
66
+ run: (root, provider) => {
67
+ switchProvider(root, provider, false)
68
+ console.log(`✓ ${provider}: desconectado del proyecto. "integration sync" deja de correrlo.`)
69
+ if (fs.existsSync(path.join(root, 'integrations', provider))) {
70
+ console.log(` integrations/${provider}/ queda como está: ahí pueden vivir snapshots y borradores tuyos.`)
71
+ }
72
+ },
73
+ },
74
+ check: {
75
+ run: (root, provider) => {
76
+ const result = I.validate(root, provider || '')
77
+ for (const warning of result.warnings) console.warn(`⚠ ${warning}`)
78
+ for (const error of result.errors) console.error(`✗ ${error}`)
79
+ if (result.errors.length) fail(`${result.errors.length} error(es) de integración`)
80
+ console.log(`✓ integraciones válidas${provider ? `: ${provider}` : ''}`)
81
+ },
82
+ },
83
+ sync: {
84
+ missing: 'sync exige <provider>',
85
+ run: async (root, provider, key, cli) => {
86
+ const result = await I.sync(root, provider, { fixture: cli.value('--fixture') })
87
+ console.log(
88
+ `✓ ${provider}: ${result.total} items · ${result.created} nuevos · ` +
89
+ `${result.refreshed} refrescados · ${result.preserved} curados preservados`,
90
+ )
91
+ // Lo que el remoto dejó de tener sí cambia el staging, y se contaba sin decirlo: un item que
92
+ // desaparece se borra o queda marcado según tenga curación. Se nombra sólo cuando pasó, porque
93
+ // en la corrida normal los dos son cero y anunciarlo cada vez es ruido.
94
+ if (result.removed) console.log(` − ${result.removed} sin curar se fueron del remoto y se borraron`)
95
+ if (result.missing) {
96
+ console.log(` ⚠ ${result.missing} con curación ya no están en el remoto: quedan marcados`)
97
+ }
98
+ },
99
+ },
100
+ promote: {
101
+ missing: 'promote exige <provider> <remote-key>',
102
+ needsKey: true,
103
+ run: (root, provider, key) => {
104
+ const result = I.promote(root, provider, key)
105
+ console.log(`✓ ${provider}:${result.key} promovido como ${result.kind}`)
106
+ },
107
+ },
108
+ 'writeback-plan': {
109
+ missing: 'writeback-plan exige <provider>',
110
+ run: (root, provider) => console.log(JSON.stringify(I.writebackPlan(root, provider), null, 2)),
111
+ },
112
+ }
113
+
114
+ // Dónde puede mirar una instancia: exactamente las raíces que declara, y nada por encima de ellas. Sale
115
+ // de `ops.config.json` en vez de suponerse —el sidecar declara `..`, el embebido `.`— para que acotar las
116
+ // raíces acote también el escaneo, y para que nadie termine recorriendo la carpeta de al lado.
117
+ // Las tres reconciliaciones son el mismo comando con otra operación: se declaran en el mismo lugar
118
+ // para que agregar una cuarta no pida tocar el despachador.
119
+ for (const operation of ['reset', 'rebase', 'reconcile']) {
120
+ INTEGRATION[operation] = {
121
+ missing: `${operation} exige <provider> <remote-key>`,
122
+ needsKey: true,
123
+ run: (root, provider, key) => {
124
+ const changed = I.reconcile(root, provider, operation, [key])
125
+ console.log(`✓ ${provider}: ${operation} aplicado a ${changed.join(', ')}`)
126
+ },
127
+ }
128
+ }
129
+
130
+ function scan(target, cli) {
131
+ const root = path.resolve(target || '.')
132
+ const result = { root, services: target ? SC.candidates(root) : SC.inventory(root) }
133
+ if (cli.has('--json')) return console.log(JSON.stringify(result, null, 2))
134
+ // Un monorepo de sesenta paquetes no se lee en pantalla. Se recorta, y se dice cuánto: un corte que no
135
+ // se anuncia hace pasar lo listado por todo lo que hay.
136
+ for (const service of result.services.slice(0, MAX_LISTED)) {
137
+ // El proyecto que vive en la raíz se nombra por su carpeta: `.` a secas no dice de cuál se habla.
138
+ const label = service.path === '.' ? `. (${path.basename(service.root || result.root)})` : service.path
139
+ const expects = service.env ? `\n espera ${service.env.names.join(', ')} (${service.env.file})` : ''
140
+ console.log(
141
+ `${label} [${(service.runtimes || []).join(', ')}]${SC.commandsLine(service.commands)}${expects}`,
142
+ )
143
+ }
144
+ if (result.services.length > MAX_LISTED) {
145
+ console.log(`… y ${result.services.length - MAX_LISTED} más, todos en --json`)
146
+ }
147
+ console.log(`${result.services.length} candidato(s). Cuál es el producto y cuál quedó muerto lo ` +
148
+ 'decide una persona.')
149
+ }
150
+
151
+ // Sólo lo declarado y de dónde salió: un comando inventado se lee igual que uno real.
152
+ function onboard(rootArg, cli, runner = '') {
153
+ const root = path.resolve(rootArg || '.')
154
+ const services = SC.inventory(root)
155
+ const state = OB.guide(root, services)
156
+ if (cli.has('--json')) {
157
+ return console.log(JSON.stringify({ ...state, roots: SC.workspaceRoots(root), servicios: services }, null, 2))
158
+ }
159
+ // La pregunta primero, y el inventario después: de qué trata el proyecto es lo mismo esté vacío,
160
+ // sea un monorepo o sean diez repos, y empezar por lo que se encontró invierte de qué se trata esto.
161
+ if (state.fresh) {
162
+ console.log(`${state.opening}\n`)
163
+ console.log(`Según lo que contestes salen hasta ${state.followUps} preguntas más, con las palabras de`)
164
+ console.log('este proyecto, hasta cubrir lo que haga falta de esto:\n')
165
+ for (const dimension of state.dimensions) console.log(` · ${dimension.need}`)
166
+ console.log('')
167
+ }
168
+ const listed = services.slice(0, MAX_LISTED).map((service) => service.path).join(', ')
169
+ const more = services.length > MAX_LISTED ? ` y ${services.length - MAX_LISTED} más` : ''
170
+ console.log(services.length
171
+ ? `Mientras tanto, esto es lo que hay: ${listed}${more}`
172
+ : 'Mientras tanto, en el workspace todavía no hay ningún proyecto.')
173
+ if (!state.fresh) {
174
+ const parts = [state.written.organization && 'organization/', state.written.roadmap && 'el roadmap']
175
+ .filter(Boolean).join(' y ')
176
+ console.log(`Esta instancia ya tiene ${parts} escrito: el arranque no la va a pisar.`)
177
+ return
178
+ }
179
+ // Un solo cierre: tres líneas que suenan a final se leen como tres finales, y quien recién instaló
180
+ // termina sin saber cuál era el paso.
181
+ console.log(runner
182
+ ? `\n→ Abrí ${runner} acá y contestale esa pregunta.`
183
+ : '\n→ Contestá esa pregunta cuando corras el arranque.')
184
+ console.log(' Con tus respuestas escribe organization/, el mapa real de AGENTS.md y la primera épica.')
185
+ }
186
+
187
+ // El registro de proveedores, leído igual por todos los que lo tocan. `list` lo parseaba suelto y un
188
+ // archivo roto salía como un error de JSON sin contexto.
189
+ function providerRegistry(root) {
190
+ const file = path.join(root, 'integrations', 'config.json')
191
+ try { return { file, config: JSON.parse(fs.readFileSync(file, 'utf8')) } } catch (error) {
192
+ return fail(`integrations/config.json ilegible: ${error.message}`)
193
+ }
194
+ }
195
+
196
+ function switchProvider(root, provider, enabled) {
197
+ const { file, config } = providerRegistry(root)
198
+ if (!config.providers || !config.providers[provider]) {
199
+ fail(`${provider} no está en integrations/config.json.`)
200
+ }
201
+ config.providers[provider].enabled = enabled
202
+ F.atomicWriteJson(file, config)
203
+ }
204
+
205
+ async function integration(action, rootArg, provider, key, cli) {
206
+ const step = INTEGRATION[action]
207
+ if (!step) fail(`Acción de integración desconocida: ${action || '(vacía)'}`, 2)
208
+ if (step.missing && (!provider || (step.needsKey && !key))) fail(step.missing, 2)
209
+ await step.run(path.resolve(rootArg || '.'), provider, key, cli)
210
+ }
211
+
212
+ function automation(action, rootArg, runnerName, cli) {
213
+ const root = opsRoot(rootArg)
214
+ if (action === 'list-hooks') return A.listHooks()
215
+ if (action === 'list') {
216
+ for (const name of A.RUNNER_NAMES) {
217
+ const runner = A.runnerManifest(root, name)
218
+ const installed = fs.existsSync(path.join(root, runner.config.target))
219
+ const capabilities = Object.entries(runner.capabilities)
220
+ .filter(([, enabled]) => enabled)
221
+ .map(([capability]) => capability)
222
+ .join(', ')
223
+ console.log(`${installed ? '●' : '○'} ${name}${installed ? ' [instalado]' : ''} · ${capabilities}`)
224
+ }
225
+ return
226
+ }
227
+ if (action === 'check') {
228
+ const errors = A.check(root)
229
+ for (const error of errors) console.error(`✗ ${error}`)
230
+ if (errors.length) fail(`${errors.length} error(es) de automatización`)
231
+ console.log(
232
+ `✓ automatización válida: ${A.GUARD_NAMES.length} guards, ${A.RUNNER_NAMES.length} adaptadores`,
233
+ )
234
+ return
235
+ }
236
+ if (action === 'doctor') {
237
+ let result
238
+ try { result = A.doctor(root, runnerName) } catch (error) { fail(error.message, 2) }
239
+ if (result.errors.length) {
240
+ fail(`${runnerName}: ${result.errors.length} error(es), ${result.warnings.length} advertencia(s)`)
241
+ }
242
+ console.log(`✓ ${runnerName}: adaptador operativo (${result.warnings.length} advertencia(s))`)
243
+ return
244
+ }
245
+ if (action === 'uninstall') {
246
+ try { A.uninstall(root, runnerName, console) } catch (error) { fail(error.message, 2) }
247
+ console.log(' la instancia sigue en pie: borrar la carpeta ops es una decisión aparte.')
248
+ return
249
+ }
250
+ if (action === 'install') {
251
+ let runner
252
+ const force = cli.has('--force')
253
+ try { runner = A.install(root, runnerName, console, { force }) } catch (error) { fail(error.message, 2) }
254
+ if (runnerName === 'codex') {
255
+ console.log(' Codex deja los hooks nuevos sin correr hasta que los confíes: abrí una sesión')
256
+ console.log(' y usá /hooks para revisarlos y marcarlos como confiables.')
257
+ }
258
+ if (!runner.capabilities.nativeHooks) {
259
+ console.log(` ${runnerName} no expone hooks nativos; aplica guards como prechecks.`)
260
+ }
261
+ const result = A.doctor(root, runnerName)
262
+ if (result.errors.length) fail(`${runnerName}: instalación incompleta`)
263
+ console.log(`✓ ${runnerName}: adaptador operativo (${result.warnings.length} advertencia(s))`)
264
+ return
265
+ }
266
+ fail(`Acción de automatización desconocida: ${action || '(vacía)'}`, 2)
267
+ }
268
+
269
+ // `init` enciende un proveedor en la misma corrida en que crea la instancia, y ésta es la operación
270
+ // que lo hace: se expone para que la composición no tenga que conocer la tabla entera.
271
+ const enableProvider = (root, provider) => INTEGRATION.enable.run(root, provider)
272
+
273
+ module.exports = { scan, onboard, integration, automation, enableProvider }
@@ -0,0 +1,21 @@
1
+ 'use strict'
2
+
3
+ // El bloque `---` del encabezado de un markdown, leído una sola vez. Estaba implementado en `planning` y
4
+ // en `integrations` con dos comportamientos distintos: uno aceptaba el bloque en cualquier parte del
5
+ // archivo y el otro sólo al principio; uno admitía claves con dígito inicial y el otro no. Un mismo
6
+ // draft se leía distinto según quién lo abriera.
7
+ //
8
+ // Se resuelve por el lado estricto: frontmatter es lo que encabeza el documento, y un `---` en el medio
9
+ // es una línea horizontal de markdown. La clave admite lo que admite YAML.
10
+
11
+ function frontmatter(text) {
12
+ const block = (String(text).match(/^---\s*\n([\s\S]*?)\n---/) || [])[1] || ''
13
+ const values = {}
14
+ for (const line of block.split('\n')) {
15
+ const match = line.match(/^([\w-]+):\s*(.*)$/)
16
+ if (match) values[match[1]] = match[2].trim().replace(/^['"]|['"]$/g, '')
17
+ }
18
+ return values
19
+ }
20
+
21
+ module.exports = { frontmatter }
@@ -11,6 +11,8 @@ const crypto = require('node:crypto')
11
11
  const fs = require('node:fs')
12
12
  const path = require('node:path')
13
13
 
14
+ const { atomicWriteJson } = require('./files')
15
+
14
16
  const FILE = path.join('.cauce', 'manifest.json')
15
17
 
16
18
  function digestText(content) {
@@ -21,18 +23,28 @@ function digest(file) {
21
23
  try { return digestText(fs.readFileSync(file)) } catch { return '' }
22
24
  }
23
25
 
26
+ const EMPTY = () => ({ files: {}, runners: {}, forks: {} })
27
+
24
28
  // Dos secciones porque son dos entregas distintas: `files` es lo que se materializó dentro de la
25
29
  // instancia y `runners` lo que un adaptador dejó fuera de ella —en modo sidecar el wiring vive en
26
30
  // la carpeta de la compañía—. El registro se queda igual acá, que es el repo que la empresa versiona.
27
31
  function readAll(root) {
28
- try {
29
- const data = JSON.parse(fs.readFileSync(path.join(root, FILE), 'utf8')) || {}
30
- return {
31
- files: typeof data.files === 'object' && data.files ? data.files : {},
32
- runners: typeof data.runners === 'object' && data.runners ? data.runners : {},
33
- forks: typeof data.forks === 'object' && data.forks ? data.forks : {},
34
- }
35
- } catch { return { files: {}, runners: {}, forks: {} } }
32
+ let raw
33
+ // Ausente e ilegible se leían los dos como vacío, y no son lo mismo. Ausente es legítimo: una
34
+ // instancia recién creada, o anterior a que existiera el registro. Ilegible no, porque vacío afirma
35
+ // que la empresa no editó nada —la lectura más destructiva posible de este archivo en particular—:
36
+ // `upgrade` dejaba de reconocer lo suyo y lo pisaba en silencio, saliendo 0. Sin poder leerlo no hay
37
+ // decisión que tomar, y detenerse es lo único que no pierde trabajo ajeno.
38
+ try { raw = fs.readFileSync(path.join(root, FILE), 'utf8') } catch { return EMPTY() }
39
+ let data
40
+ try { data = JSON.parse(raw) || {} } catch (error) {
41
+ throw new Error(`${FILE}: no se puede leer (${error.message}). Restauralo desde el control de versiones.`)
42
+ }
43
+ return {
44
+ files: typeof data.files === 'object' && data.files ? data.files : {},
45
+ runners: typeof data.runners === 'object' && data.runners ? data.runners : {},
46
+ forks: typeof data.forks === 'object' && data.forks ? data.forks : {},
47
+ }
36
48
  }
37
49
 
38
50
  function read(root) { return readAll(root).files }
@@ -50,7 +62,6 @@ function readForks(root) { return readAll(root).forks }
50
62
  function write(root, files, runners, forks) {
51
63
  const current = readAll(root)
52
64
  const target = path.join(root, FILE)
53
- fs.mkdirSync(path.dirname(target), { recursive: true })
54
65
  const ordered = (map) => Object.fromEntries(
55
66
  Object.entries(map).sort(([left], [right]) => left.localeCompare(right)),
56
67
  )
@@ -60,7 +71,9 @@ function write(root, files, runners, forks) {
60
71
  runners: ordered(runners || current.runners),
61
72
  forks: ordered(forks || current.forks),
62
73
  }
63
- fs.writeFileSync(target, `${JSON.stringify(data, null, 2)}\n`)
74
+ // Atómico porque un truncado acá deja la instancia sin el registro que separa lo suyo de lo
75
+ // nuestro, y desde que leerlo vacío dejó de ser una opción eso bloquea el upgrade siguiente.
76
+ atomicWriteJson(target, data)
64
77
  }
65
78
 
66
79
  // Registra lo entregado en una ruta, relativo a la raíz de la instancia. Acumula sobre lo que recibe