@rlabs-cl/arketum 0.0.0-stage → 1.0.1

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 (77) hide show
  1. package/CHANGELOG.md +140 -0
  2. package/LICENSE +42 -0
  3. package/README.md +67 -2
  4. package/THIRD-PARTY-NOTICES +2428 -0
  5. package/catalogo-de-ejemplo/agentes.yaml +11 -0
  6. package/catalogo-de-ejemplo/arquetipos/ajuste.yaml +54 -0
  7. package/catalogo-de-ejemplo/arquetipos/arquetipo-autor.yaml +72 -0
  8. package/catalogo-de-ejemplo/arquetipos/arquitectura-de-sistema.yaml +72 -0
  9. package/catalogo-de-ejemplo/arquetipos/despliegue-compose.yaml +104 -0
  10. package/catalogo-de-ejemplo/arquetipos/digestion.yaml +97 -0
  11. package/catalogo-de-ejemplo/arquetipos/documento-academico.yaml +131 -0
  12. package/catalogo-de-ejemplo/arquetipos/inventario-funcional.yaml +42 -0
  13. package/catalogo-de-ejemplo/arquetipos/levantamiento-de-infraestructura.yaml +117 -0
  14. package/catalogo-de-ejemplo/arquetipos/plan-de-migracion.yaml +40 -0
  15. package/catalogo-de-ejemplo/arquetipos/prd.yaml +62 -0
  16. package/catalogo-de-ejemplo/arquetipos/radio-de-alcance.yaml +141 -0
  17. package/catalogo-de-ejemplo/arquetipos/rca.yaml +68 -0
  18. package/catalogo-de-ejemplo/arquetipos/servicio-con-integracion.yaml +154 -0
  19. package/catalogo-de-ejemplo/carriles/ajuste.yaml +14 -0
  20. package/catalogo-de-ejemplo/carriles/arquetipo.yaml +13 -0
  21. package/catalogo-de-ejemplo/carriles/comprobacion.yaml +23 -0
  22. package/catalogo-de-ejemplo/carriles/correccion.yaml +25 -0
  23. package/catalogo-de-ejemplo/carriles/despliegue.yaml +36 -0
  24. package/catalogo-de-ejemplo/carriles/digestion.yaml +14 -0
  25. package/catalogo-de-ejemplo/carriles/funcionalidad.yaml +34 -0
  26. package/catalogo-de-ejemplo/carriles/migracion.yaml +27 -0
  27. package/catalogo-de-ejemplo/carriles/nuevo.yaml +30 -0
  28. package/catalogo-de-ejemplo/formas/aplicacion-por-capas.yaml +185 -0
  29. package/catalogo-de-ejemplo/formas/juego-terminal.yaml +161 -0
  30. package/catalogo-de-ejemplo/formas/monorepo-de-aplicaciones.yaml +207 -0
  31. package/catalogo-de-ejemplo/incluido.yaml +3 -0
  32. package/catalogo-de-ejemplo/stacks/go/e2e-terminal/e2e_http.py +36 -0
  33. package/catalogo-de-ejemplo/stacks/go/e2e-terminal/pytest.ini +5 -0
  34. package/catalogo-de-ejemplo/stacks/go/e2e-terminal/requirements.txt +2 -0
  35. package/catalogo-de-ejemplo/stacks/go/e2e-terminal/terminal_e2e.py +112 -0
  36. package/catalogo-de-ejemplo/stacks/go/e2e-terminal/terminal_prueba.py +118 -0
  37. package/catalogo-de-ejemplo/stacks/go/suelo-aplicacion-por-capas/requirements.txt +1 -0
  38. package/catalogo-de-ejemplo/stacks/go/suelo-aplicacion-por-capas/suelo.py +102 -0
  39. package/catalogo-de-ejemplo/stacks/go/suelo-aplicacion-por-capas/terminal_prueba.py +118 -0
  40. package/catalogo-de-ejemplo/stacks/go/suelo-juego-terminal/requirements.txt +1 -0
  41. package/catalogo-de-ejemplo/stacks/go/suelo-juego-terminal/suelo.py +86 -0
  42. package/catalogo-de-ejemplo/stacks/go/suelo-juego-terminal/terminal_prueba.py +118 -0
  43. package/catalogo-de-ejemplo/stacks/go.yaml +74 -0
  44. package/catalogo-de-ejemplo/stacks/python/e2e-terminal/e2e_http.py +36 -0
  45. package/catalogo-de-ejemplo/stacks/python/e2e-terminal/pytest.ini +5 -0
  46. package/catalogo-de-ejemplo/stacks/python/e2e-terminal/requirements.txt +2 -0
  47. package/catalogo-de-ejemplo/stacks/python/e2e-terminal/terminal_e2e.py +112 -0
  48. package/catalogo-de-ejemplo/stacks/python/e2e-terminal/terminal_prueba.py +118 -0
  49. package/catalogo-de-ejemplo/stacks/python/suelo-aplicacion-por-capas/requirements.txt +1 -0
  50. package/catalogo-de-ejemplo/stacks/python/suelo-aplicacion-por-capas/suelo.py +102 -0
  51. package/catalogo-de-ejemplo/stacks/python/suelo-aplicacion-por-capas/terminal_prueba.py +118 -0
  52. package/catalogo-de-ejemplo/stacks/python/suelo-juego-terminal/requirements.txt +1 -0
  53. package/catalogo-de-ejemplo/stacks/python/suelo-juego-terminal/suelo.py +86 -0
  54. package/catalogo-de-ejemplo/stacks/python/suelo-juego-terminal/terminal_prueba.py +118 -0
  55. package/catalogo-de-ejemplo/stacks/python.yaml +167 -0
  56. package/catalogo-de-ejemplo/stacks/typescript/e2e-node/app.mjs +182 -0
  57. package/catalogo-de-ejemplo/stacks/typescript/e2e-node/requirements.txt +1 -0
  58. package/catalogo-de-ejemplo/stacks/typescript/e2e-node/terminal_prueba.py +118 -0
  59. package/catalogo-de-ejemplo/stacks/typescript/e2e-node/terminal_puente.py +51 -0
  60. package/catalogo-de-ejemplo/stacks/typescript/e2e-node/vitest.config.mjs +12 -0
  61. package/catalogo-de-ejemplo/stacks/typescript/suelo-aplicacion-por-capas/requirements.txt +1 -0
  62. package/catalogo-de-ejemplo/stacks/typescript/suelo-aplicacion-por-capas/suelo.py +102 -0
  63. package/catalogo-de-ejemplo/stacks/typescript/suelo-aplicacion-por-capas/terminal_prueba.py +118 -0
  64. package/catalogo-de-ejemplo/stacks/typescript/suelo-juego-terminal/requirements.txt +1 -0
  65. package/catalogo-de-ejemplo/stacks/typescript/suelo-juego-terminal/suelo.py +86 -0
  66. package/catalogo-de-ejemplo/stacks/typescript/suelo-juego-terminal/terminal_prueba.py +118 -0
  67. package/catalogo-de-ejemplo/stacks/typescript.yaml +88 -0
  68. package/dist/mcp/arketum.js +3 -0
  69. package/dist/mcp/ci-cli.js +2 -0
  70. package/dist/mcp/cli.js +2 -0
  71. package/dist/mcp/comun-ZEXDDERM.js +1 -0
  72. package/dist/mcp/comun-ZTEHRDHC.js +1 -0
  73. package/dist/mcp/panel-cli.js +2 -0
  74. package/dist/mcp/telemetria-cli.js +1 -0
  75. package/package.json +33 -4
  76. package/server.json +15 -0
  77. package/telemetria.json +27 -0
