@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.
- package/CHANGELOG.md +127 -0
- package/agents/README.md +38 -0
- package/agents/roles/system/accounting-specialist/learning/HISTORY.md +2 -0
- package/agents/roles/system/ai-governance-lead/learning/HISTORY.md +6 -1
- package/agents/roles/system/ai-governance-lead/learning/sources.yaml +4 -4
- package/agents/roles/system/ai-governance-lead/references/operating-model.md +2 -2
- package/agents/roles/system/ai-product-manager/learning/HISTORY.md +4 -1
- package/agents/roles/system/ai-product-manager/learning/sources.yaml +2 -2
- package/agents/roles/system/ai-product-manager/references/operating-model.md +2 -2
- package/agents/roles/system/analytics-engineer/learning/HISTORY.md +4 -1
- package/agents/roles/system/analytics-engineer/learning/sources.yaml +2 -2
- package/agents/roles/system/analytics-engineer/references/operating-model.md +2 -2
- package/agents/roles/system/backend-engineer/learning/HISTORY.md +2 -0
- package/agents/roles/system/business-strategist/learning/HISTORY.md +2 -0
- package/agents/roles/system/business-strategist/learning/sources.yaml +1 -1
- package/agents/roles/system/business-strategist/references/operating-model.md +2 -2
- package/agents/roles/system/cloud-architect/learning/HISTORY.md +1 -1
- package/agents/roles/system/cloud-architect/learning/sources.yaml +2 -2
- package/agents/roles/system/cloud-architect/references/operating-model.md +2 -2
- package/agents/roles/system/community-manager/learning/HISTORY.md +4 -1
- package/agents/roles/system/community-manager/learning/sources.yaml +2 -2
- package/agents/roles/system/community-manager/references/operating-model.md +1 -1
- package/agents/roles/system/content-specialist/learning/HISTORY.md +2 -0
- package/agents/roles/system/customer-success-manager/learning/HISTORY.md +2 -0
- package/agents/roles/system/customer-success-manager/learning/sources.yaml +4 -4
- package/agents/roles/system/customer-success-manager/references/operating-model.md +3 -3
- package/agents/roles/system/customer-support-specialist/learning/HISTORY.md +2 -0
- package/agents/roles/system/customer-support-specialist/learning/sources.yaml +2 -2
- package/agents/roles/system/customer-support-specialist/references/operating-model.md +2 -2
- package/agents/roles/system/data-analyst/learning/HISTORY.md +2 -0
- package/agents/roles/system/data-engineer/learning/HISTORY.md +4 -1
- package/agents/roles/system/data-engineer/learning/sources.yaml +3 -3
- package/agents/roles/system/data-engineer/references/operating-model.md +2 -2
- package/agents/roles/system/data-governance-steward/learning/HISTORY.md +2 -0
- package/agents/roles/system/data-scientist/learning/HISTORY.md +4 -1
- package/agents/roles/system/data-scientist/learning/sources.yaml +3 -3
- package/agents/roles/system/data-scientist/references/operating-model.md +2 -2
- package/agents/roles/system/database-administrator/learning/HISTORY.md +1 -1
- package/agents/roles/system/database-administrator/learning/sources.yaml +2 -2
- package/agents/roles/system/database-administrator/references/operating-model.md +2 -2
- package/agents/roles/system/developer-relations-engineer/learning/HISTORY.md +4 -1
- package/agents/roles/system/devops-engineer/learning/HISTORY.md +2 -0
- package/agents/roles/system/engineering-manager/learning/HISTORY.md +2 -0
- package/agents/roles/system/engineering-manager/learning/sources.yaml +1 -1
- package/agents/roles/system/engineering-manager/references/operating-model.md +2 -2
- package/agents/roles/system/financial-controller/learning/HISTORY.md +2 -0
- package/agents/roles/system/financial-controller/learning/sources.yaml +2 -2
- package/agents/roles/system/financial-controller/references/operating-model.md +1 -1
- package/agents/roles/system/finops-engineer/learning/HISTORY.md +2 -0
- package/agents/roles/system/fraud-risk-analyst/learning/HISTORY.md +2 -0
- package/agents/roles/system/frontend-engineer/learning/HISTORY.md +2 -0
- package/agents/roles/system/growth-marketer/learning/HISTORY.md +2 -0
- package/agents/roles/system/growth-marketer/learning/sources.yaml +1 -1
- package/agents/roles/system/implementation-manager/learning/HISTORY.md +1 -1
- package/agents/roles/system/implementation-manager/learning/sources.yaml +4 -4
- package/agents/roles/system/implementation-manager/references/operating-model.md +3 -3
- package/agents/roles/system/integrations-engineer/learning/HISTORY.md +2 -0
- package/agents/roles/system/kyc-aml-specialist/learning/HISTORY.md +3 -2
- package/agents/roles/system/kyc-aml-specialist/learning/sources.yaml +1 -1
- package/agents/roles/system/kyc-aml-specialist/references/operating-model.md +1 -1
- package/agents/roles/system/legal-counsel/learning/HISTORY.md +6 -1
- package/agents/roles/system/legal-counsel/learning/sources.yaml +1 -1
- package/agents/roles/system/legal-counsel/references/operating-model.md +1 -1
- package/agents/roles/system/logistics-operations-manager/learning/HISTORY.md +2 -0
- package/agents/roles/system/machine-learning-engineer/learning/HISTORY.md +4 -1
- package/agents/roles/system/machine-learning-engineer/learning/sources.yaml +6 -6
- package/agents/roles/system/machine-learning-engineer/references/operating-model.md +3 -3
- package/agents/roles/system/mlops-engineer/learning/HISTORY.md +4 -1
- package/agents/roles/system/mlops-engineer/learning/sources.yaml +2 -2
- package/agents/roles/system/mlops-engineer/references/operating-model.md +2 -2
- package/agents/roles/system/mobile-engineer/learning/HISTORY.md +2 -0
- package/agents/roles/system/mobile-engineer/learning/sources.yaml +1 -1
- package/agents/roles/system/partnerships-manager/learning/HISTORY.md +4 -1
- package/agents/roles/system/partnerships-manager/learning/sources.yaml +2 -2
- package/agents/roles/system/partnerships-manager/references/operating-model.md +2 -2
- package/agents/roles/system/people-operations-manager/learning/HISTORY.md +4 -1
- package/agents/roles/system/people-operations-manager/learning/sources.yaml +2 -2
- package/agents/roles/system/people-operations-manager/references/operating-model.md +2 -2
- package/agents/roles/system/privacy-compliance-specialist/learning/HISTORY.md +2 -0
- package/agents/roles/system/privacy-compliance-specialist/learning/sources.yaml +1 -1
- package/agents/roles/system/privacy-compliance-specialist/references/operating-model.md +1 -1
- package/agents/roles/system/procurement-manager/learning/HISTORY.md +1 -1
- package/agents/roles/system/procurement-manager/learning/sources.yaml +2 -2
- package/agents/roles/system/procurement-manager/references/operating-model.md +2 -2
- package/agents/roles/system/product-manager/learning/HISTORY.md +1 -1
- package/agents/roles/system/product-marketing-manager/learning/HISTORY.md +2 -0
- package/agents/roles/system/product-marketing-manager/learning/sources.yaml +1 -1
- package/agents/roles/system/project-manager/learning/HISTORY.md +4 -1
- package/agents/roles/system/project-manager/learning/sources.yaml +1 -1
- package/agents/roles/system/project-manager/references/operating-model.md +2 -2
- package/agents/roles/system/qa-engineer/learning/HISTORY.md +2 -0
- package/agents/roles/system/qa-engineer/learning/sources.yaml +9 -11
- package/agents/roles/system/qa-engineer/references/operating-model.md +2 -2
- package/agents/roles/system/release-manager/learning/HISTORY.md +1 -1
- package/agents/roles/system/sales-representative/learning/HISTORY.md +2 -0
- package/agents/roles/system/sales-representative/learning/sources.yaml +2 -2
- package/agents/roles/system/sales-representative/references/operating-model.md +1 -1
- package/agents/roles/system/security-engineer/learning/HISTORY.md +2 -0
- package/agents/roles/system/security-engineer/learning/sources.yaml +1 -1
- package/agents/roles/system/security-engineer/references/operating-model.md +1 -1
- package/agents/roles/system/site-reliability-engineer/learning/HISTORY.md +2 -0
- package/agents/roles/system/software-architect/learning/HISTORY.md +2 -0
- package/agents/roles/system/software-architect/learning/sources.yaml +2 -2
- package/agents/roles/system/software-architect/references/operating-model.md +1 -1
- package/agents/roles/system/solutions-engineer/learning/HISTORY.md +4 -1
- package/agents/roles/system/solutions-engineer/learning/sources.yaml +4 -4
- package/agents/roles/system/solutions-engineer/references/operating-model.md +2 -2
- package/agents/roles/system/tech-lead/learning/HISTORY.md +2 -0
- package/agents/roles/system/technical-program-manager/learning/HISTORY.md +4 -1
- package/agents/roles/system/technical-program-manager/learning/sources.yaml +2 -2
- package/agents/roles/system/technical-program-manager/references/operating-model.md +3 -3
- package/agents/roles/system/technical-writer/learning/HISTORY.md +4 -1
- package/agents/roles/system/treasury-analyst/learning/HISTORY.md +2 -0
- package/agents/roles/system/ui-designer/learning/HISTORY.md +2 -0
- package/agents/roles/system/ui-designer/learning/sources.yaml +2 -2
- package/agents/roles/system/user-researcher/learning/HISTORY.md +1 -1
- package/agents/roles/system/user-researcher/learning/sources.yaml +1 -1
- package/agents/roles/system/ux-designer/learning/HISTORY.md +2 -0
- package/agents/roles/system/ux-designer/learning/sources.yaml +1 -1
- package/agents/roles/system/ux-designer/references/operating-model.md +1 -1
- package/automatization/workflows/autobuild.js +38 -20
- package/engine/agents/learning-seal.js +36 -5
- package/engine/agents/learning-sources.js +46 -2
- package/engine/agents/learning.js +13 -1
- package/engine/cli/planning.js +29 -0
- package/package.json +1 -1
- package/template/planning/PROTOCOL.md +14 -0
|
@@ -1,3 +1,6 @@
|
|
|
1
1
|
# Historial de cambios aprobados
|
|
2
2
|
|
|
3
|
-
|
|
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://
|
|
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
|
-
-
|
|
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://
|
|
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
|
-
#
|
|
17
|
-
#
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
#
|
|
51
|
-
#
|
|
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://
|
|
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
|
|
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://
|
|
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://
|
|
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://
|
|
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
|
-
|
|
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
|
|---|---|---|---|---|
|
|
@@ -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/
|
|
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/
|
|
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/
|
|
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/
|
|
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.
|
|
@@ -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://
|
|
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://
|
|
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
|
-
|
|
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://
|
|
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://
|
|
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://
|
|
58
|
-
- [ISO/IEC 25010:2023](https://
|
|
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,3 +1,6 @@
|
|
|
1
1
|
# Historial de aprendizaje
|
|
2
2
|
|
|
3
|
-
|
|
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://
|
|
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://
|
|
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://
|
|
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://
|
|
39
|
-
-
|
|
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
|
-
|
|
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,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:
|
|
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:
|
|
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
|
-
|
|
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/
|
|
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
|
|
@@ -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://
|
|
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://
|
|
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.
|
|
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
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
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
|
|
113
|
-
// una tabla que lo repite entero deja de leerse.
|
|
114
|
-
|
|
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)}\` |
|
|
144
|
+
const row = `| ${isoDate(new Date())} | \`${path.basename(file)}\` | ${decision} | ${responsible} `
|
|
119
145
|
+ `| ${line.slice(0, 160)} |\n`
|
|
120
|
-
|
|
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 }
|