@ingeniomaps/cauce 0.70.0 → 0.71.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 (127) hide show
  1. package/CHANGELOG.md +127 -0
  2. package/agents/README.md +38 -0
  3. package/agents/roles/system/accounting-specialist/learning/HISTORY.md +2 -0
  4. package/agents/roles/system/ai-governance-lead/learning/HISTORY.md +6 -1
  5. package/agents/roles/system/ai-governance-lead/learning/sources.yaml +4 -4
  6. package/agents/roles/system/ai-governance-lead/references/operating-model.md +2 -2
  7. package/agents/roles/system/ai-product-manager/learning/HISTORY.md +4 -1
  8. package/agents/roles/system/ai-product-manager/learning/sources.yaml +2 -2
  9. package/agents/roles/system/ai-product-manager/references/operating-model.md +2 -2
  10. package/agents/roles/system/analytics-engineer/learning/HISTORY.md +4 -1
  11. package/agents/roles/system/analytics-engineer/learning/sources.yaml +2 -2
  12. package/agents/roles/system/analytics-engineer/references/operating-model.md +2 -2
  13. package/agents/roles/system/backend-engineer/learning/HISTORY.md +2 -0
  14. package/agents/roles/system/business-strategist/learning/HISTORY.md +2 -0
  15. package/agents/roles/system/business-strategist/learning/sources.yaml +1 -1
  16. package/agents/roles/system/business-strategist/references/operating-model.md +2 -2
  17. package/agents/roles/system/cloud-architect/learning/HISTORY.md +1 -1
  18. package/agents/roles/system/cloud-architect/learning/sources.yaml +2 -2
  19. package/agents/roles/system/cloud-architect/references/operating-model.md +2 -2
  20. package/agents/roles/system/community-manager/learning/HISTORY.md +4 -1
  21. package/agents/roles/system/community-manager/learning/sources.yaml +2 -2
  22. package/agents/roles/system/community-manager/references/operating-model.md +1 -1
  23. package/agents/roles/system/content-specialist/learning/HISTORY.md +2 -0
  24. package/agents/roles/system/customer-success-manager/learning/HISTORY.md +2 -0
  25. package/agents/roles/system/customer-success-manager/learning/sources.yaml +4 -4
  26. package/agents/roles/system/customer-success-manager/references/operating-model.md +3 -3
  27. package/agents/roles/system/customer-support-specialist/learning/HISTORY.md +2 -0
  28. package/agents/roles/system/customer-support-specialist/learning/sources.yaml +2 -2
  29. package/agents/roles/system/customer-support-specialist/references/operating-model.md +2 -2
  30. package/agents/roles/system/data-analyst/learning/HISTORY.md +2 -0
  31. package/agents/roles/system/data-engineer/learning/HISTORY.md +4 -1
  32. package/agents/roles/system/data-engineer/learning/sources.yaml +3 -3
  33. package/agents/roles/system/data-engineer/references/operating-model.md +2 -2
  34. package/agents/roles/system/data-governance-steward/learning/HISTORY.md +2 -0
  35. package/agents/roles/system/data-scientist/learning/HISTORY.md +4 -1
  36. package/agents/roles/system/data-scientist/learning/sources.yaml +3 -3
  37. package/agents/roles/system/data-scientist/references/operating-model.md +2 -2
  38. package/agents/roles/system/database-administrator/learning/HISTORY.md +1 -1
  39. package/agents/roles/system/database-administrator/learning/sources.yaml +2 -2
  40. package/agents/roles/system/database-administrator/references/operating-model.md +2 -2
  41. package/agents/roles/system/developer-relations-engineer/learning/HISTORY.md +4 -1
  42. package/agents/roles/system/devops-engineer/learning/HISTORY.md +2 -0
  43. package/agents/roles/system/engineering-manager/learning/HISTORY.md +2 -0
  44. package/agents/roles/system/engineering-manager/learning/sources.yaml +1 -1
  45. package/agents/roles/system/engineering-manager/references/operating-model.md +2 -2
  46. package/agents/roles/system/financial-controller/learning/HISTORY.md +2 -0
  47. package/agents/roles/system/financial-controller/learning/sources.yaml +2 -2
  48. package/agents/roles/system/financial-controller/references/operating-model.md +1 -1
  49. package/agents/roles/system/finops-engineer/learning/HISTORY.md +2 -0
  50. package/agents/roles/system/fraud-risk-analyst/learning/HISTORY.md +2 -0
  51. package/agents/roles/system/frontend-engineer/learning/HISTORY.md +2 -0
  52. package/agents/roles/system/growth-marketer/learning/HISTORY.md +2 -0
  53. package/agents/roles/system/growth-marketer/learning/sources.yaml +1 -1
  54. package/agents/roles/system/implementation-manager/learning/HISTORY.md +1 -1
  55. package/agents/roles/system/implementation-manager/learning/sources.yaml +4 -4
  56. package/agents/roles/system/implementation-manager/references/operating-model.md +3 -3
  57. package/agents/roles/system/integrations-engineer/learning/HISTORY.md +2 -0
  58. package/agents/roles/system/kyc-aml-specialist/learning/HISTORY.md +3 -2
  59. package/agents/roles/system/kyc-aml-specialist/learning/sources.yaml +1 -1
  60. package/agents/roles/system/kyc-aml-specialist/references/operating-model.md +1 -1
  61. package/agents/roles/system/legal-counsel/learning/HISTORY.md +6 -1
  62. package/agents/roles/system/legal-counsel/learning/sources.yaml +1 -1
  63. package/agents/roles/system/legal-counsel/references/operating-model.md +1 -1
  64. package/agents/roles/system/logistics-operations-manager/learning/HISTORY.md +2 -0
  65. package/agents/roles/system/machine-learning-engineer/learning/HISTORY.md +4 -1
  66. package/agents/roles/system/machine-learning-engineer/learning/sources.yaml +6 -6
  67. package/agents/roles/system/machine-learning-engineer/references/operating-model.md +3 -3
  68. package/agents/roles/system/mlops-engineer/learning/HISTORY.md +4 -1
  69. package/agents/roles/system/mlops-engineer/learning/sources.yaml +2 -2
  70. package/agents/roles/system/mlops-engineer/references/operating-model.md +2 -2
  71. package/agents/roles/system/mobile-engineer/learning/HISTORY.md +2 -0
  72. package/agents/roles/system/mobile-engineer/learning/sources.yaml +1 -1
  73. package/agents/roles/system/partnerships-manager/learning/HISTORY.md +4 -1
  74. package/agents/roles/system/partnerships-manager/learning/sources.yaml +2 -2
  75. package/agents/roles/system/partnerships-manager/references/operating-model.md +2 -2
  76. package/agents/roles/system/people-operations-manager/learning/HISTORY.md +4 -1
  77. package/agents/roles/system/people-operations-manager/learning/sources.yaml +2 -2
  78. package/agents/roles/system/people-operations-manager/references/operating-model.md +2 -2
  79. package/agents/roles/system/privacy-compliance-specialist/learning/HISTORY.md +2 -0
  80. package/agents/roles/system/privacy-compliance-specialist/learning/sources.yaml +1 -1
  81. package/agents/roles/system/privacy-compliance-specialist/references/operating-model.md +1 -1
  82. package/agents/roles/system/procurement-manager/learning/HISTORY.md +1 -1
  83. package/agents/roles/system/procurement-manager/learning/sources.yaml +2 -2
  84. package/agents/roles/system/procurement-manager/references/operating-model.md +2 -2
  85. package/agents/roles/system/product-manager/learning/HISTORY.md +1 -1
  86. package/agents/roles/system/product-marketing-manager/learning/HISTORY.md +2 -0
  87. package/agents/roles/system/product-marketing-manager/learning/sources.yaml +1 -1
  88. package/agents/roles/system/project-manager/learning/HISTORY.md +4 -1
  89. package/agents/roles/system/project-manager/learning/sources.yaml +1 -1
  90. package/agents/roles/system/project-manager/references/operating-model.md +2 -2
  91. package/agents/roles/system/qa-engineer/learning/HISTORY.md +2 -0
  92. package/agents/roles/system/qa-engineer/learning/sources.yaml +9 -11
  93. package/agents/roles/system/qa-engineer/references/operating-model.md +2 -2
  94. package/agents/roles/system/release-manager/learning/HISTORY.md +1 -1
  95. package/agents/roles/system/sales-representative/learning/HISTORY.md +2 -0
  96. package/agents/roles/system/sales-representative/learning/sources.yaml +2 -2
  97. package/agents/roles/system/sales-representative/references/operating-model.md +1 -1
  98. package/agents/roles/system/security-engineer/learning/HISTORY.md +2 -0
  99. package/agents/roles/system/security-engineer/learning/sources.yaml +1 -1
  100. package/agents/roles/system/security-engineer/references/operating-model.md +1 -1
  101. package/agents/roles/system/site-reliability-engineer/learning/HISTORY.md +2 -0
  102. package/agents/roles/system/software-architect/learning/HISTORY.md +2 -0
  103. package/agents/roles/system/software-architect/learning/sources.yaml +2 -2
  104. package/agents/roles/system/software-architect/references/operating-model.md +1 -1
  105. package/agents/roles/system/solutions-engineer/learning/HISTORY.md +4 -1
  106. package/agents/roles/system/solutions-engineer/learning/sources.yaml +4 -4
  107. package/agents/roles/system/solutions-engineer/references/operating-model.md +2 -2
  108. package/agents/roles/system/tech-lead/learning/HISTORY.md +2 -0
  109. package/agents/roles/system/technical-program-manager/learning/HISTORY.md +4 -1
  110. package/agents/roles/system/technical-program-manager/learning/sources.yaml +2 -2
  111. package/agents/roles/system/technical-program-manager/references/operating-model.md +3 -3
  112. package/agents/roles/system/technical-writer/learning/HISTORY.md +4 -1
  113. package/agents/roles/system/treasury-analyst/learning/HISTORY.md +2 -0
  114. package/agents/roles/system/ui-designer/learning/HISTORY.md +2 -0
  115. package/agents/roles/system/ui-designer/learning/sources.yaml +2 -2
  116. package/agents/roles/system/user-researcher/learning/HISTORY.md +1 -1
  117. package/agents/roles/system/user-researcher/learning/sources.yaml +1 -1
  118. package/agents/roles/system/ux-designer/learning/HISTORY.md +2 -0
  119. package/agents/roles/system/ux-designer/learning/sources.yaml +1 -1
  120. package/agents/roles/system/ux-designer/references/operating-model.md +1 -1
  121. package/automatization/workflows/autobuild.js +38 -20
  122. package/engine/agents/learning-seal.js +36 -5
  123. package/engine/agents/learning-sources.js +46 -2
  124. package/engine/agents/learning.js +13 -1
  125. package/engine/cli/planning.js +29 -0
  126. package/package.json +1 -1
  127. package/template/planning/PROTOCOL.md +14 -0