@@ -0,0 +1,117 @@
1
+ # Levantamiento de infraestructura.
2
+ #
3
+ # Artefacto de trabajo del carril `despliegue`: va en un paso con la marca
4
+ # `pendientes`, lo llevan los papeles de la fase 1 (el analista habla con la
5
+ # persona; el arquitecto deduce lo técnico, propone el modo y redacta los
6
+ # pendientes) y alimenta al paso de sistema y al de evidencia `preparado`.
7
+ # Indaga: dónde se despliega, en qué entornos, con qué accesos y
8
+ # configuraciones, quién opera, hasta dónde se automatiza y cómo se sabe que
9
+ # funciona. No rellena una lista.
10
+ #
11
+ # Lo que no se puede responder en la sesión es un `pendiente` (L1): Arketum
12
+ # genera el cuestionario, la unidad se pausa y las respuestas entran en el
13
+ # último nivel (L2), hijas de su pendiente. El vocabulario de los pendientes
14
+ # (`entorno`, `pendiente`, `respuesta`, `referencia`) es del núcleo.
15
+ name: levantamiento-de-infraestructura
16
+ version: 1.0.0
17
+ description: >-
18
+ Levantamiento completo de la infraestructura donde se despliega un sistema: alcance y entornos, accesos, configuración, operación, automatización y verificación, con lo que falta como pendientes que la persona trae fuera de la sesión. Termina en el modo de despliegue y en los requisitos técnicos de cada entorno. Elígelo antes de preparar un despliegue; para pedir funcionalidad corresponde un PRD.
19
+ tags: [proceso, despliegue, infraestructura]
20
+
21
+ kinds:
22
+ - name: desplegable
23
+ describes: "alcance (L0): un artefacto del proyecto que se despliega"
24
+ - name: entorno
25
+ describes: "alcance (L0): un entorno donde se despliega (`local`, `staging`, `produccion`), con su id como slug y `despliega: si|no` (si esta unidad lo despliega o solo lo prepara)"
26
+ - name: tema
27
+ describes: "lo que hay que saber de un entorno (L1), con su rol: `acceso`, `configuracion`, `operacion`, `automatizacion`, `verificacion`, u otro (`red`, `datos`, `coste`, `cumplimiento`, `recuperacion`…)"
28
+ - name: pendiente
29
+ describes: "lo que no se puede responder en la sesión (L1): `que`, `porque` (obligatorio), `donde`, `quien`, `respuesta` (`valor`, `referencia` o `confirmacion`) y `antes_de` (`preparar` o `desplegar:<entorno>`)"
30
+ - name: requisito
31
+ describes: "lo acordado (L2), como requisito: `tecnico` (con `entorno` el de cada entorno, con `modo` el del modo) o `decision` (con `antes_de: desplegar:<entorno>` la de un pendiente de antes de desplegar)"
32
+ - name: respuesta
33
+ describes: "la respuesta a un pendiente de antes de preparar (L2): `de` (el pendiente) y su `valor`, su `referencia` o su `confirmacion`"
34
+ - name: referencia
35
+ describes: "dónde vive un secreto que el despliegue necesita (L2): `referencia: <esquema>:<ruta>` y su verificación (`evidence: execution`, `expect: success`, `on: entorno`), o `verificable: no` con su `motivo`"
36
+ - name: documento
37
+ describes: el fichero del levantamiento, en la carpeta de trabajo del paso (nunca el cuestionario, que va fuera del repositorio)
38
+
39
+ extractors:
40
+ - mechanism: path
41
+ kind: documento
42
+ pattern: "<nombre>.md"
43
+
44
+ levels:
45
+ - id: L0
46
+ requiredRoles: []
47
+ title: ALCANCE
48
+ instruction: >
49
+ Declara qué se despliega (un `desplegable` por artefacto del proyecto) y en
50
+ qué entornos (un `entorno` por entorno, con su id como slug: `local`,
51
+ `staging`, `produccion`). Pregúntale a la persona dónde quiere tenerlo
52
+ funcionando y quién lo va a usar en cada sitio; no propongas todavía cómo.
53
+ Cada `entorno` lleva el atributo `despliega`: `si` si esta unidad lo
54
+ despliega y lo deja funcionando (entonces la unidad lleva el hito
55
+ `despliegue <entorno>`), `no` si solo lo prepara. Sale de lo que pide la
56
+ persona, no de lo que te resulte más cómodo: si dice «quiero verla
57
+ funcionando en mi portátil ya», `local` lleva `despliega: si`. Como mucho
58
+ un entorno se despliega en una unidad; los demás, en otra.
59
+ - id: L1
60
+ requiredRoles: [acceso, configuracion, operacion, automatizacion, verificacion]
61
+ title: LO QUE HAY QUE SABER
62
+ instruction: >
63
+ Indaga cada entorno: cada `entorno` del alcance tiene hijos aquí, y entre
64
+ todos cubren al menos los roles `acceso` (cuentas, permisos, credenciales:
65
+ dónde viven), `configuracion` (variables, dominios, puertos, registros de
66
+ imágenes), `operacion` (quién lo opera, cómo se actualiza, qué pasa si se
67
+ cae), `automatizacion` (hasta dónde se automatiza y qué despliega cada
68
+ cual) y `verificacion` (cómo se sabe que funciona después de desplegar).
69
+ La lista NO está cerrada: pregunta qué más hay (`red`, `datos`, `coste`,
70
+ `cumplimiento`, `recuperacion`…) y decláralo con su rol. En lo técnico de
71
+ infraestructura esta instrucción manda sobre el texto del papel: el
72
+ arquitecto sí nombra tecnologías, puertos, rutas y comandos. Lo que no se
73
+ puede responder en la sesión (un acceso que hay que pedir, un dato de otro
74
+ equipo) es un `pendiente`, hijo de su entorno, con `que`, `porque`
75
+ (obligatorio: para qué hace falta), `donde` (otro equipo, la consola del
76
+ proveedor, un contrato), `quien` (quién lo trae), `respuesta` (`valor` si
77
+ es un dato que no es secreto, `referencia` si es dónde vive un secreto,
78
+ nunca el secreto, o `confirmacion` si es algo hecho) y `antes_de`
79
+ (`preparar` si sin él no se puede preparar, o `desplegar:<entorno>` si
80
+ solo hace falta antes de desplegar ese entorno). Al aceptarse este nivel
81
+ con pendientes, Arketum devuelve el cuestionario.
82
+ fanout:
83
+ min: 5
84
+ max: 40
85
+ - id: L2
86
+ requiredRoles: []
87
+ title: LO ACORDADO
88
+ instruction: >
89
+ Declara el alcance acordado como requisitos (atributos `tipo`,
90
+ `requisito`, `titulo`, `sale_de` —la frase de la persona o el requisito
91
+ del que se deduce—, `porque` en un `tecnico`, `aceptacion` y `artefacto`:
92
+ el id del artefacto de despliegue del proyecto, donde viven). Un `tecnico`
93
+ por entorno con el atributo `entorno` (los entornos del proyecto son los
94
+ de esos técnicos), y el modo como un `tecnico` con el atributo `modo`
95
+ (`compose`, `pipeline`, `script` u otro) y su `porque`, que la persona
96
+ confirma en el gate; los demás técnicos con su `porque` («se automatiza
97
+ hasta staging», «producción la despliega operaciones con el script»). Las
98
+ `decision` que siguen abiertas. Una `referencia` por secreto que el
99
+ despliegue necesita (`referencia: <esquema>:<ruta>`; habituales: `vault`,
100
+ `aws-sm`, `gcp-sm`, `azure-kv`, `github-secret`, `1password`,
101
+ `k8s-secret`, `env`), con su verificación —`evidence: execution`,
102
+ `expect: success` y `on: entorno`: un comando que demuestra el acceso sin
103
+ imprimir el valor, como `aws sts get-caller-identity` o `gh secret list`
104
+ filtrado por nombre— o `verificable: no` con su `motivo`. Cada pendiente
105
+ del nivel anterior tiene aquí su hijo (en `parents`): si es `antes_de:
106
+ preparar`, una `respuesta` con `de: <pendiente>` y su `valor`, su
107
+ `referencia` o su `confirmacion`, según lo que pidió; si es
108
+ `desplegar:<entorno>`, una `decision` con `antes_de:
109
+ desplegar:<entorno>`, que queda por decidir y bloquea el hito de ese
110
+ entorno. UNA RESPUESTA `valor` DE LA QUE DEPENDA EL DESPLIEGUE (la región,
111
+ el dominio, el nombre del registro) SE RECOGE TAMBIÉN EN UN `tecnico`:
112
+ la `respuesta` no entra en la entrada del paso de sistema, y el técnico
113
+ sí. Nunca un secreto: Arketum rechaza lo que tenga su forma. Y el
114
+ fichero del levantamiento (tipo `documento`, con su `location`).
115
+ fanout:
116
+ min: 3
117
+ max: 80
@@ -0,0 +1,40 @@
1
+ # Plan de migración.
2
+ #
3
+ # Los movimientos que llevan del sistema actual al nuevo, cada uno con los
4
+ # artefactos que toca. Al aprobarse, fija los tocados de la unidad.
5
+ name: plan-de-migracion
6
+ version: 1.0.0
7
+ description: >-
8
+ Los movimientos que llevan un sistema existente a su forma nueva, en orden y con los artefactos que toca cada uno. Es el artefacto de trabajo del carril de migración que fija los tocados. Elígelo para planificar una migración; para acotar un cambio sin migrar corresponde el radio de alcance.
9
+ tags: [proceso, migracion, plan]
10
+
11
+ kinds:
12
+ - name: objetivo
13
+ describes: "pieza de la solicitud (L0): de dónde a dónde se migra"
14
+ - name: movimiento
15
+ describes: "un paso de la migración; atributo `touches`: los artefactos del proyecto que toca, separados por comas"
16
+ - name: documento
17
+ describes: el fichero del plan, en la carpeta de trabajo del paso
18
+
19
+ extractors:
20
+ - mechanism: path
21
+ kind: documento
22
+ pattern: "<nombre>.md"
23
+
24
+ levels:
25
+ - id: L0
26
+ requiredRoles: []
27
+ title: MIGRACIÓN
28
+ instruction: >
29
+ Declara de dónde a dónde se migra y qué no se puede perder (el inventario
30
+ funcional).
31
+ - id: L1
32
+ requiredRoles: []
33
+ title: MOVIMIENTOS
34
+ instruction: >
35
+ Declara los movimientos en orden, cada uno con el atributo `touches` (los
36
+ artefactos del proyecto que toca, separados por comas), y el fichero del
37
+ plan (tipo `documento`, con su `location`).
38
+ fanout:
39
+ min: 1
40
+ max: 60
@@ -0,0 +1,62 @@
1
+ # Documento de requisitos de producto (PRD).
2
+ #
3
+ # Artefacto de trabajo: vive en la carpeta de la unidad y alimenta al paso de
4
+ # sistema. Lo que pide pasa a ser intención de los artefactos tocados cuando
5
+ # declara cómo se comprueba (`projection`); lo demás queda como prosa.
6
+ name: prd
7
+ version: 1.1.0
8
+ description: >-
9
+ Requisitos de un cambio de producto: qué se pide, para quién y cómo se sabrá que está hecho. Es el artefacto de trabajo con que empiezan los carriles de producto nuevo y de funcionalidad, y alimenta al paso de sistema. Elígelo para pedir algo; para explicar un fallo corresponde un RCA.
10
+ tags: [proceso, requisitos, producto]
11
+
12
+ kinds:
13
+ - name: objetivo
14
+ describes: "pieza de la solicitud (L0): qué se quiere conseguir y para quién"
15
+ - name: necesidad
16
+ describes: un problema o una capacidad que pide quien usa el sistema
17
+ - name: requisito
18
+ describes: algo concreto que el sistema tiene que hacer o cumplir; con `projection` si se puede comprobar
19
+ - name: documento
20
+ describes: el fichero del PRD, en la carpeta de trabajo del paso
21
+
22
+ extractors:
23
+ - mechanism: path
24
+ kind: documento
25
+ pattern: "<nombre>.md"
26
+
27
+ levels:
28
+ - id: L0
29
+ requiredRoles: []
30
+ title: SOLICITUD
31
+ instruction: >
32
+ Declara qué se quiere conseguir, para quién y por qué ahora. Una pieza por
33
+ objetivo; un objetivo que no se puede dar por cumplido o no no es un objetivo.
34
+ - id: L1
35
+ requiredRoles: []
36
+ title: NECESIDADES
37
+ instruction: >
38
+ Declara las necesidades que atiende cada objetivo: el problema de quien usa
39
+ el sistema, no la solución.
40
+ fanout:
41
+ min: 1
42
+ max: 15
43
+ - id: L2
44
+ requiredRoles: []
45
+ title: REQUISITOS
46
+ instruction: >
47
+ Declara los requisitos de cada necesidad y el fichero del PRD (tipo
48
+ `documento`, con su `location`). Un requisito que se puede comprobar lleva
49
+ `projection` (relación y argumentos): es el que pasa a ser intención de los
50
+ artefactos tocados. Uno sin proyección queda como prosa y no se comprueba.
51
+ Para que entre en el índice de requisitos del artefacto, lleva los
52
+ atributos `tipo` (`funcional`, `tecnico` o `decision`) y `requisito` (su id
53
+ corto, estable entre versiones), con `titulo` (hasta 80 caracteres),
54
+ `sale_de` (la frase de la persona o el requisito del que se deduce),
55
+ `porque` (obligatorio en un `tecnico`), `aceptacion` y, si la unidad toca
56
+ varios artefactos, `artefacto`; la versión la pone Arketum. Con el id de
57
+ uno que ya existe es una versión nueva de ese requisito. Si contradice a un
58
+ `tecnico` o a una `decision` del mismo artefacto, lo declara con
59
+ `choca_con` (su id, `<artefacto>:<id>`).
60
+ fanout:
61
+ min: 1
62
+ max: 60
@@ -0,0 +1,141 @@
1
+ # Radio de alcance de un cambio.
2
+ #
3
+ # Declara la forma de una afirmación que casi nadie escribe y de la que depende
4
+ # todo lo demás: QUÉ PUEDE TOCAR un cambio. No qué tocó — qué puede tocar.
5
+ #
6
+ # Sirve para dos procesos con la misma forma y distinta fuente: en una migración
7
+ # la fuente es el grafo de dependencias; en un requerimiento normativo, la norma.
8
+ #
9
+ # Regla que este arquetipo existe para hacer cumplir: «acotado» no lo declara
10
+ # quien hizo el cambio, y cuando no se puede acotar el radio, el cambio es
11
+ # MASIVO por definición. La frontera se declara con evidencia, igual que lo
12
+ # alcanzado — porque la frontera es la afirmación arriesgada, no la lista.
13
+ name: radio-de-alcance
14
+ version: 1.1.0
15
+ description: >-
16
+ Análisis de lo que PUEDE tocar un cambio antes de hacerlo: fuentes, alcanzados, fronteras con evidencia y certificaciones. Es un artefacto de trabajo del carril de funcionalidad y de las migraciones. Elígelo para acotar un cambio; para explicar un fallo ya ocurrido corresponde un RCA.
17
+ tags: [proceso, impacto, analisis]
18
+
19
+ kinds:
20
+ - name: objetivo
21
+ describes: "pieza de la solicitud (L0): qué cambio se acota y quién lo declara"
22
+ - name: fuente
23
+ describes: de dónde sale el alcance — grafo de dependencias, norma, contrato
24
+ - name: alcanzado
25
+ describes: algo que el cambio puede tocar
26
+ - name: frontera
27
+ describes: algo que se declara FUERA del radio, con la razón por la que queda fuera
28
+ - name: evidencia
29
+ describes: lo que sostiene que algo está dentro o fuera
30
+ - name: certificacion
31
+ describes: certificación vigente que cae dentro del radio y hay que reverificar
32
+ - name: dependencia
33
+ describes: arista del cableado (L3) entre dos piezas declaradas
34
+ - name: documento
35
+ describes: fichero de notas o de política
36
+
37
+ extractors:
38
+ - mechanism: path
39
+ kind: fuente
40
+ pattern: "fuentes/<nombre>.md"
41
+ - mechanism: path
42
+ kind: alcanzado
43
+ pattern: "alcanzados/<nombre>.md"
44
+ - mechanism: path
45
+ kind: frontera
46
+ pattern: "fronteras/<nombre>.md"
47
+ - mechanism: path
48
+ kind: evidencia
49
+ pattern: "evidencia/<nombre>.md"
50
+ - mechanism: path
51
+ kind: certificacion
52
+ pattern: "certificaciones/<nombre>.md"
53
+ - mechanism: path
54
+ kind: documento
55
+ pattern: "<nombre>.md"
56
+
57
+ # Lo alcanzado y la frontera pesan igual. Una frontera sin evidencia es la
58
+ # forma en que un radio se declara acotado sin serlo.
59
+ coRequirements:
60
+ - when: alcanzado
61
+ requires: [evidencia]
62
+ scope: artifact
63
+ - when: frontera
64
+ requires: [evidencia]
65
+ scope: artifact
66
+
67
+ levels:
68
+ - id: L0
69
+ requiredRoles: []
70
+ title: CAMBIO
71
+ instruction: >
72
+ Declara qué cambió, quién lo hizo, y QUIÉN DECLARA ESTE RADIO — que no
73
+ puede ser quien hizo el cambio. Declara también contra qué se acota: un
74
+ grafo de dependencias, una norma, un contrato.
75
+ - id: L1
76
+ requiredRoles: [fuentes, frescura]
77
+ title: FUENTES
78
+ instruction: >
79
+ Declara de dónde sale el alcance y CUÁNDO se midió esa fuente. Una fuente
80
+ con deriva conocida —un índice que se refresca por hora, un grafo cuya cola
81
+ de fallos crece en silencio— produce un radio corto, y un radio corto
82
+ produce una recertificación corta que se firma igual. Si no puedes
83
+ establecer la frescura, dilo aquí: es lo que convierte el radio en masivo.
84
+ fanout:
85
+ min: 1
86
+ max: 10
87
+ - id: L2
88
+ requiredRoles: [directos, indirectos, fronteras]
89
+ title: ALCANCE
90
+ instruction: >
91
+ Declara qué puede tocar el cambio: lo que lo usa directamente, lo que llega
92
+ por transitividad, y lo que queda FUERA. Las tres. Un radio sin fronteras
93
+ declaradas no está acotado: está sin mirar.
94
+ fanout:
95
+ min: 3
96
+ max: 80
97
+ - id: L3
98
+ requiredRoles: []
99
+ title: CERTIFICACIONES
100
+ instruction: >
101
+ Qué certificaciones vigentes caen dentro del radio. Recuerda que una
102
+ certificación muere por dos causas y solo una deja rastro: cambió el
103
+ artefacto, o cambió el criterio. La segunda no la dispara ningún commit.
104
+ fanout:
105
+ min: 0
106
+ max: 60
107
+ - id: L4
108
+ requiredRoles: []
109
+ title: RADIO
110
+ instruction: >
111
+ Escribe el veredicto: ACOTADO o MASIVO, y qué hay que reverificar. Si es
112
+ acotado, declara qué se da por bueno sin volver a probar. Si no pudiste
113
+ acotar, es masivo — y masivo significa todo lo que se intentó, sin muestreo.
114
+ Declara también el fichero del radio (tipo `documento`, con su `location`):
115
+ es lo que la fidelidad compara en este último nivel.
116
+ fanout:
117
+ min: 1
118
+ max: 80
119
+
120
+ selfReview:
121
+ criteria:
122
+ - check: Quien declara el radio no es quien hizo el cambio
123
+ evidence: juicio
124
+ - check: La fuente del alcance tiene fecha de medición y esa fecha es fresca
125
+ how: >
126
+ Nombra la fuente y cuándo se consultó. Si es un índice, comprueba su cola
127
+ de fallos y su última corrida. Un índice sucio no informa el radio.
128
+ evidence: medida
129
+ - check: Cada elemento alcanzado tiene evidencia de por qué está dentro
130
+ how: Recorre la lista de L2 y contrasta cada uno contra la fuente declarada.
131
+ evidence: medida
132
+ - check: Cada frontera tiene evidencia de por qué está fuera
133
+ how: >
134
+ Recorre las fronteras y comprueba, contra la misma fuente, que no hay
135
+ camino desde el cambio. Una frontera sostenida solo en intuición no vale.
136
+ evidence: medida
137
+ - check: Si el radio no se pudo acotar, el veredicto dice MASIVO y no acotado
138
+ evidence: juicio
139
+ groundingCheck: true
140
+ groundingScope: alguna fuente, evidencia o certificación
141
+ assumptionsMustDeclare: true
@@ -0,0 +1,68 @@
1
+ # Análisis de causa raíz (RCA).
2
+ #
3
+ # Parte de no saber: la señal registra que algo falló, y el RCA investiga hasta
4
+ # confirmar la causa con evidencia. Su último nivel fija qué se toca (atributo
5
+ # `touches`) y cómo se verifica el arreglo (atributos `evidence`, `expect`, `on`).
6
+ name: rca
7
+ version: 1.0.0
8
+ description: >-
9
+ Investigación de un fallo desde la señal hasta la causa confirmada con evidencia, con lo que hay que tocar y cómo se verifica el arreglo. Es el artefacto de trabajo del carril de corrección: fija los tocados y la verificación. Elígelo para explicar un fallo; para pedir algo nuevo corresponde un PRD.
10
+ tags: [proceso, fallo, causa]
11
+
12
+ kinds:
13
+ - name: objetivo
14
+ describes: "pieza de la solicitud (L0): el fallo tal como se reportó o se detectó"
15
+ - name: hipotesis
16
+ describes: una explicación posible del fallo (código, pipeline, entorno o datos)
17
+ - name: causa
18
+ describes: la hipótesis confirmada, con la evidencia que la confirma
19
+ - name: remedio
20
+ describes: "lo que hay que cambiar; atributo `touches`: los artefactos del proyecto, separados por comas"
21
+ - name: verificacion
22
+ describes: "cómo se comprueba el arreglo; atributos `evidence` (clases separadas por comas), `expect` y `on`"
23
+ - name: documento
24
+ describes: el fichero del RCA, en la carpeta de trabajo del paso
25
+
26
+ extractors:
27
+ - mechanism: path
28
+ kind: documento
29
+ pattern: "<nombre>.md"
30
+
31
+ levels:
32
+ - id: L0
33
+ requiredRoles: []
34
+ title: SEÑAL
35
+ instruction: >
36
+ Declara el fallo tal como llegó: qué se observó, dónde y quién lo reportó.
37
+ Todavía no se sabe la causa; no la escribas aquí.
38
+ - id: L1
39
+ requiredRoles: []
40
+ title: HIPÓTESIS
41
+ instruction: >
42
+ Declara las hipótesis: en el código, el pipeline, el entorno o los datos.
43
+ Cada una dice qué se esperaría ver si fuera cierta.
44
+ fanout:
45
+ min: 1
46
+ max: 20
47
+ - id: L2
48
+ requiredRoles: []
49
+ title: CAUSA
50
+ instruction: >
51
+ Declara la causa confirmada y con qué evidencia se confirmó. Las hipótesis
52
+ descartadas se quedan en L1; aquí solo lo que resistió la prueba.
53
+ fanout:
54
+ min: 1
55
+ max: 10
56
+ - id: L3
57
+ requiredRoles: []
58
+ title: REMEDIO Y VERIFICACIÓN
59
+ instruction: >
60
+ Declara el remedio (tipo `remedio`, atributo `touches` con los artefactos
61
+ del proyecto que hay que tocar, separados por comas; ninguno si el fallo no
62
+ está en el proyecto), la verificación (tipo `verificacion`, atributos
63
+ `evidence` con las clases que valen, `expect` si admite ejecución y `on`:
64
+ `before` para una prueba que falla antes del cambio, `change` para la que
65
+ pasa con él) y el fichero del RCA (tipo `documento`, con su `location`).
66
+ fanout:
67
+ min: 1
68
+ max: 30
@@ -0,0 +1,154 @@
1
+ # Servicio que depende de otro sistema. Go.
2
+ #
3
+ # Declara la forma de un servicio con fronteras externas —una pasarela, un
4
+ # sincronizador, un webhook con reintentos—, no la de ninguno. No sabe con qué
5
+ # se integra.
6
+ #
7
+ # La política de este arquetipo es una sola idea: TODA FRONTERA SE DECLARA Y SE
8
+ # PUEDE SUSTITUIR. Lo que no se puede sustituir no se puede probar, y lo que no
9
+ # se puede probar es donde caen los sistemas integrados.
10
+ #
11
+ # Cambios:
12
+ # - 1.1.0: los extractores de código excluyen `<nombre>_test.go` (una prueba
13
+ # junto a lo que prueba solo la reclama `prueba`); tipos nuevos `modulo`
14
+ # (go.mod y go.sum) y `arranque` (cmd/<binario>/main.go). La huella cambia:
15
+ # un proyecto que ya lo usa ve `stale_policy` y recertifica sus artefactos.
16
+ # `templates/` y `static/` de una web siguen sin tipo.
17
+ name: servicio-con-integracion
18
+ version: 1.1.0
19
+ description: >-
20
+ Servicio que depende de otros sistemas (pasarela, sincronizador, webhook con reintentos), en Go. Toda frontera externa se declara como puerto y tiene un doble sustituible para probarla. Elígelo cuando lo central del artefacto sea integrarse; para una web con persistencia propia hay otros.
21
+ tags: [codigo, servicio, integracion, go]
22
+
23
+ kinds:
24
+ - name: objetivo
25
+ describes: pieza de la solicitud (L0), sin ubicación en el árbol
26
+ - name: frontera
27
+ describes: interfaz que describe un sistema ajeno tal como este lo necesita
28
+ - name: adaptador
29
+ describes: implementación de una frontera contra el sistema real
30
+ - name: doble
31
+ describes: implementación de una frontera para probar sin el sistema real
32
+ - name: servicio
33
+ describes: lógica propia, que no habla con nadie de fuera
34
+ - name: dependencia
35
+ describes: arista del cableado (L3) entre dos piezas declaradas
36
+ - name: prueba
37
+ describes: fichero de prueba
38
+ - name: modulo
39
+ describes: la definición del módulo de Go y sus sumas (go.mod, go.sum)
40
+ - name: arranque
41
+ describes: el punto de entrada de un binario (cmd/<binario>/main.go)
42
+ - name: documento
43
+ describes: fichero de documentación o de política
44
+
45
+ # Una prueba vive junto a lo que prueba (`x_test.go`): cada extractor de código
46
+ # la excluye, para que solo la reclame `prueba`.
47
+ extractors:
48
+ - mechanism: path
49
+ kind: frontera
50
+ pattern: "internal/fronteras/<nombre>.go"
51
+ excluding: ["internal/fronteras/<nombre>_test.go"]
52
+ - mechanism: path
53
+ kind: adaptador
54
+ pattern: "internal/adaptadores/<nombre>.go"
55
+ excluding: ["internal/adaptadores/<nombre>_test.go"]
56
+ - mechanism: path
57
+ kind: doble
58
+ pattern: "internal/dobles/<nombre>.go"
59
+ excluding: ["internal/dobles/<nombre>_test.go"]
60
+ - mechanism: path
61
+ kind: servicio
62
+ pattern: "internal/servicios/<nombre>.go"
63
+ excluding: ["internal/servicios/<nombre>_test.go"]
64
+ - mechanism: path
65
+ kind: prueba
66
+ pattern: "internal/<paquete>/<nombre>_test.go"
67
+ # go.mod y go.sum: un extractor por tipo, y el marcador casa con media palabra.
68
+ - mechanism: path
69
+ kind: modulo
70
+ pattern: "go.<fichero>"
71
+ - mechanism: path
72
+ kind: arranque
73
+ pattern: "cmd/<binario>/main.go"
74
+
75
+ # Un adaptador sin doble es una frontera que solo se puede ejercitar contra el
76
+ # sistema real: la prueba se vuelve lenta, frágil y acaba desactivada.
77
+ coRequirements:
78
+ - when: adaptador
79
+ requires: [doble]
80
+ scope: artifact
81
+ - when: servicio
82
+ requires: [prueba]
83
+ scope: artifact
84
+
85
+ levels:
86
+ - id: L0
87
+ requiredRoles: []
88
+ title: SOLICITUD
89
+ instruction: >
90
+ Declara qué tiene que conseguir el servicio y con qué sistemas ajenos
91
+ necesita hablar para conseguirlo. Nombra los sistemas; no cómo se les
92
+ llama por dentro.
93
+ - id: L1
94
+ requiredRoles: [fronteras, adaptadores, servicios]
95
+ title: PARTES
96
+ instruction: >
97
+ Propón las partes, separando lo que es tuyo de lo que es de otro. Una
98
+ pieza que mezcle lógica propia con una llamada a un sistema ajeno no
99
+ podrá probarse sin ese sistema, y este nivel existe para impedirlo.
100
+ fanout:
101
+ min: 3
102
+ max: 14
103
+ - id: L2
104
+ requiredRoles: []
105
+ title: CONTRATOS
106
+ instruction: >
107
+ Declara cada frontera tal como TU servicio la necesita, no como la
108
+ documenta el proveedor. Y declara qué pasa cuando el sistema ajeno falla,
109
+ tarda o responde algo que no esperabas: eso también es el contrato.
110
+ fanout:
111
+ min: 1
112
+ max: 30
113
+ - id: L3
114
+ requiredRoles: []
115
+ title: CABLEADO
116
+ instruction: >
117
+ Declara qué depende de qué, y en particular qué pieza depende de qué
118
+ frontera. Ninguna pieza de lógica propia debería depender de un adaptador:
119
+ si lo hace, la frontera no está haciendo su trabajo.
120
+ fanout:
121
+ min: 1
122
+ max: 40
123
+ - id: L4
124
+ requiredRoles: []
125
+ title: IMPLEMENTACIÓN
126
+ instruction: >
127
+ Escribe el código. Cada adaptador viene con su doble, y la lógica propia
128
+ se prueba sin levantar nada de fuera.
129
+ fanout:
130
+ min: 1
131
+ max: 70
132
+
133
+ # La autorrevisión: qué comprobar del servicio entregado, y con qué acción.
134
+ selfReview:
135
+ criteria:
136
+ - check: La cobertura de pruebas unitarias del código propio es al menos del 80%
137
+ how: Corre la suite con reporte de cobertura y lee el total de líneas.
138
+ evidence: medida
139
+ - check: No hay hallazgos de OWASP Top 10 en lo entregado
140
+ how: >
141
+ Revisa entrada sin validar, autenticación y control de acceso, secretos
142
+ en el árbol, y qué se registra de lo que llega de fuera.
143
+ evidence: medida
144
+ - check: Ninguna pieza de lógica propia depende de un adaptador
145
+ how: Sigue las dependencias declaradas en L3 desde cada servicio.
146
+ evidence: medida
147
+ - check: Cada frontera declarada en L2 tiene doble, y el doble cubre el fallo y la demora
148
+ how: Contrasta la lista de fronteras contra la de dobles, y lee cada doble.
149
+ evidence: medida
150
+ - check: Lo implementado cumple la intención declarada en L0, y no una parecida
151
+ evidence: juicio
152
+ groundingCheck: true
153
+ groundingScope: alguna api, módulo, clase, función o dato
154
+ assumptionsMustDeclare: true
@@ -0,0 +1,14 @@
1
+ # Un ajuste: un cambio chico sobre piezas que ya existen (la 35). Se piensa por
2
+ # cambio (la cita literal del pedido y un radio corto) y se prueba en grupo: cierra
3
+ # sin las condiciones 9 y 10, que juzga una `comprobacion` de los ajustes sin
4
+ # comprobar. Su tamaño lo mide Arketum contra la línea base: si se excede, se
5
+ # descarta y se continúa en `funcionalidad` (`continua`), con su foto.
6
+ name: ajuste
7
+ version: 1.0.0
8
+ when: Un cambio chico sobre piezas que ya existen. Si resulta más grande, Arketum lo dice y sube a `funcionalidad`.
9
+ comprobacion: agrupada
10
+ tope_sin_comprobar: 5
11
+ max_cambios_sin_comprobar: 16
12
+ steps:
13
+ - { id: ajuste, kind: artifact, archetype: { name: ajuste }, gate: true, levantamiento: breve, max_requisitos: 3, feeds: [sistema] }
14
+ - { id: sistema, kind: system, fedBy: [ajuste], max_cambios: 8, piezas: L1 }
@@ -0,0 +1,13 @@
1
+ # Un arquetipo nuevo: se escribe y se publica en el catálogo que elija la
2
+ # persona.
3
+ name: arquetipo
4
+ version: 1.0.0
5
+ when: Ningún arquetipo de los catálogos describe un tipo de artefacto que se va a construir.
6
+ milestones: [entrega]
7
+ steps:
8
+ - { id: arquetipo, kind: artifact, archetype: { name: arquetipo-autor }, gate: true }
9
+ - id: hito
10
+ kind: milestone
11
+ gate: true
12
+ requires:
13
+ - { id: publicado, describes: la persona confirma que el arquetipo está publicado en el catálogo que eligió, classes: [statement] }
@@ -0,0 +1,23 @@
1
+ # La comprobación agrupada (la 35): comprueba juntos los ajustes sin comprobar.
2
+ # Recertifica cada tocado contra el árbol de ahora (con descenso heredado; los
3
+ # arreglos van aquí, con el mismo tope que un ajuste) y exige las salidas: el
4
+ # suelo, la suite e2e entera y la e2e de cada funcional de los ajustes.
5
+ name: comprobacion
6
+ version: 1.0.0
7
+ when: Comprobar juntos los ajustes sin comprobar, antes de desplegar o cuando se acumulan.
8
+ comprueba: true
9
+ milestones: [despliegue, entrega, ejecucion]
10
+ steps:
11
+ - { id: sistema, kind: system, max_cambios: 8, piezas: L1 }
12
+ - id: comprobacion
13
+ salidas: true
14
+ kind: evidence
15
+ requires:
16
+ - { id: no-regresion, describes: lo que ya funcionaba sigue funcionando, classes: [execution], expect: success }
17
+ - id: hito
18
+ kind: milestone
19
+ optional: true
20
+ gate: true
21
+ confirmacion: true
22
+ requires:
23
+ - { id: cumplido, describes: la persona confirma que el hito se cumplió, classes: [statement] }
@@ -0,0 +1,25 @@
1
+ # Una corrección parte de no saber: la señal registra el fallo, el RCA
2
+ # investiga y fija qué se toca y cómo se verifica.
3
+ #
4
+ # Cambios:
5
+ # - 1.1.0: el hito `despliegue <entorno>` cuenta (`humo: true`): exige la prueba de humo y que el entorno exista.
6
+ # - 1.2.0: el hito `despliegue <entorno>` lo cumple la confirmación de la persona por el canal interactivo («¿se desplegó en <entorno> y corrió?», sí o no): la marca `humo` pasa a llamarse `confirmacion` y la prueba de humo deja de exigirse.
7
+ name: correccion
8
+ version: 1.2.0
9
+ when: Un fallo reportado o detectado, del que todavía no se sabe la causa.
10
+ milestones: [despliegue, entrega, ejecucion]
11
+ steps:
12
+ - id: senal
13
+ kind: evidence
14
+ requires:
15
+ - { id: fallo, describes: el fallo tal como llegó, classes: [execution, report, statement], expect: failure, on: before }
16
+ - { id: rca, kind: artifact, archetype: { name: rca }, gate: true, fixesTouches: true, feeds: [sistema, verificacion] }
17
+ - { id: sistema, kind: system, optional: true, fedBy: [rca] }
18
+ - { id: verificacion, kind: evidence, fedBy: [rca] }
19
+ - id: hito
20
+ kind: milestone
21
+ optional: true
22
+ gate: true
23
+ confirmacion: true
24
+ requires:
25
+ - { id: cumplido, describes: la persona confirma que el hito se cumplió, classes: [statement] }