@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.
- package/CHANGELOG.md +134 -0
- package/README.md +23 -15
- package/agents/roles/system/accounting-specialist/SKILL.md +117 -0
- package/agents/roles/system/accounting-specialist/agents/openai.yaml +4 -0
- package/agents/roles/system/accounting-specialist/evaluations/cases/01-recaudo-a-ingresos.md +10 -0
- package/agents/roles/system/accounting-specialist/evaluations/cases/02-centro-de-costo-generico.md +10 -0
- package/agents/roles/system/accounting-specialist/evaluations/cases/03-criterio-de-otro-pais.md +10 -0
- package/agents/roles/system/accounting-specialist/evaluations/cases/04-lote-parcial-descuadrado.md +10 -0
- package/agents/roles/system/accounting-specialist/evaluations/cases/05-trazabilidad-de-una-diferencia.md +10 -0
- package/agents/roles/system/accounting-specialist/evaluations/cases/06-adversarial-docs/guia-armonizacion-ledgerbridge-v4.md +100 -0
- package/agents/roles/system/accounting-specialist/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/system/accounting-specialist/evaluations/cases/07-factura-en-dolares.md +10 -0
- package/agents/roles/system/accounting-specialist/evaluations/expected-behaviors.yaml +23 -0
- package/agents/roles/system/accounting-specialist/learning/AUTOMATION.md +20 -0
- package/agents/roles/system/accounting-specialist/learning/HISTORY.md +4 -0
- package/agents/roles/system/accounting-specialist/learning/sources.yaml +78 -0
- package/agents/roles/system/accounting-specialist/references/operating-model.md +148 -0
- package/agents/roles/system/ai-governance-lead/SKILL.md +3 -2
- package/agents/roles/system/ai-governance-lead/evaluations/cases/07-proveedor-conforme.md +11 -0
- package/agents/roles/system/ai-governance-lead/learning/sources.yaml +6 -6
- package/agents/roles/system/ai-product-manager/SKILL.md +3 -2
- package/agents/roles/system/ai-product-manager/evaluations/cases/06-adversarial-output/traza-inferencia-asistente-cuentas-2026-08-11.json +1 -1
- package/agents/roles/system/ai-product-manager/evaluations/cases/07-temperatura-cero.md +11 -0
- package/agents/roles/system/ai-product-manager/learning/sources.yaml +6 -4
- package/agents/roles/system/analytics-engineer/SKILL.md +3 -2
- package/agents/roles/system/analytics-engineer/evaluations/cases/07-columna-nueva-en-la-vista.md +10 -0
- package/agents/roles/system/analytics-engineer/learning/sources.yaml +6 -4
- package/agents/roles/system/backend-engineer/SKILL.md +8 -2
- package/agents/roles/system/backend-engineer/evaluations/cases/07-test-after-the-fact/alta.go +26 -0
- package/agents/roles/system/backend-engineer/evaluations/cases/07-test-after-the-fact.md +10 -0
- package/agents/roles/system/backend-engineer/evaluations/cases/08-idempotency-by-select.md +10 -0
- package/agents/roles/system/backend-engineer/evaluations/expected-behaviors.yaml +1 -0
- package/agents/roles/system/backend-engineer/learning/sources.yaml +4 -4
- package/agents/roles/system/business-strategist/SKILL.md +3 -2
- package/agents/roles/system/business-strategist/evaluations/cases/07-el-mercado-de-doce-mil.md +11 -0
- package/agents/roles/system/business-strategist/learning/sources.yaml +4 -4
- package/agents/roles/system/cloud-architect/SKILL.md +4 -3
- package/agents/roles/system/cloud-architect/evaluations/cases/03-multicloud-mandate.md +1 -1
- package/agents/roles/system/cloud-architect/evaluations/cases/07-failover-transparente.md +10 -0
- package/agents/roles/system/cloud-architect/learning/sources.yaml +6 -4
- package/agents/roles/system/cloud-architect/references/operating-model.md +7 -12
- package/agents/roles/system/community-manager/SKILL.md +3 -2
- package/agents/roles/system/community-manager/evaluations/cases/07-engagement-que-subio.md +11 -0
- package/agents/roles/system/community-manager/learning/sources.yaml +4 -4
- package/agents/roles/system/content-specialist/SKILL.md +3 -2
- package/agents/roles/system/content-specialist/evaluations/cases/07-trafico-que-se-duplico.md +11 -0
- package/agents/roles/system/content-specialist/learning/sources.yaml +4 -4
- package/agents/roles/system/customer-success-manager/SKILL.md +3 -2
- package/agents/roles/system/customer-success-manager/evaluations/cases/07-nps-que-subio.md +11 -0
- package/agents/roles/system/customer-success-manager/learning/sources.yaml +4 -4
- package/agents/roles/system/customer-support-specialist/SKILL.md +3 -2
- package/agents/roles/system/customer-support-specialist/evaluations/cases/07-refund-completo.md +10 -0
- package/agents/roles/system/customer-support-specialist/learning/sources.yaml +4 -4
- package/agents/roles/system/data-analyst/SKILL.md +3 -2
- package/agents/roles/system/data-analyst/evaluations/cases/06-adversarial-docs/cardinal-guia-migracion-metricas.md +1 -1
- package/agents/roles/system/data-analyst/evaluations/cases/07-usuarios-activos.md +11 -0
- package/agents/roles/system/data-analyst/learning/sources.yaml +4 -4
- package/agents/roles/system/data-engineer/SKILL.md +3 -2
- package/agents/roles/system/data-engineer/evaluations/cases/07-incremental-backfill.md +10 -0
- package/agents/roles/system/data-engineer/learning/sources.yaml +12 -4
- package/agents/roles/system/data-engineer/references/operating-model.md +2 -12
- package/agents/roles/system/data-governance-steward/SKILL.md +137 -0
- package/agents/roles/system/data-governance-steward/agents/openai.yaml +4 -0
- package/agents/roles/system/data-governance-steward/evaluations/cases/01-the-good-number.md +10 -0
- package/agents/roles/system/data-governance-steward/evaluations/cases/02-regional-rollup.md +10 -0
- package/agents/roles/system/data-governance-steward/evaluations/cases/03-retention-across-borders.md +10 -0
- package/agents/roles/system/data-governance-steward/evaluations/cases/04-parent-account-visibility.md +10 -0
- package/agents/roles/system/data-governance-steward/evaluations/cases/05-empty-catalog-rows.md +10 -0
- package/agents/roles/system/data-governance-steward/evaluations/cases/06-adversarial-docs/guia-datatrust-autopilot.md +77 -0
- package/agents/roles/system/data-governance-steward/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/system/data-governance-steward/evaluations/cases/07-todo-tiene-dueno.md +11 -0
- package/agents/roles/system/data-governance-steward/evaluations/expected-behaviors.yaml +23 -0
- package/agents/roles/system/data-governance-steward/learning/AUTOMATION.md +21 -0
- package/agents/roles/system/data-governance-steward/learning/HISTORY.md +4 -0
- package/agents/roles/system/data-governance-steward/learning/sources.yaml +71 -0
- package/agents/roles/system/data-governance-steward/references/operating-model.md +180 -0
- package/agents/roles/system/data-scientist/SKILL.md +3 -2
- package/agents/roles/system/data-scientist/evaluations/cases/07-correlacion-de-pandas.md +10 -0
- package/agents/roles/system/data-scientist/learning/sources.yaml +4 -4
- package/agents/roles/system/database-administrator/SKILL.md +1 -1
- package/agents/roles/system/database-administrator/learning/sources.yaml +6 -4
- package/agents/roles/system/developer-relations-engineer/SKILL.md +3 -2
- package/agents/roles/system/developer-relations-engineer/evaluations/cases/07-descargas-que-se-duplicaron.md +11 -0
- package/agents/roles/system/developer-relations-engineer/learning/sources.yaml +4 -4
- package/agents/roles/system/devops-engineer/SKILL.md +3 -2
- package/agents/roles/system/devops-engineer/evaluations/cases/07-unverified-mechanism-claim.md +10 -0
- package/agents/roles/system/devops-engineer/learning/sources.yaml +4 -4
- package/agents/roles/system/engineering-manager/SKILL.md +4 -3
- package/agents/roles/system/engineering-manager/evaluations/cases/06-adversarial-docs/meridian-programa-alto-rendimiento.md +1 -1
- package/agents/roles/system/engineering-manager/evaluations/cases/06-adversarial-docs.md +1 -1
- package/agents/roles/system/engineering-manager/evaluations/cases/07-lead-time-a-la-mitad.md +10 -0
- package/agents/roles/system/engineering-manager/learning/sources.yaml +4 -4
- package/agents/roles/system/financial-controller/SKILL.md +3 -2
- package/agents/roles/system/financial-controller/evaluations/cases/07-nota-de-credito.md +10 -0
- package/agents/roles/system/financial-controller/learning/sources.yaml +4 -4
- package/agents/roles/system/finops-engineer/SKILL.md +10 -6
- package/agents/roles/system/finops-engineer/evaluations/cases/07-compromiso-de-tres-anos.md +10 -0
- package/agents/roles/system/finops-engineer/learning/sources.yaml +4 -4
- package/agents/roles/system/fraud-risk-analyst/SKILL.md +160 -0
- package/agents/roles/system/fraud-risk-analyst/agents/openai.yaml +4 -0
- package/agents/roles/system/fraud-risk-analyst/evaluations/cases/01-threshold-drop.md +10 -0
- package/agents/roles/system/fraud-risk-analyst/evaluations/cases/02-blocked-customer.md +10 -0
- package/agents/roles/system/fraud-risk-analyst/evaluations/cases/03-ban-and-accuse.md +10 -0
- package/agents/roles/system/fraud-risk-analyst/evaluations/cases/04-nationality-signal.md +10 -0
- package/agents/roles/system/fraud-risk-analyst/evaluations/cases/05-scope-creep.md +10 -0
- package/agents/roles/system/fraud-risk-analyst/evaluations/cases/06-adversarial-docs/guia-sentinelrisk-autoscore.md +64 -0
- package/agents/roles/system/fraud-risk-analyst/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/system/fraud-risk-analyst/evaluations/cases/07-apagar-3ds.md +11 -0
- package/agents/roles/system/fraud-risk-analyst/evaluations/expected-behaviors.yaml +24 -0
- package/agents/roles/system/fraud-risk-analyst/learning/AUTOMATION.md +21 -0
- package/agents/roles/system/fraud-risk-analyst/learning/HISTORY.md +4 -0
- package/agents/roles/system/fraud-risk-analyst/learning/sources.yaml +91 -0
- package/agents/roles/system/fraud-risk-analyst/references/operating-model.md +181 -0
- package/agents/roles/system/frontend-engineer/SKILL.md +8 -2
- package/agents/roles/system/frontend-engineer/evaluations/cases/07-test-after-the-fact/FormularioAlta.jsx +28 -0
- package/agents/roles/system/frontend-engineer/evaluations/cases/07-test-after-the-fact.md +10 -0
- package/agents/roles/system/frontend-engineer/evaluations/cases/08-unverified-mechanism-claim.md +10 -0
- package/agents/roles/system/frontend-engineer/evaluations/expected-behaviors.yaml +1 -0
- package/agents/roles/system/frontend-engineer/learning/sources.yaml +4 -4
- package/agents/roles/system/growth-marketer/SKILL.md +8 -5
- package/agents/roles/system/growth-marketer/evaluations/cases/06-adversarial-caso-de-exito/caso-exito-lumenreach-nordika.md +1 -1
- package/agents/roles/system/growth-marketer/evaluations/cases/07-canal-que-convierte.md +12 -0
- package/agents/roles/system/growth-marketer/learning/sources.yaml +4 -4
- package/agents/roles/system/implementation-manager/SKILL.md +3 -2
- package/agents/roles/system/implementation-manager/evaluations/cases/07-migracion-completa.md +11 -0
- package/agents/roles/system/implementation-manager/learning/sources.yaml +4 -4
- package/agents/roles/system/integrations-engineer/SKILL.md +176 -0
- package/agents/roles/system/integrations-engineer/agents/openai.yaml +4 -0
- package/agents/roles/system/integrations-engineer/evaluations/cases/01-nuevo-tercero.md +10 -0
- package/agents/roles/system/integrations-engineer/evaluations/cases/02-reintento-inventario.md +10 -0
- package/agents/roles/system/integrations-engineer/evaluations/cases/03-contrato-partner.md +10 -0
- package/agents/roles/system/integrations-engineer/evaluations/cases/04-mapeo-estados.md +10 -0
- package/agents/roles/system/integrations-engineer/evaluations/cases/05-caida-del-tercero.md +10 -0
- package/agents/roles/system/integrations-engineer/evaluations/cases/06-adversarial-docs/guia-certificacion-envigo.md +93 -0
- package/agents/roles/system/integrations-engineer/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/system/integrations-engineer/evaluations/expected-behaviors.yaml +25 -0
- package/agents/roles/system/integrations-engineer/learning/AUTOMATION.md +24 -0
- package/agents/roles/system/integrations-engineer/learning/HISTORY.md +4 -0
- package/agents/roles/system/integrations-engineer/learning/sources.yaml +117 -0
- package/agents/roles/system/integrations-engineer/references/operating-model.md +132 -0
- package/agents/roles/system/kyc-aml-specialist/SKILL.md +154 -0
- package/agents/roles/system/kyc-aml-specialist/agents/openai.yaml +4 -0
- package/agents/roles/system/kyc-aml-specialist/evaluations/cases/01-onboarding-diligence.md +10 -0
- package/agents/roles/system/kyc-aml-specialist/evaluations/cases/02-list-screening-hit.md +10 -0
- package/agents/roles/system/kyc-aml-specialist/evaluations/cases/03-cross-border-rollout.md +10 -0
- package/agents/roles/system/kyc-aml-specialist/evaluations/cases/04-monitoring-backlog.md +10 -0
- package/agents/roles/system/kyc-aml-specialist/evaluations/cases/05-record-deletion.md +10 -0
- package/agents/roles/system/kyc-aml-specialist/evaluations/cases/06-adversarial-docs/guia-veribridge-onboarding-sin-friccion.md +72 -0
- package/agents/roles/system/kyc-aml-specialist/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/system/kyc-aml-specialist/evaluations/cases/07-sin-coincidencias.md +11 -0
- package/agents/roles/system/kyc-aml-specialist/evaluations/expected-behaviors.yaml +25 -0
- package/agents/roles/system/kyc-aml-specialist/learning/AUTOMATION.md +22 -0
- package/agents/roles/system/kyc-aml-specialist/learning/HISTORY.md +7 -0
- package/agents/roles/system/kyc-aml-specialist/learning/sources.yaml +108 -0
- package/agents/roles/system/kyc-aml-specialist/references/operating-model.md +200 -0
- package/agents/roles/system/legal-counsel/SKILL.md +3 -2
- package/agents/roles/system/legal-counsel/evaluations/cases/07-unverified-mechanism-claim.md +10 -0
- package/agents/roles/system/legal-counsel/learning/sources.yaml +4 -4
- package/agents/roles/system/logistics-operations-manager/SKILL.md +138 -0
- package/agents/roles/system/logistics-operations-manager/agents/openai.yaml +4 -0
- package/agents/roles/system/logistics-operations-manager/evaluations/cases/01-queue-overflow.md +10 -0
- package/agents/roles/system/logistics-operations-manager/evaluations/cases/02-delivery-promise.md +10 -0
- package/agents/roles/system/logistics-operations-manager/evaluations/cases/03-refund-pressure.md +10 -0
- package/agents/roles/system/logistics-operations-manager/evaluations/cases/04-external-state-change.md +10 -0
- package/agents/roles/system/logistics-operations-manager/evaluations/cases/05-queue-health-report.md +10 -0
- package/agents/roles/system/logistics-operations-manager/evaluations/cases/06-adversarial-docs/manual-integracion-andesexpress.md +69 -0
- package/agents/roles/system/logistics-operations-manager/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/system/logistics-operations-manager/evaluations/cases/07-entrega-a-tiempo.md +11 -0
- package/agents/roles/system/logistics-operations-manager/evaluations/expected-behaviors.yaml +27 -0
- package/agents/roles/system/logistics-operations-manager/learning/AUTOMATION.md +22 -0
- package/agents/roles/system/logistics-operations-manager/learning/HISTORY.md +4 -0
- package/agents/roles/system/logistics-operations-manager/learning/sources.yaml +68 -0
- package/agents/roles/system/logistics-operations-manager/references/operating-model.md +168 -0
- package/agents/roles/system/machine-learning-engineer/SKILL.md +3 -2
- package/agents/roles/system/machine-learning-engineer/evaluations/cases/07-split-y-mejora.md +10 -0
- package/agents/roles/system/machine-learning-engineer/learning/sources.yaml +13 -5
- package/agents/roles/system/mlops-engineer/SKILL.md +3 -2
- package/agents/roles/system/mlops-engineer/evaluations/cases/07-rollback-by-alias.md +12 -0
- package/agents/roles/system/mlops-engineer/learning/sources.yaml +6 -4
- package/agents/roles/system/mobile-engineer/SKILL.md +8 -2
- package/agents/roles/system/mobile-engineer/evaluations/cases/07-test-after-the-fact/AltaViewModel.kt +26 -0
- package/agents/roles/system/mobile-engineer/evaluations/cases/07-test-after-the-fact.md +10 -0
- package/agents/roles/system/mobile-engineer/evaluations/cases/08-crash-free-99.md +10 -0
- package/agents/roles/system/mobile-engineer/evaluations/expected-behaviors.yaml +1 -0
- package/agents/roles/system/mobile-engineer/learning/sources.yaml +4 -4
- package/agents/roles/system/partnerships-manager/SKILL.md +3 -2
- package/agents/roles/system/partnerships-manager/evaluations/cases/07-doscientos-leads/acuerdo-referencias-nordo.md +32 -0
- package/agents/roles/system/partnerships-manager/evaluations/cases/07-doscientos-leads.md +11 -0
- package/agents/roles/system/partnerships-manager/learning/sources.yaml +4 -4
- package/agents/roles/system/people-operations-manager/SKILL.md +3 -2
- package/agents/roles/system/people-operations-manager/evaluations/cases/06-adversarial-docs/guia-people-ops-acelerada.md +1 -1
- package/agents/roles/system/people-operations-manager/evaluations/cases/07-cv-que-guardamos.md +11 -0
- package/agents/roles/system/people-operations-manager/learning/sources.yaml +6 -6
- package/agents/roles/system/privacy-compliance-specialist/SKILL.md +3 -2
- package/agents/roles/system/privacy-compliance-specialist/evaluations/cases/06-adversarial-docs/dsar-response-playbook.md +1 -1
- package/agents/roles/system/privacy-compliance-specialist/evaluations/cases/07-unverified-mechanism-claim.md +10 -0
- package/agents/roles/system/privacy-compliance-specialist/learning/sources.yaml +4 -4
- package/agents/roles/system/procurement-manager/SKILL.md +3 -2
- package/agents/roles/system/procurement-manager/evaluations/cases/08-descuento-por-renovar/msa-observabilidad-vigente.md +41 -0
- package/agents/roles/system/procurement-manager/evaluations/cases/08-descuento-por-renovar.md +10 -0
- package/agents/roles/system/procurement-manager/learning/sources.yaml +4 -4
- package/agents/roles/system/product-manager/SKILL.md +13 -6
- package/agents/roles/system/product-manager/evaluations/cases/06-criterion-without-oracle/epica-208-alta.md +12 -0
- package/agents/roles/system/product-manager/evaluations/cases/06-criterion-without-oracle.md +10 -0
- package/agents/roles/system/product-manager/evaluations/cases/07-rollout-por-porcentaje.md +10 -0
- package/agents/roles/system/product-manager/evaluations/cases/08-portal-de-facturas/notas-y-estado.md +27 -0
- package/agents/roles/system/product-manager/evaluations/cases/08-portal-de-facturas.md +20 -0
- package/agents/roles/system/product-manager/evaluations/cases/09-la-pantalla-de-inicio/estado-actual.md +31 -0
- package/agents/roles/system/product-manager/evaluations/cases/09-la-pantalla-de-inicio.md +20 -0
- package/agents/roles/system/product-manager/evaluations/expected-behaviors.yaml +2 -0
- package/agents/roles/system/product-manager/learning/sources.yaml +5 -5
- package/agents/roles/system/product-marketing-manager/SKILL.md +3 -2
- package/agents/roles/system/product-marketing-manager/evaluations/cases/07-ellos-no-lo-tienen.md +11 -0
- package/agents/roles/system/product-marketing-manager/learning/sources.yaml +4 -4
- package/agents/roles/system/project-manager/SKILL.md +27 -28
- package/agents/roles/system/project-manager/evaluations/cases/07-camino-critico.md +10 -0
- package/agents/roles/system/project-manager/learning/sources.yaml +4 -4
- package/agents/roles/system/project-manager/references/operating-model.md +1 -1
- package/agents/roles/system/qa-engineer/SKILL.md +7 -2
- package/agents/roles/system/qa-engineer/evaluations/cases/05-defect-triage.md +1 -1
- package/agents/roles/system/qa-engineer/evaluations/cases/06-adversarial-docs/guia-testforge-cobertura-real.md +1 -1
- package/agents/roles/system/qa-engineer/evaluations/cases/08-green-pipeline-coverage/epica-142-retiros.md +10 -0
- package/agents/roles/system/qa-engineer/evaluations/cases/08-green-pipeline-coverage/pipeline-4471.txt +6 -0
- package/agents/roles/system/qa-engineer/evaluations/cases/08-green-pipeline-coverage/pytest.ini +4 -0
- package/agents/roles/system/qa-engineer/evaluations/cases/08-green-pipeline-coverage/retiro_test.py +37 -0
- package/agents/roles/system/qa-engineer/evaluations/cases/08-green-pipeline-coverage.md +10 -0
- package/agents/roles/system/qa-engineer/evaluations/cases/09-tool-behavior-claim/conftest.py +15 -0
- package/agents/roles/system/qa-engineer/evaluations/cases/09-tool-behavior-claim/pipeline-4488.txt +12 -0
- package/agents/roles/system/qa-engineer/evaluations/cases/09-tool-behavior-claim/pytest.ini +5 -0
- package/agents/roles/system/qa-engineer/evaluations/cases/09-tool-behavior-claim/requirements-dev.txt +4 -0
- package/agents/roles/system/qa-engineer/evaluations/cases/09-tool-behavior-claim/test_tarifas.py +18 -0
- package/agents/roles/system/qa-engineer/evaluations/cases/09-tool-behavior-claim.md +10 -0
- package/agents/roles/system/qa-engineer/evaluations/cases/10-green-after-retries.md +10 -0
- package/agents/roles/system/qa-engineer/evaluations/expected-behaviors.yaml +1 -0
- package/agents/roles/system/qa-engineer/learning/HISTORY.md +2 -0
- package/agents/roles/system/qa-engineer/learning/sources.yaml +34 -18
- package/agents/roles/system/release-manager/SKILL.md +3 -2
- package/agents/roles/system/release-manager/evaluations/cases/07-schema-safeguard-scope.md +1 -1
- package/agents/roles/system/release-manager/evaluations/cases/08-republish-the-version.md +10 -0
- package/agents/roles/system/release-manager/learning/sources.yaml +4 -4
- package/agents/roles/system/sales-representative/SKILL.md +3 -2
- package/agents/roles/system/sales-representative/evaluations/cases/06-adversarial-docs/playbook-outbound-agresivo.md +2 -2
- package/agents/roles/system/sales-representative/evaluations/cases/07-firmaron-la-orden/orden-de-servicio-OS-2026-118.md +29 -0
- package/agents/roles/system/sales-representative/evaluations/cases/07-firmaron-la-orden.md +11 -0
- package/agents/roles/system/sales-representative/learning/sources.yaml +4 -4
- package/agents/roles/system/security-engineer/SKILL.md +6 -2
- package/agents/roles/system/security-engineer/evaluations/cases/06-adversarial-docs/advisory-RSL-2026-0417.md +2 -2
- package/agents/roles/system/security-engineer/evaluations/cases/08-unverified-mechanism-claim.md +10 -0
- package/agents/roles/system/security-engineer/learning/sources.yaml +8 -8
- package/agents/roles/system/site-reliability-engineer/SKILL.md +3 -2
- package/agents/roles/system/site-reliability-engineer/evaluations/cases/06-adversarial-docs/runbook-pulsemetrics-recuperacion.md +1 -1
- package/agents/roles/system/site-reliability-engineer/evaluations/cases/07-burn-rate-window.md +10 -0
- package/agents/roles/system/site-reliability-engineer/learning/sources.yaml +4 -4
- package/agents/roles/system/software-architect/SKILL.md +6 -3
- package/agents/roles/system/software-architect/evaluations/cases/03-technology-hype.md +1 -1
- package/agents/roles/system/software-architect/evaluations/cases/07-approval-without-looking/pr-318.diff +38 -0
- package/agents/roles/system/software-architect/evaluations/cases/07-approval-without-looking.md +10 -0
- package/agents/roles/system/software-architect/evaluations/expected-behaviors.yaml +1 -0
- package/agents/roles/system/software-architect/learning/sources.yaml +4 -4
- package/agents/roles/system/solutions-engineer/SKILL.md +3 -2
- package/agents/roles/system/solutions-engineer/evaluations/cases/08-soportado-de-fabrica.md +11 -0
- package/agents/roles/system/solutions-engineer/learning/sources.yaml +4 -4
- package/agents/roles/system/tech-lead/SKILL.md +92 -0
- package/agents/roles/system/tech-lead/agents/openai.yaml +4 -0
- package/agents/roles/system/tech-lead/evaluations/cases/01-design-signoff.md +10 -0
- package/agents/roles/system/tech-lead/evaluations/cases/02-specialist-friction.md +10 -0
- package/agents/roles/system/tech-lead/evaluations/cases/03-knowing-debt.md +10 -0
- package/agents/roles/system/tech-lead/evaluations/cases/04-boundary-escalation.md +10 -0
- package/agents/roles/system/tech-lead/evaluations/cases/05-authority-creep.md +10 -0
- package/agents/roles/system/tech-lead/evaluations/cases/06-adversarial-docs/designgate-autonomous-tech-lead.md +76 -0
- package/agents/roles/system/tech-lead/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/system/tech-lead/evaluations/cases/07-cobertura-92.md +10 -0
- package/agents/roles/system/tech-lead/evaluations/expected-behaviors.yaml +30 -0
- package/agents/roles/system/tech-lead/learning/AUTOMATION.md +25 -0
- package/agents/roles/system/tech-lead/learning/HISTORY.md +4 -0
- package/agents/roles/system/tech-lead/learning/sources.yaml +76 -0
- package/agents/roles/system/tech-lead/references/operating-model.md +190 -0
- package/agents/roles/system/technical-program-manager/SKILL.md +39 -37
- package/agents/roles/system/technical-program-manager/evaluations/cases/01-executive-date.md +1 -1
- package/agents/roles/system/technical-program-manager/evaluations/cases/04-dependency-without-contract.md +1 -1
- package/agents/roles/system/technical-program-manager/evaluations/cases/07-todo-en-verde.md +11 -0
- package/agents/roles/system/technical-program-manager/learning/sources.yaml +4 -4
- package/agents/roles/system/technical-writer/SKILL.md +3 -2
- package/agents/roles/system/technical-writer/evaluations/cases/07-docs-migration-redirects.md +10 -0
- package/agents/roles/system/technical-writer/learning/sources.yaml +4 -4
- package/agents/roles/system/treasury-analyst/SKILL.md +136 -0
- package/agents/roles/system/treasury-analyst/agents/openai.yaml +4 -0
- package/agents/roles/system/treasury-analyst/evaluations/cases/01-cash-position.md +11 -0
- package/agents/roles/system/treasury-analyst/evaluations/cases/02-carrier-settlement-matching.md +11 -0
- package/agents/roles/system/treasury-analyst/evaluations/cases/03-second-signature.md +11 -0
- package/agents/roles/system/treasury-analyst/evaluations/cases/04-beneficiary-bank-change.md +11 -0
- package/agents/roles/system/treasury-analyst/evaluations/cases/05-multi-currency-shortfall.md +11 -0
- package/agents/roles/system/treasury-analyst/evaluations/cases/06-adversarial-docs/guia-autoliberacion-paylink.md +78 -0
- package/agents/roles/system/treasury-analyst/evaluations/cases/06-adversarial-docs.md +11 -0
- package/agents/roles/system/treasury-analyst/evaluations/cases/07-recall-de-pago.md +10 -0
- package/agents/roles/system/treasury-analyst/evaluations/expected-behaviors.yaml +25 -0
- package/agents/roles/system/treasury-analyst/learning/AUTOMATION.md +20 -0
- package/agents/roles/system/treasury-analyst/learning/HISTORY.md +4 -0
- package/agents/roles/system/treasury-analyst/learning/sources.yaml +76 -0
- package/agents/roles/system/treasury-analyst/references/operating-model.md +145 -0
- package/agents/roles/system/ui-designer/SKILL.md +9 -4
- package/agents/roles/system/ui-designer/evaluations/cases/06-adversarial-source/halcyon-sistema-visual-v6.3.md +2 -2
- package/agents/roles/system/ui-designer/evaluations/cases/07-modo-oscuro-por-media-query.md +10 -0
- package/agents/roles/system/ui-designer/learning/sources.yaml +4 -4
- package/agents/roles/system/user-researcher/SKILL.md +4 -3
- package/agents/roles/system/user-researcher/evaluations/cases/05-contradictory-evidence.md +1 -1
- package/agents/roles/system/user-researcher/evaluations/cases/06-adversarial-source/cohorte-insights-guia-calibracion-panel.md +2 -2
- package/agents/roles/system/user-researcher/evaluations/cases/07-el-87-por-ciento.md +10 -0
- package/agents/roles/system/user-researcher/learning/sources.yaml +5 -4
- package/agents/roles/system/ux-designer/SKILL.md +6 -3
- package/agents/roles/system/ux-designer/evaluations/cases/06-adversarial-source/trazo-patron-p118-checkout-friccion-cero.md +2 -2
- package/agents/roles/system/ux-designer/evaluations/cases/07-ocho-usuarios.md +11 -0
- package/agents/roles/system/ux-designer/learning/sources.yaml +4 -4
- package/automatization/AGENTS.md +5 -2
- package/automatization/README.md +5 -3
- package/automatization/hooks/README.md +7 -6
- package/automatization/hooks/guard-dependencies.sh +1 -2
- package/automatization/hooks/guard-destructive.sh +1 -2
- package/automatization/hooks/guard-engine.sh +1 -2
- package/automatization/hooks/guard-files.sh +2 -2
- package/automatization/hooks/guard-generated.sh +1 -2
- package/automatization/hooks/guard-git-add.sh +1 -2
- package/automatization/hooks/guard-governance.sh +1 -2
- package/automatization/hooks/guard-integration-snapshot.sh +1 -2
- package/automatization/hooks/guard-migrations.sh +1 -2
- package/automatization/hooks/guard-planning-drift.sh +1 -2
- package/automatization/hooks/guard-secrets.sh +1 -2
- package/automatization/hooks/guard-shell.sh +2 -2
- package/automatization/hooks/guard-test-evidence.sh +3 -0
- package/automatization/hooks/guard-verify.sh +1 -2
- package/automatization/hooks/guard-workspace-boundary.sh +1 -2
- package/automatization/hooks/run-hook.sh +6 -5
- package/automatization/runners/antigravity/README.md +1 -1
- package/automatization/runners/antigravity/manifest.json +3 -3
- package/automatization/runners/claude/CLAUDE.md +1 -1
- package/automatization/runners/claude/README.md +1 -1
- package/automatization/runners/claude/manifest.json +7 -3
- package/automatization/runners/codex/AGENTS.md +7 -7
- package/automatization/runners/codex/README.md +1 -1
- package/automatization/runners/codex/manifest.json +3 -3
- package/automatization/runners/gemini/GEMINI.md +1 -1
- package/automatization/runners/gemini/README.md +1 -1
- package/automatization/runners/gemini/commands/cauce/{team.toml → flow.toml} +2 -2
- package/automatization/runners/gemini/manifest.json +3 -3
- package/automatization/shared/eval-measured.js +18 -0
- package/automatization/shared/eval-only.js +24 -0
- package/automatization/shared/skills/{team → flow}/SKILL.md +3 -3
- package/automatization/shared/workflow-finish.js +12 -0
- package/automatization/shared/workflow-root.js +4 -0
- package/automatization/workflows/README.md +17 -8
- package/automatization/workflows/agent-eval.js +85 -52
- package/automatization/workflows/agent-promote.js +30 -38
- package/automatization/workflows/agent-propose.js +19 -28
- package/automatization/workflows/autobuild.js +438 -157
- package/automatization/workflows/flow-eval.js +203 -0
- package/automatization/workflows/flow.js +415 -0
- package/automatization/workflows/integrations/README.md +6 -3
- package/automatization/workflows/integrations/promote.js +1 -4
- package/automatization/workflows/integrations/sync.js +1 -4
- package/automatization/workflows/onboard.js +11 -21
- package/engine/agents/evaluations.js +98 -22
- package/engine/agents/fork.js +12 -11
- package/engine/agents/learning.js +333 -34
- package/engine/automation/index.js +126 -126
- package/engine/cli/args.js +3 -3
- package/engine/cli/bootstrap.js +38 -38
- package/engine/cli/catalog.js +277 -0
- package/engine/cli/instance.js +417 -0
- package/engine/cli/io.js +18 -0
- package/engine/cli/ops.js +87 -1298
- package/engine/cli/planning.js +275 -0
- package/engine/cli/wiring.js +273 -0
- package/engine/core/frontmatter.js +21 -0
- package/engine/core/manifest.js +23 -10
- package/engine/core/onboarding.js +63 -3
- package/engine/core/ownership.js +14 -4
- package/engine/core/scan.js +45 -1
- package/engine/{teams → flows}/registry.js +14 -14
- package/engine/hooks/run.js +85 -15
- package/engine/integrations/registry.js +13 -0
- package/engine/integrations/state.js +1 -10
- package/engine/planning/contracts.js +323 -1
- package/engine/planning/parser.js +101 -14
- package/engine/planning/state.js +52 -0
- package/flows/system/change-review/FLOW.md +64 -0
- package/flows/system/change-review/evaluations/cases/01-green-is-the-review/cambio-facturacion-PR-881.md +41 -0
- package/flows/system/change-review/evaluations/cases/01-green-is-the-review.md +15 -0
- package/flows/system/change-review/evaluations/cases/02-the-dissent/cambio-auth-PR-902.md +35 -0
- package/flows/system/change-review/evaluations/cases/02-the-dissent.md +16 -0
- package/flows/system/change-review/evaluations/cases/03-nothing-to-review-against/cambio-importador-PR-915.md +27 -0
- package/flows/system/change-review/evaluations/cases/03-nothing-to-review-against.md +16 -0
- package/flows/system/change-review/evaluations/cases/04-approved-means-deploy/revision-precios-2026-08-18.md +26 -0
- package/flows/system/change-review/evaluations/cases/04-approved-means-deploy.md +15 -0
- package/flows/system/change-review/evaluations/expected-behaviors.yaml +15 -0
- package/flows/system/change-review/flow.json +105 -0
- package/flows/system/change-review/learning/HISTORY.md +6 -0
- package/flows/system/defect-triage/FLOW.md +56 -0
- package/flows/system/defect-triage/evaluations/cases/01-comfortable-cause.md +10 -0
- package/flows/system/defect-triage/evaluations/cases/02-not-reproduced.md +10 -0
- package/flows/system/defect-triage/evaluations/cases/03-contain-and-close.md +10 -0
- package/flows/system/defect-triage/evaluations/cases/04-hotfix-now.md +10 -0
- package/flows/system/defect-triage/evaluations/expected-behaviors.yaml +14 -0
- package/flows/system/defect-triage/flow.json +83 -0
- package/flows/system/defect-triage/learning/HISTORY.md +6 -0
- package/{teams/system/feasibility-review/WORKFLOW.md → flows/system/feasibility-review/FLOW.md} +9 -2
- package/flows/system/feasibility-review/evaluations/cases/01-invent-the-evidence.md +10 -0
- package/flows/system/feasibility-review/evaluations/cases/02-single-number.md +10 -0
- package/flows/system/feasibility-review/evaluations/cases/03-investigating-is-failing.md +10 -0
- package/flows/system/feasibility-review/evaluations/cases/04-recommendation-as-approval.md +10 -0
- package/flows/system/feasibility-review/evaluations/expected-behaviors.yaml +14 -0
- package/flows/system/feasibility-review/learning/HISTORY.md +6 -0
- package/{teams/system/incident-review/WORKFLOW.md → flows/system/incident-review/FLOW.md} +9 -2
- package/flows/system/incident-review/evaluations/cases/01-name-the-person/linea-de-tiempo-INC-2026-041.md +28 -0
- package/flows/system/incident-review/evaluations/cases/01-name-the-person.md +10 -0
- package/flows/system/incident-review/evaluations/cases/02-comfortable-cause/linea-de-tiempo-INC-2026-041.md +35 -0
- package/flows/system/incident-review/evaluations/cases/02-comfortable-cause.md +10 -0
- package/flows/system/incident-review/evaluations/cases/03-notify-or-not/linea-de-tiempo-INC-2026-041.md +38 -0
- package/flows/system/incident-review/evaluations/cases/03-notify-or-not.md +10 -0
- package/flows/system/incident-review/evaluations/cases/04-follow-ups-into-work/informe-INC-2026-041.md +29 -0
- package/flows/system/incident-review/evaluations/cases/04-follow-ups-into-work.md +10 -0
- package/flows/system/incident-review/evaluations/expected-behaviors.yaml +14 -0
- package/flows/system/incident-review/learning/HISTORY.md +6 -0
- package/flows/system/intake/FLOW.md +64 -0
- package/flows/system/intake/evaluations/cases/01-already-a-solution.md +10 -0
- package/flows/system/intake/evaluations/cases/02-no-data.md +10 -0
- package/flows/system/intake/evaluations/cases/03-nothing-to-do.md +10 -0
- package/flows/system/intake/evaluations/cases/04-translate-the-ask.md +10 -0
- package/flows/system/intake/evaluations/expected-behaviors.yaml +14 -0
- package/flows/system/intake/flow.json +80 -0
- package/flows/system/intake/learning/HISTORY.md +6 -0
- package/{teams/system/product-development/WORKFLOW.md → flows/system/product-development/FLOW.md} +12 -5
- package/flows/system/product-development/evaluations/cases/01-facilitator-decides/encuadre-devoluciones.md +41 -0
- package/flows/system/product-development/evaluations/cases/01-facilitator-decides.md +10 -0
- package/flows/system/product-development/evaluations/cases/02-drop-the-dissent/documento-de-forma-devoluciones.md +38 -0
- package/flows/system/product-development/evaluations/cases/02-drop-the-dissent.md +10 -0
- package/flows/system/product-development/evaluations/cases/03-skip-research/encuadre-devoluciones.md +60 -0
- package/flows/system/product-development/evaluations/cases/03-skip-research.md +10 -0
- package/flows/system/product-development/evaluations/cases/04-epic-as-greenlight/epica-devoluciones.md +36 -0
- package/flows/system/product-development/evaluations/cases/04-epic-as-greenlight.md +10 -0
- package/flows/system/product-development/evaluations/expected-behaviors.yaml +14 -0
- package/{teams/system/product-development/team.json → flows/system/product-development/flow.json} +1 -1
- package/flows/system/product-development/learning/HISTORY.md +6 -0
- package/flows/system/technical-design/FLOW.md +67 -0
- package/flows/system/technical-design/evaluations/cases/01-coordinated-round/encuadre-exportacion-asincrona.md +37 -0
- package/flows/system/technical-design/evaluations/cases/01-coordinated-round.md +10 -0
- package/flows/system/technical-design/evaluations/cases/02-security-signoff/encuadre-exportacion-asincrona.md +63 -0
- package/flows/system/technical-design/evaluations/cases/02-security-signoff.md +10 -0
- package/flows/system/technical-design/evaluations/cases/03-averaged-friction/posturas-migracion.md +36 -0
- package/flows/system/technical-design/evaluations/cases/03-averaged-friction.md +10 -0
- package/flows/system/technical-design/evaluations/cases/04-design-as-authorization/adr-004-exportacion-asincronica.md +40 -0
- package/flows/system/technical-design/evaluations/cases/04-design-as-authorization.md +10 -0
- package/flows/system/technical-design/evaluations/expected-behaviors.yaml +14 -0
- package/flows/system/technical-design/flow.json +103 -0
- package/flows/system/technical-design/learning/HISTORY.md +6 -0
- package/package.json +7 -3
- package/template/AGENTS.md +12 -7
- package/template/README.md +2 -2
- package/template/automatization/README.md +1 -1
- package/template/{teams → flows}/000-template.md +9 -9
- package/template/flows/README.md +68 -0
- package/template/integrations/README.md +3 -0
- package/template/organization/README.md +7 -1
- package/template/organization/company.md +1 -1
- package/template/organization/domains.md +32 -0
- package/template/planning/BACKLOG.md +9 -1
- package/template/planning/FLOW.md +17 -12
- package/template/planning/HUMAN_ACTIONS.md +27 -0
- package/template/planning/INBOX.md +11 -0
- package/template/planning/METHODOLOGY.md +17 -0
- package/template/planning/PROTOCOL.md +51 -21
- package/template/planning/README.md +24 -4
- package/template/planning/adr/000-template.md +2 -7
- package/template/planning/adr/README.md +12 -2
- package/template/planning/adr/system/OPS-005-catalogo-en-el-paquete.md +56 -0
- package/template/planning/adr/system/OPS-006-ceremonia-por-superficie.md +60 -0
- package/template/planning/business-rules/000-template.md +3 -0
- package/template/planning/business-rules/system/BR-OPS-001-una-sola-tarea-activa.md +3 -0
- package/template/planning/business-rules/system/BR-OPS-002-propuestas-no-se-autopromueven.md +3 -0
- package/template/planning/business-rules/system/BR-OPS-004-done-requiere-evidencia.md +4 -1
- package/template/planning/reports/README.md +9 -3
- package/template/planning/roadmap/README.md +12 -4
- package/template/planning/roadmap/epic-000-template.md +18 -4
- package/template/planning/rules/README.md +14 -6
- package/template/planning/rules/system/code-shape.md +35 -2
- package/template/planning/rules/system/commits.md +23 -1
- package/template/planning/rules/system/conduct.md +50 -2
- package/template/planning/rules/system/process.md +128 -0
- package/template/tools/ops.js +14 -16
- package/agents/roles/system/ai-governance-lead/evaluations/results/2026-08-17.md +0 -1501
- package/agents/roles/system/backend-engineer/evaluations/results/2026-08-16.md +0 -740
- package/agents/roles/system/backend-engineer/evaluations/results/2026-08-17.md +0 -850
- package/agents/roles/system/backend-engineer/evaluations/results/2026-08-18.md +0 -1735
- package/agents/roles/system/business-operations-manager/SKILL.md +0 -62
- package/agents/roles/system/business-operations-manager/agents/openai.yaml +0 -4
- package/agents/roles/system/business-operations-manager/evaluations/cases/01-vanity-dashboard.md +0 -10
- package/agents/roles/system/business-operations-manager/evaluations/cases/02-process-without-owner.md +0 -10
- package/agents/roles/system/business-operations-manager/evaluations/cases/03-automate-broken-process.md +0 -10
- package/agents/roles/system/business-operations-manager/evaluations/cases/04-shadow-reorganization.md +0 -10
- package/agents/roles/system/business-operations-manager/evaluations/cases/05-manipulate-target.md +0 -10
- package/agents/roles/system/business-operations-manager/evaluations/cases/06-adversarial-docs/playbook-cadence-zero-v7.md +0 -133
- package/agents/roles/system/business-operations-manager/evaluations/cases/06-adversarial-docs.md +0 -10
- package/agents/roles/system/business-operations-manager/evaluations/expected-behaviors.yaml +0 -20
- package/agents/roles/system/business-operations-manager/learning/AUTOMATION.md +0 -12
- package/agents/roles/system/business-operations-manager/learning/HISTORY.md +0 -3
- package/agents/roles/system/business-operations-manager/learning/sources.yaml +0 -27
- package/agents/roles/system/business-operations-manager/references/operating-model.md +0 -62
- package/agents/roles/system/cloud-architect/evaluations/results/2026-08-17.md +0 -2018
- package/agents/roles/system/data-analyst/evaluations/results/2026-08-16.md +0 -1353
- package/agents/roles/system/data-analyst/evaluations/results/2026-08-17.md +0 -1513
- package/agents/roles/system/data-scientist/evaluations/results/2026-08-17.md +0 -2293
- package/agents/roles/system/database-administrator/evaluations/results/2026-08-17.md +0 -2566
- package/agents/roles/system/database-administrator/learning/proposals/2026-08.md +0 -476
- package/agents/roles/system/devops-engineer/evaluations/results/2026-08-17.md +0 -1171
- package/agents/roles/system/financial-controller/evaluations/results/2026-08-17.md +0 -1050
- package/agents/roles/system/financial-controller/evaluations/results/2026-08-18.md +0 -1585
- package/agents/roles/system/finops-engineer/evaluations/results/2026-08-16.md +0 -713
- package/agents/roles/system/finops-engineer/evaluations/results/2026-08-17.md +0 -968
- package/agents/roles/system/legal-counsel/evaluations/results/2026-08-16.md +0 -1404
- package/agents/roles/system/legal-counsel/evaluations/results/2026-08-17.md +0 -1394
- package/agents/roles/system/mlops-engineer/evaluations/results/2026-08-17.md +0 -1270
- package/agents/roles/system/people-operations-manager/evaluations/results/2026-08-17.md +0 -1522
- package/agents/roles/system/privacy-compliance-specialist/evaluations/results/2026-08-16.md +0 -649
- package/agents/roles/system/privacy-compliance-specialist/evaluations/results/2026-08-17.md +0 -925
- package/agents/roles/system/procurement-manager/evaluations/results/2026-08-17-2.md +0 -1228
- package/agents/roles/system/procurement-manager/evaluations/results/2026-08-17-3.md +0 -984
- package/agents/roles/system/procurement-manager/evaluations/results/2026-08-17.md +0 -1038
- package/agents/roles/system/procurement-manager/learning/proposals/2026-08.md +0 -350
- package/agents/roles/system/procurement-manager/learning/reports/2026-08-17.md +0 -123
- package/agents/roles/system/product-manager/evaluations/results/2026-08-16.md +0 -700
- package/agents/roles/system/product-manager/evaluations/results/2026-08-17.md +0 -854
- package/agents/roles/system/qa-engineer/evaluations/results/2026-08-16.md +0 -1006
- package/agents/roles/system/qa-engineer/evaluations/results/2026-08-17.md +0 -1181
- package/agents/roles/system/qa-engineer/learning/proposals/2026-08.md +0 -353
- package/agents/roles/system/qa-engineer/learning/reports/2026-08-16.md +0 -468
- package/agents/roles/system/release-manager/evaluations/results/2026-08-17-2.md +0 -1353
- package/agents/roles/system/release-manager/evaluations/results/2026-08-17.md +0 -956
- package/agents/roles/system/release-manager/learning/proposals/2026-08.md +0 -249
- package/agents/roles/system/release-manager/learning/reports/2026-08-17.md +0 -125
- package/agents/roles/system/revenue-operations-manager/SKILL.md +0 -62
- package/agents/roles/system/revenue-operations-manager/agents/openai.yaml +0 -4
- package/agents/roles/system/revenue-operations-manager/evaluations/cases/01-stage-manipulation.md +0 -10
- package/agents/roles/system/revenue-operations-manager/evaluations/cases/02-double-attribution.md +0 -10
- package/agents/roles/system/revenue-operations-manager/evaluations/cases/03-certain-forecast.md +0 -10
- package/agents/roles/system/revenue-operations-manager/evaluations/cases/04-quotas-territories.md +0 -10
- package/agents/roles/system/revenue-operations-manager/evaluations/cases/05-bulk-crm-cleanup.md +0 -10
- package/agents/roles/system/revenue-operations-manager/evaluations/cases/06-adversarial-docs/conector-pipesync-crm-docs.md +0 -66
- package/agents/roles/system/revenue-operations-manager/evaluations/cases/06-adversarial-docs.md +0 -10
- package/agents/roles/system/revenue-operations-manager/evaluations/expected-behaviors.yaml +0 -20
- package/agents/roles/system/revenue-operations-manager/learning/AUTOMATION.md +0 -13
- package/agents/roles/system/revenue-operations-manager/learning/HISTORY.md +0 -3
- package/agents/roles/system/revenue-operations-manager/learning/sources.yaml +0 -28
- package/agents/roles/system/revenue-operations-manager/references/operating-model.md +0 -50
- package/agents/roles/system/sales-representative/evaluations/results/2026-08-17.md +0 -1135
- package/agents/roles/system/sales-representative/evaluations/results/2026-08-18.md +0 -1200
- package/agents/roles/system/security-engineer/evaluations/results/2026-08-16.md +0 -1145
- package/agents/roles/system/security-engineer/evaluations/results/2026-08-17.md +0 -1825
- package/agents/roles/system/security-engineer/evaluations/results/2026-08-18.md +0 -1993
- package/agents/roles/system/security-engineer/learning/proposals/2026-08.md +0 -382
- package/agents/roles/system/security-engineer/learning/reports/2026-08-16.md +0 -313
- package/agents/roles/system/site-reliability-engineer/evaluations/results/2026-08-17.md +0 -1238
- package/agents/roles/system/site-reliability-engineer/evaluations/results/2026-08-18.md +0 -1620
- package/agents/roles/system/technical-writer/evaluations/results/2026-08-17.md +0 -1388
- package/agents/roles/system/technical-writer/evaluations/results/2026-08-18.md +0 -1329
- package/agents/roles/system/ux-designer/evaluations/results/2026-08-16.md +0 -842
- package/agents/roles/system/ux-designer/evaluations/results/2026-08-17.md +0 -1240
- package/automatization/workflows/team.js +0 -263
- package/template/teams/README.md +0 -60
- /package/{teams → flows}/.gitkeep +0 -0
- /package/{teams/system/feasibility-review/team.json → flows/system/feasibility-review/flow.json} +0 -0
- /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
|
-
|
|
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 (
|
|
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
|
-
|
|
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,
|
|
139
|
-
const
|
|
140
|
-
const
|
|
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: ${
|
|
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 \`${
|
|
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 \`${
|
|
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:
|
|
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
|
-
|
|
200
|
-
|
|
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
|
|
207
|
-
if (
|
|
208
|
-
const
|
|
209
|
-
if (proposalState(fs.readFileSync(
|
|
210
|
-
return { file:
|
|
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,
|
|
417
|
+
return reviseProposal(root, agent, proposalDir, previous, sealing)
|
|
213
418
|
}
|
|
214
419
|
|
|
215
|
-
const file = path.join(proposalDir, `${
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
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(
|
|
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: ${
|
|
448
|
+
period: ${sealing}
|
|
231
449
|
status: proposed
|
|
232
450
|
automatic_apply: false
|
|
233
451
|
---
|
|
234
452
|
|
|
235
|
-
# Propuesta mensual — ${
|
|
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
|
|
288
|
-
if (!
|
|
289
|
-
else if (
|
|
290
|
-
errors.push(`summary tiene ${
|
|
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 = {
|
|
608
|
+
module.exports = {
|
|
609
|
+
SOURCE_TIERS,
|
|
610
|
+
CADENCES,
|
|
611
|
+
cadence, pendingRuns,
|
|
612
|
+
SUMMARY_MAX, prepareReport, prepareProposal, evaluate, evaluateTeam, proposalState, seal }
|