@@ -1,3 +1,6 @@
1
1
  # Historial de cambios aprobados
2
2
 
3
- Registrar únicamente cambios aprobados, con fecha, evidencia, evaluación y responsable.
3
+ Una fila por propuesta cerrada: cuándo, cuál, qué se decidió —aplicarla o archivarla—, quién lo decidió y qué cambió.
4
+
5
+ | Fecha | Propuesta | Decisión | Aprobó | Cambio aplicado |
6
+ |---|---|---|---|---|
@@ -21,6 +21,6 @@ sources:
21
21
  tier: standard
22
22
  topics: [scrum, empirical, iterative, product-delivery]
23
23
  - name: Government Functional Standard GovS 002
24
- url: https://projectdelivery.gov.uk/govs-002-project-delivery-functional-standard/
24
+ url: https://www.gov.uk/government/publications/project-delivery-functional-standard
25
25
  tier: regulation
26
26
  topics: [governance, assurance, planning, control, benefits, change]
@@ -67,8 +67,8 @@ Revalidar outcome y facts, detener trabajo que no protege valor, reconstruir for
67
67
  ## Fundamento externo
68
68
 
69
69
  - [ISO 21502:2020](https://committee.iso.org/sites/tc258/home/projects/published/iso-21502.html): guía aplicable a cualquier tipo de proyecto y enfoque predictivo, iterativo, adaptativo o híbrido.
70
- - [PMI — PMBOK Guide](https://www.pmi.org/standards/pmbok): principios, dominios, valor, adaptación y accountability; verificar edición vigente.
70
+ - **PMI — PMBOK Guide** (sin enlace: `pmi.org` bloquea): principios, dominios, valor, adaptación y accountability; verificar edición vigente.
71
71
  - [Official Scrum Guide](https://scrumguides.org/download.html): Scrum cuando el contexto justifique ese framework; la versión oficial vigente indicada es noviembre de 2020.
72
- - [Government Functional Standard GovS 002](https://projectdelivery.gov.uk/govs-002-project-delivery-functional-standard/): gobierno, planificación, control, assurance y entrega; aplicar sólo dentro de su alcance o como referencia.
72
+ - [Government Functional Standard GovS 002](https://www.gov.uk/government/publications/project-delivery-functional-standard): gobierno, planificación, control, assurance y entrega; aplicar sólo dentro de su alcance o como referencia.
73
73
 
74
74
  Adaptar el método a la empresa; ninguna fuente sustituye gobierno, políticas ni autoridad reales.
@@ -1,5 +1,7 @@
1
1
  # Historial de aprendizaje
2
2
 
3
+ Una fila por propuesta cerrada: cuándo, cuál, qué se decidió —aplicarla o archivarla—, quién lo decidió y qué cambió.
4
+
3
5
  | Fecha | Propuesta | Decisión | Aprobó | Cambio aplicado |
4
6
  |---|---|---|---|---|
5
7
  | 2026-08-16 | — (hallazgo de `evaluations/results/2026-08-15.md`, caso 06) | Aplicado | Manuel Pinzon | `SKILL.md` § Aprender sin reescribirse: «descartar no es verificar». El contrato enseñaba a rechazar contenido externo y no a verificar su fuente, alcance y versión aplicable, así que el cargo lo descartaba en bloque. Verificado volviendo a correr el caso 06: pasa, con cita en los cuatro comportamientos. |
@@ -13,11 +13,10 @@ sources:
13
13
  url: https://www.istqb.org/certifications/certified-tester-foundation-level-ctfl-v4-0/
14
14
  tier: profession
15
15
  topics: [testing-principles, techniques, risk, defects]
16
- # iso.org devuelve 403 desde el 2026-08-16; la ficha legible es la del IEC Webstore
17
- # —https://webstore.iec.ch/en/publication/90024—. Es ficha de catálogo: el texto de la norma no se
18
- # leyó (informe 2026-08-22, H1 y H2).
19
- - name: ISO IEC 25010 product quality model
20
- url: https://www.iso.org/standard/78176.html
16
+ # Es ficha de catálogo: dice qué norma es y de qué edición, y el texto de la norma no se leyó
17
+ # (informe 2026-08-22, H1 y H2).
18
+ - name: ISO IEC 25010:2023 product quality model
19
+ url: https://webstore.iec.ch/en/publication/90024
21
20
  tier: standard
22
21
  topics: [product-quality-model]
23
22
  - name: OWASP Web Security Testing Guide
@@ -47,20 +46,19 @@ sources:
47
46
  # Edición 2.0 del 2025-09-24, que **reemplaza** a ISO/IEC 40500:2012 — la identidad ISO de
48
47
  # WCAG 2.0—. Por eso el nombre lleva el año: «ISO/IEC 40500» a secas es ambiguo entre dos
49
48
  # documentos que dicen cosas distintas, y un contrato que exige uno no se satisface con el otro.
50
- # iso.org devuelve 403 desde el 2026-08-16, así que lo legible es la ficha del IEC Webstore
51
- # —https://webstore.iec.ch/en/publication/109927—, corroborada contra el anuncio de W3C del
52
- # 2025-10-21. Es ficha de catálogo: el texto de la norma no se leyó (informe 2026-08-22, H1).
49
+ # La edición que declara la ficha está corroborada contra el anuncio de W3C del 2025-10-21. Es ficha
50
+ # de catálogo: el texto de la norma no se leyó (informe 2026-08-22, H1).
53
51
  - name: ISO IEC 40500:2025
54
- url: https://www.iso.org/standard/91029.html
52
+ url: https://webstore.iec.ch/en/publication/109927
55
53
  tier: standard
56
54
  topics: [accessibility, conformance, iso-identity]
57
55
  # Extensión de 25010 para sistemas de IA. La única edición publicada es la de 2023 y su comité
58
- # es SC 42 —no SC 7—; ficha legible en https://webstore.iec.ch/en/publication/86756.
56
+ # es SC 42 —no SC 7—.
59
57
  # El estado de la revisión en curso **no está corroborado en fuente primaria** y no se afirma.
60
58
  # Cuidado al buscarlo: el «ISO/IEC DIS 25059:2022» que aparece en catálogos de revendedores es el
61
59
  # DIS de la primera edición, no el de la revisión (informe 2026-08-22, H2).
62
60
  - name: ISO IEC 25059:2023
63
- url: https://www.iso.org/standard/80655.html
61
+ url: https://webstore.iec.ch/en/publication/86756
64
62
  tier: standard
65
63
  topics: [ai-quality-model, product-quality-model]
66
64
  # Página de la certificación, no el anuncio: el syllabus vigente es v2.0 GA del 2026-04-17, y
@@ -109,12 +109,12 @@ Comunicar hechos, inferencias y desconocidos por separado. La recomendación pue
109
109
  Modelo sintetizado con fuentes revisadas en agosto de 2026:
110
110
 
111
111
  - [ISTQB Certified Tester Foundation Level](https://www.istqb.org/certifications/certified-tester-foundation-level-ctfl-v4-0/): principios, proceso, técnicas, pruebas basadas en riesgo y gestión de defectos.
112
- - [ISO/IEC 25010](https://www.iso.org/standard/78176.html): modelo de calidad de producto para definir cualidades más allá de funcionalidad.
112
+ - [ISO/IEC 25010](https://webstore.iec.ch/en/publication/90024): modelo de calidad de producto para definir cualidades más allá de funcionalidad.
113
113
  - [OWASP Web Security Testing Guide](https://owasp.org/www-project-web-security-testing-guide/): estructura y escenarios para pruebas de seguridad web autorizadas.
114
114
  - [W3C WCAG 2.2](https://www.w3.org/TR/WCAG22/): criterios verificables de accesibilidad para contenido web.
115
115
  - [OWASP Top 10:2025](https://owasp.org/Top10/2025/0x00_2025-Introduction/): modelo de riesgo
116
116
  web vigente, incluidas cadena de suministro y manejo de condiciones excepcionales.
117
- - [ISO/IEC 25059](https://www.iso.org/standard/80655.html): extensión del modelo de calidad
117
+ - [ISO/IEC 25059](https://webstore.iec.ch/en/publication/86756): extensión del modelo de calidad
118
118
  para sistemas basados en IA.
119
119
  - [ISTQB CT-AI v2.0](https://istqb.org/istqb-releases-certified-tester-ai-testing-ct-ai-syllabus-version-2-0/):
120
120
  pruebas de datos, modelo y sistema; dificultad de definir oráculos en sistemas probabilísticos.
@@ -1,6 +1,6 @@
1
1
  # Historial de cambios aprobados
2
2
 
3
- Registrar únicamente cambios aprobados, con fecha, evidencia, evaluación y responsable.
3
+ Una fila por propuesta cerrada: cuándo, cuál, qué se decidió —aplicarla o archivarla—, quién lo decidió y qué cambió.
4
4
 
5
5
  | Fecha | Propuesta | Decisión | Aprobó | Cambio aplicado |
6
6
  |---|---|---|---|---|
@@ -1,4 +1,6 @@
1
1
  # Historial de aprendizaje
2
2
 
3
+ Una fila por propuesta cerrada: cuándo, cuál, qué se decidió —aplicarla o archivarla—, quién lo decidió y qué cambió.
4
+
3
5
  | Fecha | Propuesta | Decisión | Aprobó | Cambio aplicado |
4
6
  |---|---|---|---|---|
@@ -9,7 +9,7 @@ rules:
9
9
  # El contexto de la empresa no es una fuente de la profesión: vive en
10
10
  # organization/roles/sales-representative.md dentro de cada instalación.
11
11
  sources:
12
- - name: ICC Marketing Communications Code
12
+ - name: ICC Advertising and Marketing Communications Code
13
13
  url: https://iccwbo.org/business-solutions/the-icc-advertising-and-marketing-communications-code/
14
14
  tier: standard
15
15
  topics: [honesty, substantiation, identity, direct-marketing]
@@ -22,6 +22,6 @@ sources:
22
22
  tier: regulation
23
23
  topics: [commercial-email, opt-out, identity]
24
24
  - name: OECD Consumer Protection E-commerce
25
- url: https://legalinstruments.oecd.org/en/instruments/OECD-LEGAL-0422
25
+ url: https://legalinstruments.oecd.org/public/doc/422/422.en.pdf
26
26
  tier: standard
27
27
  topics: [fair-practices, disclosures, confirmation, redress]
@@ -74,6 +74,6 @@ Modelo sintetizado con fuentes revisadas en agosto de 2026:
74
74
  - [ICC Advertising and Marketing Communications Code](https://iccwbo.org/business-solutions/the-icc-advertising-and-marketing-communications-code/): identidad, honestidad, sustento, datos y marketing directo responsable.
75
75
  - [UK ICO Direct Marketing Guidance](https://ico.org.uk/for-organisations/direct-marketing-and-privacy-and-electronic-communications/): llamadas, email, mensajes, preferencias y protección de datos; aplicar según jurisdicción.
76
76
  - [FTC CAN-SPAM Compliance Guide](https://www.ftc.gov/business-guidance/resources/can-spam-act-compliance-guide-business): requisitos oficiales estadounidenses para email comercial; aplicar donde corresponda.
77
- - [OECD Recommendation on Consumer Protection in E-commerce](https://legalinstruments.oecd.org/en/instruments/OECD-LEGAL-0422): prácticas comerciales justas, información, confirmación y resolución.
77
+ - [OECD Recommendation on Consumer Protection in E-commerce](https://legalinstruments.oecd.org/public/doc/422/422.en.pdf): prácticas comerciales justas, información, confirmación y resolución.
78
78
 
79
79
  Añadir autoridades, políticas comerciales y reglas sectoriales de cada geografía y canal real.
@@ -1,5 +1,7 @@
1
1
  # Historial de aprendizaje
2
2
 
3
+ Una fila por propuesta cerrada: cuándo, cuál, qué se decidió —aplicarla o archivarla—, quién lo decidió y qué cambió.
4
+
3
5
  | Fecha | Propuesta | Decisión | Aprobó | Cambio aplicado |
4
6
  |---|---|---|---|---|
5
7
  | 2026-08-17 | `learning/proposals/2026-08.md` | Aprobada | Manuel Pinzon | Aditivo en cuatro archivos: nombra «proceso automático con credenciales» como actor —una viñeta en `SKILL.md` § Reglas de construcción, y en `references/operating-model.md` una viñeta de revisión, la sección «Automatización y agentes con credenciales», dos preguntas de control de calidad y una fuente de fundamento—; la conducta prohibida `post_hoc_check_as_containment_for_credentialed_agent` con su caso `07-agent-in-ci.md`; y 4 fuentes nuevas en `sources.yaml` (avisos de Node.js, GitHub Advisory Database, GitHub Changelog, OWASP Agentic Top 10, ésta registrada como marco no leído). Ninguna línea existente reescrita, sin desviaciones. Las 8 recomendaciones operativas del informe quedaron fuera: no son contrato y el cargo no tiene autoridad sobre el pipeline en el que corre. |
@@ -22,7 +22,7 @@ sources:
22
22
  tier: advisory
23
23
  topics: [weaknesses, causes, mitigations]
24
24
  - name: CISA Known Exploited Vulnerabilities
25
- url: https://www.cisa.gov/known-exploited-vulnerabilities-catalog
25
+ url: https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json
26
26
  tier: advisory
27
27
  topics: [known-exploitation, prioritization]
28
28
  - name: Node.js Security Releases
@@ -86,7 +86,7 @@ Modelo sintetizado con fuentes revisadas en agosto de 2026:
86
86
  - [NIST Secure Software Development Framework](https://csrc.nist.gov/pubs/sp/800/218/final): prácticas de preparación, protección, producción y respuesta a vulnerabilidades.
87
87
  - [OWASP ASVS](https://owasp.org/www-project-application-security-verification-standard/): requisitos verificables de seguridad para aplicaciones y servicios.
88
88
  - [MITRE CWE](https://cwe.mitre.org/): taxonomía de debilidades para describir causas y mitigaciones sin confundirlas con vulnerabilidades concretas.
89
- - [CISA Known Exploited Vulnerabilities Catalog](https://www.cisa.gov/known-exploited-vulnerabilities-catalog): evidencia de explotación conocida para priorización basada en riesgo.
89
+ - [CISA Known Exploited Vulnerabilities Catalog](https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json): evidencia de explotación conocida para priorización basada en riesgo.
90
90
  - [OWASP Top 10 for Agentic Applications 2026](https://genai.owasp.org/resource/owasp-top-10-for-agentic-applications-for-2026/): riesgos de sistemas autónomos —uso de herramientas, identidad, ejecución de código y agencia excesiva—. Citado como marco: el documento no fue leído, así que no se atribuye ningún identificador de categoría a un hallazgo.
91
91
 
92
92
  Verificar siempre versiones, avisos oficiales y contexto real de cada empresa.
@@ -1,4 +1,6 @@
1
1
  # Historial de aprendizaje
2
2
 
3
+ Una fila por propuesta cerrada: cuándo, cuál, qué se decidió —aplicarla o archivarla—, quién lo decidió y qué cambió.
4
+
3
5
  | Fecha | Propuesta | Decisión | Aprobó | Cambio aplicado |
4
6
  |---|---|---|---|---|
@@ -1,4 +1,6 @@
1
1
  # Historial de aprendizaje
2
2
 
3
+ Una fila por propuesta cerrada: cuándo, cuál, qué se decidió —aplicarla o archivarla—, quién lo decidió y qué cambió.
4
+
3
5
  | Fecha | Propuesta | Decisión | Aprobó | Cambio aplicado |
4
6
  |---|---|---|---|---|
@@ -9,8 +9,8 @@ rules:
9
9
  # El contexto de la empresa no es una fuente de la profesión: vive en
10
10
  # organization/roles/software-architect.md dentro de cada instalación.
11
11
  sources:
12
- - name: ISO IEC IEEE 42010 architecture description
13
- url: https://www.iso.org/standard/74393.html
12
+ - name: ISO IEC IEEE 42010:2022 architecture description
13
+ url: https://webstore.iec.ch/en/publication/80194
14
14
  tier: standard
15
15
  topics: [architecture-description, stakeholders, viewpoints]
16
16
  - name: C4 model
@@ -71,7 +71,7 @@ Comparar opciones mediante escenarios, restricciones y costo total: construcció
71
71
 
72
72
  Modelo sintetizado con fuentes revisadas en agosto de 2026:
73
73
 
74
- - [ISO/IEC/IEEE 42010](https://www.iso.org/standard/74393.html): conceptos para describir arquitecturas mediante stakeholders, concerns, viewpoints y decisiones.
74
+ - [ISO/IEC/IEEE 42010](https://webstore.iec.ch/en/publication/80194): conceptos para describir arquitecturas mediante stakeholders, concerns, viewpoints y decisiones.
75
75
  - [C4 model](https://c4model.com/): vistas jerárquicas y notación mínima para comunicar contexto, contenedores, componentes y despliegue.
76
76
  - [SEI Architecture Tradeoff Analysis Method](https://www.sei.cmu.edu/library/architecture-tradeoff-analysis-method-collection/): análisis de decisiones a partir de atributos de calidad y trade-offs.
77
77
  - [arc42](https://arc42.org/): estructura pragmática para documentar contexto, restricciones, decisiones, riesgos y operación.
@@ -1,3 +1,6 @@
1
1
  # Historial de aprendizaje
2
2
 
3
- Registrar fecha, propuesta, fuentes, decisión humana, cambios aplicados, evaluaciones y responsable.
3
+ Una fila por propuesta cerrada: cuándo, cuál, qué se decidió —aplicarla o archivarla—, quién lo decidió y qué cambió.
4
+
5
+ | Fecha | Propuesta | Decisión | Aprobó | Cambio aplicado |
6
+ |---|---|---|---|---|
@@ -9,12 +9,12 @@ rules:
9
9
  # El contexto de la empresa no es una fuente de la profesión: vive en
10
10
  # organization/roles/solutions-engineer.md dentro de cada instalación.
11
11
  sources:
12
- - name: ISO IEC IEEE 42010 architecture description
13
- url: https://www.iso.org/standard/74393.html
12
+ - name: ISO IEC IEEE 42010:2022 architecture description
13
+ url: https://webstore.iec.ch/en/publication/80194
14
14
  tier: standard
15
15
  topics: [architecture, concerns, viewpoints, decisions]
16
- - name: ISO IEC 25010 product quality model
17
- url: https://www.iso.org/standard/78176.html
16
+ - name: ISO IEC 25010:2023 product quality model
17
+ url: https://webstore.iec.ch/en/publication/90024
18
18
  tier: standard
19
19
  topics: [quality, requirements, evaluation, acceptance]
20
20
  - name: NIST Cybersecurity Framework 2.0
@@ -54,8 +54,8 @@ Teardown, borrado y handoff:
54
54
 
55
55
  ## Fundamento externo
56
56
 
57
- - [ISO/IEC/IEEE 42010:2022](https://www.iso.org/standard/74393.html): conceptos y estructura para describir arquitectura desde concerns y viewpoints; verificar aplicabilidad y acceso a la edición vigente.
58
- - [ISO/IEC 25010:2023](https://www.iso.org/standard/78176.html): modelo de nueve características para especificar y evaluar calidad de productos ICT.
57
+ - [ISO/IEC/IEEE 42010:2022](https://webstore.iec.ch/en/publication/80194): conceptos y estructura para describir arquitectura desde concerns y viewpoints; verificar aplicabilidad y acceso a la edición vigente.
58
+ - [ISO/IEC 25010:2023](https://webstore.iec.ch/en/publication/90024): modelo de nueve características para especificar y evaluar calidad de productos ICT.
59
59
  - [NIST Cybersecurity Framework 2.0](https://www.nist.gov/publications/nist-cybersecurity-framework-csf-20): lenguaje de outcomes para entender y comunicar riesgo de ciberseguridad; no certifica una solución.
60
60
  - [OpenAPI Specification](https://spec.openapis.org/oas/latest.html): contrato agnóstico al lenguaje para describir APIs HTTP; comprobar la versión soportada por producto y tooling.
61
61
 
@@ -1,4 +1,6 @@
1
1
  # Historial de aprendizaje
2
2
 
3
+ Una fila por propuesta cerrada: cuándo, cuál, qué se decidió —aplicarla o archivarla—, quién lo decidió y qué cambió.
4
+
3
5
  | Fecha | Propuesta | Decisión | Aprobó | Cambio aplicado |
4
6
  |---|---|---|---|---|
@@ -1,3 +1,6 @@
1
1
  # Historial de aprendizaje
2
2
 
3
- Registrar fecha, propuesta, fuentes/versiones, evidencia, decisión humana, cambios, evaluaciones y responsable.
3
+ Una fila por propuesta cerrada: cuándo, cuál, qué se decidió —aplicarla o archivarla—, quién lo decidió y qué cambió.
4
+
5
+ | Fecha | Propuesta | Decisión | Aprobó | Cambio aplicado |
6
+ |---|---|---|---|---|
@@ -9,7 +9,7 @@ rules:
9
9
  # El contexto de la empresa no es una fuente de la profesión: vive en
10
10
  # organization/roles/technical-program-manager.md dentro de cada instalación.
11
11
  sources:
12
- - {name: ISO 21503 programme management, url: "https://www.iso.org/cms/%20render/live/en/sites/isoorg/contents/data/standard/08/28/82868.html", tier: standard, topics: [programme, roles, responsibilities, practices]}
12
+ - {name: ISO 21503 programme management, url: "https://committee.iso.org/standard/82868.html", tier: standard, topics: [programme, roles, responsibilities, practices]}
13
13
  - {name: ISO 21502 project management, url: "https://committee.iso.org/sites/tc258/home/projects/published/iso-21502.html", tier: standard, topics: [project, adaptive, predictive, hybrid]}
14
- - {name: ISO 31000 risk management, url: "https://www.iso.org/standard/65694.html", tier: standard, topics: [risk, principles, process]}
14
+ - {name: ISO 31000 risk management, url: "https://committee.iso.org/standard/65694.html", tier: standard, topics: [risk, principles, process]}
15
15
  - {name: PMI standards and Program Management Fifth Edition, url: "https://www.pmi.org/standards/", tier: profession, topics: [program, benefits, collaboration, principles]}
@@ -33,9 +33,9 @@ Verificar producto/capability, integración, datos, seguridad, privacidad, perfo
33
33
 
34
34
  ## Fundamento externo
35
35
 
36
- - [ISO 21503:2022](https://www.iso.org/cms/%20render/live/en/sites/isoorg/contents/data/standard/08/28/82868.html): guía vigente y transversal para conceptos, roles, responsabilidades y prácticas de gestión de programas.
36
+ - [ISO 21503:2022](https://committee.iso.org/standard/82868.html): guía vigente y transversal para conceptos, roles, responsabilidades y prácticas de gestión de programas.
37
37
  - [ISO 21502:2020](https://committee.iso.org/sites/tc258/home/projects/published/iso-21502.html): guía adaptable a enfoques predictivos, iterativos, incrementales, adaptativos o híbridos para componentes/proyectos.
38
- - [ISO 31000:2018](https://www.iso.org/standard/65694.html): principios y proceso de gestión de riesgo; confirmada en 2023 aunque ISO indica futura revisión.
39
- - [PMI Standard for Program Management — Fifth Edition](https://www.pmi.org/standards/): estándar 2024 basado en principios, beneficios y colaboración entre componentes.
38
+ - [ISO 31000:2018](https://committee.iso.org/standard/65694.html): principios y proceso de gestión de riesgo; confirmada en 2023 aunque ISO indica futura revisión.
39
+ - **PMI Standard for Program Management — Fifth Edition** (sin enlace: `pmi.org` bloquea): estándar 2024 basado en principios, beneficios y colaboración entre componentes.
40
40
 
41
41
  Estas fuentes orientan el sistema de coordinación; la gobernanza, autoridad, delivery approach y contexto de cada empresa prevalecen.
@@ -1,3 +1,6 @@
1
1
  # Historial de cambios aprobados
2
2
 
3
- Registrar únicamente cambios aprobados, con fecha, evidencia, evaluación y responsable.
3
+ Una fila por propuesta cerrada: cuándo, cuál, qué se decidió —aplicarla o archivarla—, quién lo decidió y qué cambió.
4
+
5
+ | Fecha | Propuesta | Decisión | Aprobó | Cambio aplicado |
6
+ |---|---|---|---|---|
@@ -1,4 +1,6 @@
1
1
  # Historial de aprendizaje
2
2
 
3
+ Una fila por propuesta cerrada: cuándo, cuál, qué se decidió —aplicarla o archivarla—, quién lo decidió y qué cambió.
4
+
3
5
  | Fecha | Propuesta | Decisión | Aprobó | Cambio aplicado |
4
6
  |---|---|---|---|---|
@@ -1,5 +1,7 @@
1
1
  # Historial de aprendizaje
2
2
 
3
+ Una fila por propuesta cerrada: cuándo, cuál, qué se decidió —aplicarla o archivarla—, quién lo decidió y qué cambió.
4
+
3
5
  | Fecha | Propuesta | Decisión | Aprobó | Cambio aplicado |
4
6
  |---|---|---|---|---|
5
7
  | 2026-08-30 | `agents/roles/system/ui-designer/learning/proposals/2026-08.md` | Aprobada | Manuel Pinzon | `agents/roles/system/ui-designer/SKILL.md` |
@@ -14,11 +14,11 @@ sources:
14
14
  topics: [contrast, focus, targets, responsive, accessibility]
15
15
  - name: Apple Human Interface Guidelines
16
16
  url: https://developer.apple.com/design/human-interface-guidelines/
17
- tier: platform
17
+ tier: standard
18
18
  topics: [layout, typography, color, components, accessibility]
19
19
  - name: Material Design
20
20
  url: https://m3.material.io/
21
- tier: platform
21
+ tier: standard
22
22
  topics: [tokens, components, color, typography, motion]
23
23
  - name: GOV.UK Design System
24
24
  url: https://design-system.service.gov.uk/
@@ -1,6 +1,6 @@
1
1
  # Historial de aprendizaje
2
2
 
3
- Registrar únicamente cambios aprobados y aplicados al agente.
3
+ Una fila por propuesta cerrada: cuándo, cuál, qué se decidió —aplicarla o archivarla—, quién lo decidió y qué cambió.
4
4
 
5
5
  | Fecha | Propuesta | Decisión | Aprobó | Cambio aplicado |
6
6
  |---|---|---|---|---|
@@ -17,7 +17,7 @@ sources:
17
17
  tier: profession
18
18
  topics: [methods, usability, synthesis]
19
19
  - name: UK Government Social Research Ethics
20
- url: https://www.gov.uk/government/publications/government-social-research-framework-for-research-ethics
20
+ url: https://www.gov.uk/government/publications/ethical-assurance-guidance-for-social-research-in-government
21
21
  tier: regulation
22
22
  topics: [ethics, harm, consent]
23
23
  - name: Interaction Design Foundation
@@ -1,4 +1,6 @@
1
1
  # Historial de aprendizaje
2
2
 
3
+ Una fila por propuesta cerrada: cuándo, cuál, qué se decidió —aplicarla o archivarla—, quién lo decidió y qué cambió.
4
+
3
5
  | Fecha | Propuesta | Decisión | Aprobó | Cambio aplicado |
4
6
  |---|---|---|---|---|
@@ -13,7 +13,7 @@ sources:
13
13
  tier: standard
14
14
  topics: [accessibility, wcag, cognitive-accessibility]
15
15
  - name: ISO Human-centred Design
16
- url: https://www.iso.org/standard/77520.html
16
+ url: https://committee.iso.org/standard/77520.html
17
17
  tier: standard
18
18
  topics: [human-centred-design, lifecycle]
19
19
  - name: Nielsen Norman Group
@@ -79,7 +79,7 @@ Diseñar para que la experiencia sea perceptible, operable, comprensible y robus
79
79
 
80
80
  Modelo sintetizado con fuentes revisadas en agosto de 2026:
81
81
 
82
- - [ISO 9241-210:2019](https://www.iso.org/standard/77520.html): integrar diseño centrado en las personas durante el ciclo de vida de sistemas interactivos.
82
+ - [ISO 9241-210:2019](https://committee.iso.org/standard/77520.html): integrar diseño centrado en las personas durante el ciclo de vida de sistemas interactivos.
83
83
  - [WCAG 2.2](https://www.w3.org/TR/WCAG22/): criterios comprobables para contenido perceptible, operable, comprensible y robusto.
84
84
  - [Nielsen Norman Group: heurísticas de usabilidad](https://media.nngroup.com/media/articles/attachments/Heuristic_Summary1_A4_compressed.pdf): principios para inspeccionar feedback, control, consistencia, prevención y recuperación.
85
85
  - [GOV.UK Design System Patterns](https://design-system.service.gov.uk/patterns/): patrones documentados para tareas concretas, adaptables al contexto.
@@ -40,8 +40,12 @@ const ROADMAP = `${P}/roadmap`
40
40
  // Estado de planning tal como lo emite `ops context --json`; ningún modelo parsea BACKLOG ni WIP.
41
41
  const CONTEXT = {
42
42
  type: 'object', additionalProperties: false,
43
- required: ['blocked', 'hasTask', 'wipActive', 'queued', 'cast'],
43
+ required: ['blocked', 'hasTask', 'wipActive', 'queued', 'cast', 'readOk'],
44
44
  properties: {
45
+ // Si el comando salió con error no hay estado que reportar, y `hasTask: false, queued: 0` es
46
+ // exactamente lo que un modelo completa cuando no tiene qué poner. Sin este campo esa invención se
47
+ // lee igual que una cola terminada, y Pick la toma como permiso para promover.
48
+ readOk: { type: 'boolean' },
45
49
  blocked: { type: 'string' }, hasTask: { type: 'boolean' }, wipActive: { type: 'boolean' },
46
50
  queued: { type: 'integer' }, slug: { type: 'string' }, hito: { type: 'string' },
47
51
  service: { type: 'string' }, acceptance: { type: 'string' }, epic: { type: 'string' },
@@ -73,10 +77,6 @@ const CLAIM = {
73
77
  type: 'object', additionalProperties: false, required: ['claimed'],
74
78
  properties: { claimed: { type: 'boolean' }, details: { type: 'string' } },
75
79
  }
76
- const EXPANSION = {
77
- type: 'object', additionalProperties: false, required: ['expanded'],
78
- properties: { expanded: { type: 'boolean' }, hito: { type: 'string' }, reason: { type: 'string' } },
79
- }
80
80
  const READY = {
81
81
  type: 'object', additionalProperties: false, required: ['ready', 'needsHuman'],
82
82
  properties: {
@@ -229,8 +229,16 @@ const CLASSIFICATION = {
229
229
 
230
230
  const CONTRACT = {
231
231
  type: 'object', additionalProperties: false,
232
- required: ['project', 'workspaceRoots', 'maxTaskHours', 'commitPerTask', 'humanCheckpoint', 'contracts'],
232
+ required: ['project', 'workspaceRoots', 'maxTaskHours', 'commitPerTask', 'humanCheckpoint', 'contracts',
233
+ 'rootOk'],
233
234
  properties: {
235
+ // `ROOT` viaja escrito en el workflow y es relativo al cwd de los agentes: si la sesión abrió en otra
236
+ // carpeta, todas las rutas resuelven a `<raíz>/<raíz>/…` y ninguna existe. Nada lo comprobaba, y el
237
+ // recorrido gastaba Triage entero sobre archivos ausentes antes de parar más abajo por otra causa,
238
+ // nombrando el planning en vez de la raíz de la que ese planning cuelga.
239
+ //
240
+ // Se pregunta acá porque acá ya se leen los cuatro archivos: cuesta un campo y ningún agente más.
241
+ rootOk: { type: 'boolean' },
234
242
  project: { type: 'string' }, workspaceRoots: { type: 'array', minItems: 1, items: { type: 'string' } },
235
243
  // La puerta que el proyecto declara, si la declara. Viaja con la raíz porque es de la base de código
236
244
  // y no del runner: un monorepo tiene una por servicio, y uno solo tiene una sola.
@@ -289,7 +297,9 @@ phase('Triage')
289
297
  // subagente como «Límites del proyecto» eran sólo los genéricos del toolkit.
290
298
  const contract = await agent(
291
299
  `${BASE}\n\nLeé ${ROOT}/AGENTS.md, ${ORG}/workspace.md, ${CONFIG} y ${P}/PROTOCOL.md una sola vez y no ` +
292
- `leas nada más. Reportá los ` +
300
+ `leas nada más. Poné rootOk en true sólo si los cuatro existieron y los pudiste leer; si alguno no ` +
301
+ `estaba, rootOk en false y el resto en sus valores vacíos, sin deducirlos de otra fuente. ` +
302
+ `Reportá los ` +
293
303
  `valores de configuración textualmente: project, workspaceRoots como entradas "nombre → ruta", ` +
294
304
  `runner.maxTaskHours, runner.commitPerTask y runner.humanCheckpointBetweenMilestones como humanCheckpoint. ` +
295
305
  `En gates poné una entrada "ruta → comando" por cada workspaceRoot que declare \`verify\`, y ninguna por ` +
@@ -301,6 +311,12 @@ const contract = await agent(
301
311
  { schema: CONTRACT, label: 'contract-digest' },
302
312
  )
303
313
  if (!contract) return stop('contract-unavailable', `no se pudo leer ${CONFIG} ni ${P}/PROTOCOL.md`)
314
+ // Falla acá y nombrando la raíz, que es lo que hace falta para arreglarlo: parar más abajo mandaba a
315
+ // revisar el planning, y el planning está bien — lo que no existe es la carpeta de la que cuelga.
316
+ if (!contract.rootOk) {
317
+ return stop('root-unreadable', `${ROOT} no se pudo leer entero. Es una ruta relativa a la carpeta `
318
+ + `donde se abre la herramienta: comprobá desde dónde estás corriendo el recorrido.`)
319
+ }
304
320
 
305
321
  const bounds = contract.boundaries || []
306
322
  const limits = bounds.length ? ` Límites del proyecto: ${bounds.join('; ')}.` : ''
@@ -329,12 +345,17 @@ const readContext = () => read(
329
345
  `de task.tier; copiá slug, ` +
330
346
  `hito, service, acceptance, ` +
331
347
  `epic y cast de task, y epicContext de epic.context —vacío si no hay épica—. El comando es la fuente de ` +
332
- `verdad: no abras archivos de planning para completarlo.`,
348
+ `verdad: no abras archivos de planning para completarlo. Poné readOk en true sólo si el comando salió ` +
349
+ `con código 0 y devolvió JSON; si falló, readOk en false y el resto en sus valores vacíos, sin ` +
350
+ `deducir el estado de ninguna otra fuente.`,
333
351
  { schema: CONTEXT, label: 'planning-context' },
334
352
  )
335
353
 
336
354
  let planning = await readContext()
337
355
  if (!planning) return stop('context-unavailable', `no se pudo leer el estado de ${P}`)
356
+ // Que el agente conteste no significa que haya leído: el schema se completa igual con ceros. Parar acá
357
+ // cuesta una corrida; seguir sobre una lectura fallida escribe en el BACKLOG, y eso no se revierte solo.
358
+ if (!planning.readOk) return stop('context-unavailable', `${P} no se pudo leer; revisá la ruta y el cwd`)
338
359
  if (planning.blocked) return stop('awaiting-human-review', `${GATE} tiene un checkpoint humano sin resolver`)
339
360
 
340
361
  let currentMilestone = planning.wipActive ? planning.hito : ''
@@ -350,18 +371,15 @@ const classified = new Set()
350
371
 
351
372
  while (rounds++ < MAX_TASKS) {
352
373
  phase('Pick')
353
- if (!planning.hasTask && !planning.queued) {
354
- const expansion = await write(
355
- `Leé ${ROADMAP}. Expandí sólo la próxima épica abierta y aprobada en un hito nuevo de ${BACKLOG}, ` +
356
- `conservando el slug de cada historia, sus referencias a criterios y su servicio. Nunca promuevas ` +
357
- `${P}/INBOX.md. Reportá si escribiste algo.`,
358
- { schema: EXPANSION },
359
- )
360
- if (!expansion) return stop('agent-unavailable', 'Pick no devolvió resultado')
361
- if (!expansion.expanded) break
362
- planning = await readContext()
363
- if (!planning) return stop('context-unavailable', `no se pudo releer el estado de ${P}`)
364
- }
374
+ // Sin tarea y con la cola vacía, la corrida termina. **No expande la próxima épica**, y eso no es una
375
+ // limitación sino la regla: el roadmap llama `open` a «candidata editable que aún no fue promovida al
376
+ // backlog», así que pegarla en la cola es promoverla — y BR-OPS-002 deja una propuesta fuera de la cola
377
+ // hasta que la apruebe una persona. El prompt que hacía esto pedía «la próxima épica abierta y
378
+ // aprobada», y «aprobada» no correspondía a ningún dato: una épica declara `epic`, `title`, `status` y
379
+ // `service`, y ninguno registra una aprobación.
380
+ //
381
+ // `context` nombra la que sigue, igual que nombra una recurrencia vencida y por el mismo motivo: la
382
+ // máquina calcula y la persona encola.
365
383
  if (!planning.hasTask || (currentMilestone && planning.hito !== currentMilestone)) break
366
384
  const task = {
367
385
  id: planning.slug, hito: planning.hito, service: planning.service,
@@ -12,6 +12,8 @@ const path = require('node:path')
12
12
  const { atomicWrite } = require('../core/files')
13
13
  const { isoDate, proposalFiles, proposalState, assertWritable, lastOfPeriod } = require('./learning-files')
14
14
  const { section } = require('../planning/parser')
15
+ // La misma identidad con la que se reclama una tarea: quién es la persona, no qué runner corre.
16
+ const { owner } = require('../planning/claims')
15
17
 
16
18
  // El cuerpo sin sellar, en los dos estados que produce el ciclo: «pendiente» lo escribe el molde y
17
19
  // «aprobada» la firma. Lo lee la guarda de más abajo y lo reemplaza el sello, así que vive una vez.
@@ -102,22 +104,51 @@ function archive(root, agent, period = '', kind = 'agent') {
102
104
  + 'Archivar es para lo que se miró y no cambia nada.',
103
105
  )
104
106
  }
107
+ // Quién archivó, que es la mitad que faltaba. Sellar saca el responsable del documento —lo escribió la
108
+ // firma— y archivar no pasa por firma, así que sale de la identidad de quien corre el comando: la misma
109
+ // que `claim` usa para decir de quién es una tarea. Sin esto la propuesta quedaba en «por definir» y no
110
+ // había forma de distinguir una decisión de un olvido.
111
+ const responsible = owner(root) || 'sin identificar'
105
112
  atomicWrite(file, text
106
113
  .replace(/^status:\s*\S+\s*$/m, 'status: archived')
107
114
  .replace(/^-[ \t]*Estado:[ \t]*pendiente[ \t]*$/mi, '- Estado: archivada')
115
+ .replace(/^-[ \t]*Responsable:[ \t]*por definir[ \t]*$/mi, `- Responsable: ${responsible}`)
108
116
  .replace(/^-[ \t]*Fecha:[ \t]*por definir[ \t]*$/mi, `- Fecha: ${isoDate(new Date())}`))
117
+ // La fila va para los dos tipos, y no sólo para los recorridos como en `seal`: allá los cargos los
118
+ // registra `agent-promote` al aplicar, y archivar no pasa por ningún workflow que lo haga.
119
+ // La raíz del cargo, que es `<cargo>/learning/proposals/<archivo>` sin sus tres últimos tramos:
120
+ // `appendHistory` agrega `learning/` por su cuenta.
121
+ //
122
+ // La celda del cambio lleva el criterio y no queda vacía. Es el único que este comando admite —archivar
123
+ // *es* decidir que no cambia nada— así que decirlo evita que la fila se lea como un registro a medias.
124
+ // Archivar por otra razón, como posponer, necesitaría un campo que hoy no existe.
125
+ appendHistory(path.dirname(path.dirname(path.dirname(file))), file, responsible,
126
+ 'Se miró y no cambia nada.', 'archivada')
109
127
  return { file, already: false }
110
128
  }
111
129
 
112
- // Una fila por propuesta aplicada. El cambio va en una línea: el documento entero está a un enlace, y
113
- // una tabla que lo repite entero deja de leerse.
114
- function appendHistory(target, file, responsible, change) {
130
+ // Una fila por propuesta cerrada, cualquiera sea el destino. El cambio va en una línea: el documento
131
+ // entero está a un enlace, y una tabla que lo repite entero deja de leerse.
132
+ //
133
+ // La decisión es un parámetro y no la constante `aplicada` porque la columna de la tabla se llama
134
+ // «Decisión» y hay dos: aplicar y archivar. Archivar no dejaba fila, así que una propuesta mirada y
135
+ // descartada era indistinguible de una que nadie miró — y eso lo pagaban los informes siguientes, que
136
+ // gastaban su recomendación explicando el estado en vez de su profesión.
137
+ const HISTORY_HEADER = '| Fecha | Propuesta | Decisión | Aprobó | Cambio aplicado |\n|---|---|---|---|---|\n'
138
+
139
+ function appendHistory(target, file, responsible, change, decision = 'aplicada') {
115
140
  const history = path.join(target, 'learning', 'HISTORY.md')
116
141
  if (!fs.existsSync(history)) return
142
+ const previous = fs.readFileSync(history, 'utf8')
117
143
  const line = change.split('\n').map((one) => one.trim()).filter(Boolean)[0] || ''
118
- const row = `| ${isoDate(new Date())} | \`${path.basename(file)}\` | aplicada | ${responsible} `
144
+ const row = `| ${isoDate(new Date())} | \`${path.basename(file)}\` | ${decision} | ${responsible} `
119
145
  + `| ${line.slice(0, 160)} |\n`
120
- fs.appendFileSync(history, `${fs.readFileSync(history, 'utf8').endsWith('\n') ? '' : '\n'}${row}`)
146
+ // Dieciséis de los cincuenta y tres cargos tienen el archivo sin la tabla, sólo con su párrafo de
147
+ // encabezado, y la fila quedaba pegada ahí: en markdown eso no es una tabla sino texto con barras, y
148
+ // nadie lo veía porque el archivo se lee dos veces al año. Se agrega la cabecera antes de la primera
149
+ // fila en vez de exigir que ya esté, que es pedirle a cada cargo que se acuerde.
150
+ const cabecera = /^\|\s*Fecha\s*\|/m.test(previous) ? '' : `\n${HISTORY_HEADER}`
151
+ fs.appendFileSync(history, `${previous.endsWith('\n') ? '' : '\n'}${cabecera}${row}`)
121
152
  }
122
153
 
123
154
  module.exports = { seal, archive }