@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,11 @@
1
+ # Los nombres de los clientes que Arketum lee o escribe por función (ag-t01): el código de src/ no los escribe.
2
+ # En varios catálogos, cada lista es la unión de las suyas, en orden.
3
+ #
4
+ # - instrucciones: los ficheros de instrucciones que se generan para los agentes, en la raíz del proyecto, con el
5
+ # mismo texto (`action: instructions`); el estado avisa si el que hay ya no es el que se generaría.
6
+ # - configuracion: las carpetas de configuración de editores y agentes que la herramienta crea solo por abrir la
7
+ # carpeta: en la raíz, no cuentan para clasificar el arranque y se proponen como andamiaje.
8
+ # - andamiaje: el andamiaje mínimo que propone el arranque, además de los ficheros de instrucciones.
9
+ instrucciones: [AGENTS.md, CLAUDE.md]
10
+ configuracion: [.claude/, .vscode/, .idea/, .cursor/]
11
+ andamiaje: [.git/, node_modules/, dist/]
@@ -0,0 +1,54 @@
1
+ # Un ajuste: un cambio chico sobre piezas que ya existen (la 35).
2
+ #
3
+ # Artefacto de trabajo del carril `ajuste`: vive en la carpeta de la unidad y
4
+ # alimenta al paso de sistema. Su primer nivel es el radio corto (qué pieza toca
5
+ # y qué más podría tocar); el último, los requisitos, con su cita literal del
6
+ # pedido de la persona.
7
+ name: ajuste
8
+ version: 1.0.0
9
+ description: >-
10
+ Un cambio chico sobre piezas que ya existen: qué pieza toca, qué más podría tocar y cómo se notaría, y los requisitos con su cita del pedido de la persona. Es el artefacto de trabajo del carril `ajuste`; para algo nuevo o grande corresponde un PRD.
11
+ tags: [proceso, requisitos, ajuste]
12
+
13
+ kinds:
14
+ - name: toca
15
+ describes: "una pieza de un tocado que el cambio toca: `artefacto` (uno de los tocados) y `pieza` (el id de un elemento del nivel de piezas de su línea base)"
16
+ - name: riesgo
17
+ describes: lo que más podría tocar el cambio y cómo se notaría en la comprobación; si no hay, uno solo con id `ninguno` y su `porque`
18
+ - name: requisito
19
+ describes: algo concreto que el sistema tiene que hacer o cumplir, con su cita del pedido
20
+ - name: documento
21
+ describes: el fichero del ajuste, en la carpeta de trabajo del paso
22
+
23
+ extractors:
24
+ - mechanism: path
25
+ kind: documento
26
+ pattern: "<nombre>.md"
27
+
28
+ levels:
29
+ - id: L0
30
+ requiredRoles: []
31
+ title: RADIO
32
+ instruction: >
33
+ Declara qué pieza toca el cambio, una `toca` por pieza, con `artefacto` (uno
34
+ de los tocados; cada tocado, al menos una) y `pieza` (el id de un elemento
35
+ del nivel de piezas de su último descenso certificado, el que se va a
36
+ heredar). Y pregúntate qué más toca esto: un `riesgo` por cada cosa que
37
+ podría romperse, con cómo se notaría en la comprobación (por ejemplo, que
38
+ las corridas guardadas se reproduzcan igual). Si de verdad no hay ninguno,
39
+ un solo `riesgo` con id `ninguno` y su `porque`.
40
+ - id: L1
41
+ requiredRoles: []
42
+ title: REQUISITOS
43
+ instruction: >
44
+ Declara los requisitos del ajuste y el fichero del ajuste (tipo
45
+ `documento`, con su `location`). Cada requisito lleva los atributos `tipo`
46
+ (`funcional` o `tecnico`), `requisito` (su id corto; con el de uno que ya
47
+ existe es una versión nueva), `titulo`, `sale_de` (la frase literal del
48
+ pedido de la persona, o de su respuesta a una pregunta), `porque` en un
49
+ `tecnico`, `aceptacion` y, si la unidad toca varios artefactos,
50
+ `artefacto`. Pocos: si hacen falta más de los que admite el carril, no es
51
+ un ajuste.
52
+ fanout:
53
+ min: 1
54
+ max: 10
@@ -0,0 +1,72 @@
1
+ # Autoría de un arquetipo.
2
+ #
3
+ # El arquetipo que se escribe es un fichero YAML de la carpeta de trabajo; el
4
+ # descenso llega hasta él. Al aprobarse el paso, Arketum lo publica en el
5
+ # catálogo que elige la persona; el hito del carril `arquetipo` lo confirma.
6
+ #
7
+ # Cambios:
8
+ # - 1.3.0: crea también formas de sistema (tipo `forma_de_sistema`, en `formas/`), cuando el levantamiento eligió una nueva.
9
+ # - 1.2.0: varios candidatos en un mismo paso (los que agrega la arquitectura).
10
+ # - 1.1.0: también un stack (`stacks/<nombre>.yaml` de la carpeta de trabajo),
11
+ # que se publica en `stacks/` del catálogo elegido.
12
+ name: arquetipo-autor
13
+ version: 1.3.0
14
+ description: >-
15
+ Escritura de un arquetipo nuevo: para qué tipo de artefacto, con qué tipos de elemento, extractores y niveles, hasta el fichero YAML que lo declara. Es el artefacto de trabajo del carril de arquetipo y, opcional, de los de producto nuevo y funcionalidad. Elígelo cuando ningún arquetipo de los catálogos describe lo que se va a construir.
16
+ tags: [proceso, arquetipo, politica]
17
+
18
+ kinds:
19
+ - name: objetivo
20
+ describes: "pieza de la solicitud (L0): qué tipo de artefacto describe el arquetipo"
21
+ - name: forma
22
+ describes: un tipo de elemento, un extractor o un nivel de la escalera que el arquetipo declara
23
+ - name: arquetipo
24
+ describes: el fichero YAML del arquetipo, en la carpeta de trabajo del paso
25
+ - name: stack
26
+ describes: "el fichero YAML de un stack (con qué se construye), en `stacks/` de la carpeta de trabajo del paso"
27
+ - name: forma_de_sistema
28
+ describes: "el fichero YAML de una forma de sistema (señales, `aplica`, diseño, huecos, variantes y escalones), en `formas/` de la carpeta de trabajo del paso"
29
+
30
+ extractors:
31
+ - mechanism: path
32
+ kind: arquetipo
33
+ pattern: "<nombre>.yaml"
34
+ - mechanism: path
35
+ kind: stack
36
+ pattern: "stacks/<nombre>.yaml"
37
+ - mechanism: path
38
+ kind: forma_de_sistema
39
+ pattern: "formas/<nombre>.yaml"
40
+
41
+ levels:
42
+ - id: L0
43
+ requiredRoles: []
44
+ title: SOLICITUD
45
+ instruction: >
46
+ Declara qué tipo de artefacto describirá el arquetipo y por qué ninguno de
47
+ los catálogos sirve.
48
+ - id: L1
49
+ requiredRoles: []
50
+ title: FORMA
51
+ instruction: >
52
+ Declara la forma: tipos de elemento, cómo se reconoce cada uno en el árbol
53
+ (extractores) y los niveles de la escalera con su instrucción.
54
+ fanout:
55
+ min: 1
56
+ max: 40
57
+ - id: L2
58
+ requiredRoles: []
59
+ title: ARQUETIPO
60
+ instruction: >
61
+ Declara el fichero del arquetipo (tipo `arquetipo`, con `location` a un
62
+ YAML de la carpeta de trabajo) o el de un stack (tipo `stack`, con
63
+ `location` a `stacks/<name>.yaml`). Tiene que cargar, su `name` es un slug
64
+ y el fichero se llama `<name>.yaml`. Si la arquitectura agrega varios,
65
+ uno por cada uno. Si el levantamiento eligió una forma de sistema nueva
66
+ («no_calza»), declara también su fichero (tipo `forma_de_sistema`, con
67
+ `location` a `formas/<name>.yaml`), con señales que su `aplica` cumple,
68
+ y, si sus variantes piden suelo o e2e, un stack con las fijaciones de
69
+ esa forma.
70
+ fanout:
71
+ min: 1
72
+ max: 20
@@ -0,0 +1,72 @@
1
+ # Arquitectura del sistema.
2
+ #
3
+ # Su último nivel es una propuesta de proyecto: los artefactos con su raíz, su
4
+ # arquetipo, sus dependencias y lo que se toca con ellos; el andamiaje; y la
5
+ # cobertura. Al aprobarse, fija los tocados (elementos de tipo `artefacto`).
6
+ #
7
+ # Cambios:
8
+ # - 1.1.0: un artefacto declara su arquetipo de una sola capa (`archetype`) o,
9
+ # con capas, `stack` (con qué se construye) y `componente` (de la variante de
10
+ # la forma del proyecto); Arketum compone el arquetipo efectivo.
11
+ # - 1.2.0: cada artefacto lleva su juicio de ajuste (`ajuste`, `por_que` y, si
12
+ # nada calza, `nuevo`): se entrega la mejor alternativa para el caso de uso, no
13
+ # la que hay a mano (convención `ajuste: obligatorio`).
14
+ name: arquitectura-de-sistema
15
+ version: 1.2.0
16
+ description: >-
17
+ Propuesta de cómo se parte un sistema en artefactos: raíz, arquetipo, dependencias y `touchWith` de cada uno, el andamiaje y la cobertura. Es el artefacto de trabajo de un producto nuevo y, opcional, de una funcionalidad que añade artefactos. Elígelo para decidir la forma del proyecto, no la de un artefacto.
18
+ tags: [proceso, arquitectura, proyecto]
19
+
20
+ kinds:
21
+ - name: objetivo
22
+ describes: "pieza de la solicitud (L0): qué sistema se quiere y con qué restricciones"
23
+ - name: componente
24
+ describes: una responsabilidad del sistema, antes de decidir en qué artefacto vive
25
+ - name: artefacto
26
+ describes: "un artefacto del proyecto; id = el del artefacto; atributos `root`, `archetype` (nombre o nombre@versión) o, con capas, `stack` (nombre o nombre@versión) y `componente` (de la variante de la forma del proyecto), `dependsOn` y `touchWith` (ids separados por comas); y el juicio de ajuste: `ajuste` («calza», «calza_con_reservas» o «no_calza»), `por_que` (los elementos del caso de uso que inclinan a esta elección; con reservas, cuáles) y, con «no_calza», `nuevo` (por qué ninguno de los que hay calza y qué tendría el que se agrega)"
27
+ - name: andamiaje
28
+ describes: "algo que ningún arquetipo gobierna; atributo `path` (acabado en / para una carpeta)"
29
+ - name: cobertura
30
+ describes: "la cobertura del proyecto; atributo `value`: aviso o bloquea"
31
+ - name: documento
32
+ describes: el fichero de la arquitectura o un diagrama, en la carpeta de trabajo del paso
33
+
34
+ extractors:
35
+ - mechanism: path
36
+ kind: documento
37
+ pattern: "<nombre>.md"
38
+
39
+ levels:
40
+ - id: L0
41
+ requiredRoles: []
42
+ title: SOLICITUD
43
+ instruction: >
44
+ Declara qué sistema se quiere, para qué y con qué restricciones (equipo,
45
+ plataforma, plazos).
46
+ - id: L1
47
+ requiredRoles: []
48
+ title: COMPONENTES
49
+ instruction: >
50
+ Declara las responsabilidades del sistema y cómo se relacionan, antes de
51
+ decidir cuántos artefactos hay.
52
+ fanout:
53
+ min: 1
54
+ max: 30
55
+ - id: L2
56
+ requiredRoles: []
57
+ title: PROYECTO
58
+ instruction: >
59
+ Declara la propuesta de proyecto: un elemento `artefacto` por artefacto (su
60
+ id es el del artefacto; atributos `root`, `archetype` —o, con capas,
61
+ `stack` y `componente`—, `dependsOn` y `touchWith`), un elemento
62
+ `andamiaje` por ruta que ningún arquetipo
63
+ gobierna (atributo `path`), un elemento `cobertura` (atributo `value`) y
64
+ el fichero de la arquitectura (tipo `documento`, con su `location`).
65
+ Cada `artefacto` lleva su juicio de ajuste: si lo elegido calza con el caso de uso (`ajuste`: calza, calza_con_reservas o no_calza), los elementos del caso que inclinan a esa elección (`por_que`) y, si nada de lo que hay en los catálogos calza, `nuevo`: por qué ninguno calza y qué tendría el que se agrega, con un nombre propio que no exista. Elige la mejor alternativa para el caso de uso, no la que está a mano: crear uno nuevo siempre es una alternativa; si se agrega, Arketum incluye el paso que lo crea y la persona lo aprueba allí.
66
+ fanout:
67
+ min: 1
68
+ max: 60
69
+
70
+ # El juicio de ajuste de cada artefacto de la propuesta lo exige Arketum al entregar el último nivel.
71
+ conventions:
72
+ ajuste: obligatorio
@@ -0,0 +1,104 @@
1
+ # Despliegue con Docker Compose.
2
+ #
3
+ # Artefacto del sistema de una sola capa: la definición del despliegue, la
4
+ # configuración de cada entorno (de ejemplo, nunca la real), su documentación y,
5
+ # si se quiere, una prueba de humo (`humo.sh`, ubicación sugerida, no exigida).
6
+ #
7
+ # Cambios:
8
+ # - 1.1.0: `verificacion` (`humo.sh`) deja de ser obligatoria: el hito `despliegue <entorno>` lo cumple la
9
+ # confirmación de la persona, y Arketum no exige una forma concreta de comprobar el despliegue. Su raíz es `despliegue/`, para no solaparse con una raíz
10
+ # `.`: el compose se invoca como `docker compose -f despliegue/compose.yaml`.
11
+ # Los demás modos (pipeline, script…) se publican por el paso `arquetipo`.
12
+ name: despliegue-compose
13
+ version: 1.1.0
14
+ description: >-
15
+ Despliegue de un sistema con Docker Compose: la definición (`compose.yaml`), la configuración de ejemplo de cada entorno (`<entorno>.env.example`, nunca `.env`), su documentación (`DESPLIEGUE.md`) y, si se quiere, una prueba de humo (`humo.sh`), en la raíz `despliegue/`. Elígelo cuando el levantamiento de infraestructura acuerde el modo `compose`.
16
+ tags: [despliegue, infraestructura, compose]
17
+ # Gobierna un artefacto de despliegue: el carril `despliegue` exige uno así entre los tocados. Un arquetipo propio de
18
+ # otro modo (pipeline, script…) lo declara igual.
19
+ despliegue: true
20
+
21
+ kinds:
22
+ - name: objetivo
23
+ describes: "pieza de la solicitud (L0): lo que se despliega y en qué entorno, de los técnicos del levantamiento"
24
+ - name: definicion
25
+ describes: la definición del despliegue (`compose.yaml`, o `compose.<entorno>.yaml` si un entorno la cambia)
26
+ - name: entorno
27
+ describes: "la configuración de ejemplo de un entorno (`<entorno>.env.example`): variables con marcadores, nunca valores secretos"
28
+ - name: verificacion
29
+ describes: "opcional: la prueba de humo (`humo.sh`), que comprueba contra lo desplegado que funciona, sin imprimir secretos"
30
+ - name: documentacion
31
+ describes: cómo se despliega, se verifica y se revierte cada entorno (`DESPLIEGUE.md`)
32
+
33
+ extractors:
34
+ - mechanism: path
35
+ kind: definicion
36
+ pattern: "compose.yaml"
37
+ alternatives: ["compose.<entorno>.yaml"]
38
+ - mechanism: path
39
+ kind: entorno
40
+ pattern: "<entorno>.env.example"
41
+ - mechanism: path
42
+ kind: verificacion
43
+ pattern: "humo.sh"
44
+ - mechanism: path
45
+ kind: documentacion
46
+ pattern: "DESPLIEGUE.md"
47
+
48
+ # Una definición sin documentación no la sabe operar nadie más. La prueba de humo
49
+ # no se exige: si corrió lo confirma la persona en el hito.
50
+ coRequirements:
51
+ - when: definicion
52
+ requires: [documentacion]
53
+ scope: artifact
54
+
55
+ conventions:
56
+ oficio.1: >-
57
+ Los secretos no van en el repositorio: un `.env` dentro de `despliegue/` queda sin reclamar y no cierra la unidad.
58
+ Sácalo del repositorio, declara en su lugar su referencia (`<esquema>:<ruta>`) en el levantamiento de
59
+ infraestructura y deja en `<entorno>.env.example` la variable con un marcador (`DB_PASSWORD=<desde vault:kv/app/db>`).
60
+ oficio.2: >-
61
+ La validación en seco es `docker compose -f despliegue/compose.yaml config --quiet`, desde la raíz del proyecto;
62
+ la exige el paso `preparado` como una ejecución `on: change` con código 0. No necesita el daemon de Docker (solo
63
+ lee y valida la definición): se ejecuta de verdad aunque no se pueda levantar nada.
64
+ oficio.3: >-
65
+ `humo.sh`, si lo hay, comprueba lo desplegado por el camino real (una petición HTTP, una orden del programa) y
66
+ termina con 0 si funciona; recibe el entorno como argumento y no imprime ningún secreto. Es una ayuda, no una
67
+ exigencia: el hito `despliegue <entorno>` lo cumple la persona al confirmar que se desplegó y corrió; su ejecución
68
+ `on: entorno` (o el reporte del CI) se entrega como respaldo y sale en la pregunta.
69
+ oficio.4: >-
70
+ `DESPLIEGUE.md` dice, por entorno, cómo se despliega, cómo se comprueba que corrió (con `humo.sh` si lo hay), cómo se revierte y de dónde salen
71
+ las variables de cada `<entorno>.env.example`.
72
+
73
+ levels:
74
+ - id: L0
75
+ requiredRoles: []
76
+ title: OBJETIVO
77
+ instruction: >
78
+ Declara qué se despliega y en qué entornos, atendiendo a los técnicos del
79
+ levantamiento de infraestructura (la entrada): el modo, cada entorno y lo
80
+ acordado de cada uno.
81
+ - id: L1
82
+ requiredRoles: []
83
+ title: PIEZAS
84
+ instruction: >
85
+ Propón las piezas: la definición, la configuración de ejemplo de cada
86
+ entorno (nunca la real: los secretos van por su referencia), la
87
+ documentación y, si ayuda, la prueba de humo. Un `.env` no es una pieza: queda fuera del
88
+ repositorio.
89
+ fanout:
90
+ min: 3
91
+ max: 20
92
+ - id: L2
93
+ requiredRoles: []
94
+ title: FICHEROS
95
+ instruction: >
96
+ Declara cada fichero con su `location`, relativa a `despliegue/`:
97
+ `compose.yaml`, `<entorno>.env.example`, `DESPLIEGUE.md` y, si lo hay,
98
+ `humo.sh`. Si
99
+ dentro de `despliegue/` hay un `.env`, sácalo del repositorio y declara su
100
+ referencia en el levantamiento de infraestructura: aquí no lo reclama
101
+ nadie, y una unidad con un fichero sin reclamar no cierra.
102
+ fanout:
103
+ min: 3
104
+ max: 30
@@ -0,0 +1,97 @@
1
+ # Digestión de un código que ya existe.
2
+ #
3
+ # Su último nivel es la estructura base del proyecto: los artefactos (con su
4
+ # stack y su componente, o su arquetipo), la forma con sus señales (cada una con
5
+ # las rutas del árbol que la sostienen), el andamiaje y la cobertura. Arketum
6
+ # añade en la guía de cada nivel lo que calcula del árbol: las raíces candidatas
7
+ # (por las ubicaciones de raíz de los stacks), el encaje de cada stack y lo que
8
+ # queda fuera. La variante y los escalones los deriva Arketum de las señales.
9
+ #
10
+ # Cambios:
11
+ # - 1.1.0: cada artefacto lleva su juicio de ajuste (`ajuste`, `por_que` y, si
12
+ # nada calza, `nuevo`), como en la arquitectura (convención `ajuste: obligatorio`).
13
+ # - 1.2.0: la forma también lleva su juicio de ajuste (`ajuste` y `por_que`); una
14
+ # digestión no crea formas: si ninguna calza, se crea antes con el carril de
15
+ # arquetipo, o se digiere con reservas (convención `ajuste_forma: obligatorio`).
16
+ # - 1.3.0: forzar una forma que no cumple su `aplica` lo elige la persona: su
17
+ # respuesta, en el atributo `eleccion` de la `forma`.
18
+ name: digestion
19
+ version: 1.3.0
20
+ description: >-
21
+ Digestión de un código que ya existe: de lo que hay en el árbol a la estructura base de Arketum (artefactos, forma con sus señales, andamiaje y cobertura), sin cambiar código ni inferir requisitos. Es el artefacto de trabajo del carril `digestion`.
22
+ tags: [proceso, digestion, proyecto]
23
+
24
+ kinds:
25
+ - name: raiz
26
+ describes: "una raíz candidata del árbol (L0); atributo `path`"
27
+ - name: fuera
28
+ describes: "un grupo de rutas que no cae en ninguna raíz candidata (L0); atributo `path`"
29
+ - name: decision
30
+ describes: "qué es una raíz o un grupo (L1): un artefacto con capas (`stack` y `componente`), uno de una sola capa (`archetype`) o andamiaje"
31
+ - name: artefacto
32
+ describes: "un artefacto del proyecto (L2); id = el del artefacto; atributos `root`, `archetype` (nombre o nombre@versión) o, con capas, `stack` y `componente`, `dependsOn` y `touchWith` (ids separados por comas); y el juicio de ajuste: `ajuste` («calza», «calza_con_reservas» o «no_calza»), `por_que` (los elementos del caso de uso que inclinan a esta elección; con reservas, cuáles) y, con «no_calza», `nuevo` (por qué ninguno de los que hay calza y qué tendría el que se agrega)"
33
+ - name: andamiaje
34
+ describes: "algo que ningún arquetipo gobierna (L2); atributo `path` (acabado en / para una carpeta)"
35
+ - name: cobertura
36
+ describes: "la cobertura del proyecto (L2); atributo `value`: aviso o bloquea"
37
+ - name: forma
38
+ describes: "la forma de sistema (L2); atributo `name`, su juicio de ajuste (`ajuste`: «calza», que cumple su `aplica`, o «calza_con_reservas», con lo que se fuerza; y `por_que`, lo que en el árbol inclina a ella) y, si no cumple su `aplica` sin reservas, `motivo`; si no cumple su `aplica`, `eleccion`: lo que respondió la persona a forzarla o crear una nueva; la variante y los escalones los deriva Arketum (si los declaras, `variante` y `escalones`, tienen que casar; si ninguna variante aplica, `motivo_variante`)"
39
+ - name: senal
40
+ describes: "una señal de la forma (L2); id = la señal; atributos `valor` (con su tipo), `porque` y `rutas` (rutas del árbol que la sostienen, separadas por comas)"
41
+ - name: retirar
42
+ describes: "en un proyecto con artefactos, uno que sale de `proyecto.yaml` (L2); id = el artefacto (sin raíz, sin unidad viva y sin requisitos vivos)"
43
+
44
+ levels:
45
+ - id: L0
46
+ requiredRoles: []
47
+ title: RAÍCES
48
+ instruction: >
49
+ Lee el árbol (rutas, no contenidos) y lo que Arketum calcula de él en esta
50
+ guía. Declara un elemento `raiz` por cada raíz que vayas a proponer
51
+ (atributo `path`; `.` es la raíz del proyecto) y un elemento `fuera` por
52
+ cada grupo de rutas que no cae en ninguna (atributo `path`).
53
+ fanout:
54
+ min: 1
55
+ max: 40
56
+ - id: L1
57
+ requiredRoles: []
58
+ title: STACKS
59
+ instruction: >
60
+ Por cada raíz y cada grupo de fuera, un elemento `decision` (con su padre
61
+ en L0): con capas, `stack` y `componente` (el stack con más encaje no es
62
+ obligatorio, pero lo que dejas sin reclamar sale en el gate); de una sola
63
+ capa, `archetype`; o `andamiaje`. Lee del código lo justo para decidir la
64
+ forma del sistema: cuántos despliegues, pantallas, actores e integraciones,
65
+ y qué rutas lo muestran.
66
+ fanout:
67
+ min: 1
68
+ max: 40
69
+ - id: L2
70
+ requiredRoles: []
71
+ title: ESTRUCTURA BASE
72
+ instruction: >
73
+ Declara la estructura base, cada elemento con su padre en L1: un
74
+ `artefacto` por artefacto (atributos `root` y `stack` y `componente`, o
75
+ `archetype`; `dependsOn` y `touchWith` si hacen falta), un `andamiaje` por
76
+ ruta que no gobierna nadie (atributo `path`), una `cobertura` (`aviso` sobre
77
+ un código que ya existe), la `forma` (atributo `name`) y una `senal` por
78
+ cada señal de la forma, con `valor`, `porque` y `rutas` (las rutas del árbol
79
+ que la sostienen). Lo que dejes fuera de toda raíz y del andamiaje no se
80
+ rechaza: sale en el gate como lo que queda fuera (será deriva
81
+ `fuera_de_raiz`), y la persona decide caso a caso.
82
+ La variante y los escalones los deriva Arketum de las señales. En un
83
+ proyecto con artefactos, `retirar` los que ya no tienen raíz. No declares
84
+ requisitos: sembrarlos es otra unidad.
85
+ La `forma` lleva también su juicio de ajuste (`ajuste` y `por_que`): una digestión no crea formas; si ninguna calza, se crea antes con el carril de arquetipo, o se digiere con reservas. Si la más cercana no cumple su `aplica`, forzarla lo elige la persona, no tú: Arketum te da la pregunta, y su respuesta va en el atributo `eleccion` de la `forma`.
86
+ Cada `artefacto` lleva su juicio de ajuste: si lo elegido calza con el caso de uso (`ajuste`: calza, calza_con_reservas o no_calza), los elementos del caso que inclinan a esa elección (`por_que`) y, si nada de lo que hay en los catálogos calza, `nuevo`: por qué ninguno calza y qué tendría el que se agrega, con un nombre propio que no exista. Elige la mejor alternativa para el caso de uso, no la que está a mano: crear uno nuevo siempre es una alternativa; si se agrega, Arketum incluye el paso que lo crea y la persona lo aprueba allí.
87
+ # Un elemento por artefacto y por andamiaje, la cobertura, la forma, sus
88
+ # señales (hasta siete en el catálogo de ejemplo) y lo que se retira: 120
89
+ # deja sitio a un monorepo de unas cien piezas sin partir la digestión.
90
+ fanout:
91
+ min: 1
92
+ max: 120
93
+
94
+ # El juicio de ajuste de cada artefacto de la estructura base lo exige Arketum al entregar el último nivel.
95
+ conventions:
96
+ ajuste: obligatorio
97
+ ajuste_forma: obligatorio
@@ -0,0 +1,131 @@
1
+ # Documento académico. LaTeX.
2
+ #
3
+ # Declara la forma de un documento que sostiene afirmaciones —una tesis, un
4
+ # artículo, un informe de investigación—, no el contenido de ninguno. No sabe
5
+ # de qué trata.
6
+ #
7
+ # Este arquetipo existe además para probar algo: si la escalera solo sirviera
8
+ # para código, aquí se rompería.
9
+ name: documento-academico
10
+ version: 1.0.0
11
+ description: >-
12
+ Documento que sostiene afirmaciones con fuentes (tesis, artículo, informe de investigación), en LaTeX. Desciende de la pregunta a la estructura, las afirmaciones y sus dependencias, hasta el manuscrito. Elígelo cuando el artefacto sea prosa que tiene que poder defenderse, no documentación de un sistema.
13
+ tags: [documento, investigacion, latex]
14
+
15
+ kinds:
16
+ - name: objetivo
17
+ describes: "pieza de la solicitud (L0): qué se quiere demostrar"
18
+ - name: capitulo
19
+ describes: sección mayor con una tesis propia
20
+ - name: afirmacion
21
+ describes: lo que un capítulo sostiene y que puede ser falso
22
+ - name: figura
23
+ describes: imagen, diagrama o gráfico
24
+ - name: pie
25
+ describes: texto que explica una figura y la hace citable
26
+ - name: referencia
27
+ describes: entrada bibliográfica
28
+ - name: dato
29
+ describes: fichero de datos que respalda una afirmación
30
+ - name: dependencia
31
+ describes: arista del cableado (L3) entre dos piezas declaradas
32
+ - name: documento
33
+ describes: fichero de política o de notas
34
+
35
+ extractors:
36
+ - mechanism: path
37
+ kind: capitulo
38
+ pattern: "capitulos/<nombre>.tex"
39
+ - mechanism: path
40
+ kind: figura
41
+ pattern: "figuras/<nombre>.pdf"
42
+ - mechanism: path
43
+ kind: pie
44
+ pattern: "figuras/<nombre>.tex"
45
+ - mechanism: path
46
+ kind: referencia
47
+ pattern: "bibliografia/<nombre>.bib"
48
+ - mechanism: path
49
+ kind: dato
50
+ pattern: "datos/<nombre>.csv"
51
+
52
+ # Una figura sin pie no se puede citar ni entender fuera de su página. Es el
53
+ # mismo co-requisito que «implementación necesita prueba», en otro dominio.
54
+ coRequirements:
55
+ - when: figura
56
+ requires: [pie]
57
+ scope: artifact
58
+
59
+ levels:
60
+ - id: L0
61
+ requiredRoles: []
62
+ title: PREGUNTA
63
+ instruction: >
64
+ Declara qué se quiere demostrar y ante quién. Una pregunta que no puede
65
+ responderse «no» no es una pregunta de investigación.
66
+ - id: L1
67
+ requiredRoles: [introduccion, desarrollo, conclusion]
68
+ title: ESTRUCTURA
69
+ instruction: >
70
+ Propón la estructura de capítulos y qué cubre cada uno. Todo documento que
71
+ sostiene algo plantea, desarrolla y concluye; si tu estructura no distingue
72
+ esas tres funciones, no está estructurada.
73
+ fanout:
74
+ min: 3
75
+ max: 15
76
+ - id: L2
77
+ requiredRoles: []
78
+ title: AFIRMACIONES
79
+ instruction: >
80
+ Declara qué afirma cada capítulo y con qué evidencia lo sostiene. Una
81
+ afirmación que ninguna evidencia puede desmentir no es una afirmación:
82
+ decláralo si es el caso, en vez de disfrazarla.
83
+ fanout:
84
+ min: 1
85
+ max: 40
86
+ - id: L3
87
+ requiredRoles: []
88
+ title: DEPENDENCIAS
89
+ instruction: >
90
+ Declara qué afirmación se apoya en cuál. Si una cadena de apoyos vuelve
91
+ sobre sí misma, el documento razona en círculo y este nivel es donde se ve.
92
+ fanout:
93
+ min: 1
94
+ max: 50
95
+ - id: L4
96
+ requiredRoles: []
97
+ title: MANUSCRITO
98
+ instruction: >
99
+ Escribe el texto. Cada figura viene con su pie y cada afirmación con la
100
+ referencia o el dato que la sostiene.
101
+ fanout:
102
+ min: 1
103
+ max: 60
104
+
105
+ # La autorrevisión: qué tiene que comprobar quien entrega, y con qué acción.
106
+ #
107
+ # La escalera comprueba los saltos ENTRE niveles. Nadie comprueba que el
108
+ # manuscrito responda la pregunta que se declaró en L0, porque no hay peldaño
109
+ # anterior contra el que reconciliar. Eso es lo que cierra esta sección.
110
+ selfReview:
111
+ criteria:
112
+ - check: Toda cita tiene fuente localizable y la fuente dice lo que se le atribuye
113
+ how: >
114
+ Recorre las citas una a una, abre la fuente y contrasta la afirmación con
115
+ el pasaje. Una fuente que no se pudo abrir cuenta como no comprobada.
116
+ evidence: medida
117
+ - check: El formato de referencias es el declarado y es uniforme en todo el documento
118
+ how: Compara todas las entradas contra el estilo declarado en L1.
119
+ evidence: medida
120
+ - check: No hay afirmaciones que se contradigan entre secciones
121
+ how: >
122
+ Contrasta cada afirmación de L2 con las demás, en particular las de
123
+ secciones distintas que hablen del mismo objeto.
124
+ evidence: juicio
125
+ - check: La estructura entregada es la que se declaró en L1
126
+ evidence: juicio
127
+ - check: El manuscrito responde la pregunta declarada en L0, y no otra
128
+ evidence: juicio
129
+ groundingCheck: true
130
+ groundingScope: alguna fuente, cita, dato o afirmación
131
+ assumptionsMustDeclare: true
@@ -0,0 +1,42 @@
1
+ # Inventario funcional de un sistema existente.
2
+ #
3
+ # Antes de migrar, qué hace hoy el sistema: las funciones que no se pueden
4
+ # perder. Es la línea de partida del plan de migración.
5
+ name: inventario-funcional
6
+ version: 1.1.0
7
+ description: >-
8
+ Qué hace hoy un sistema existente, función a función, antes de migrarlo: lo que no se puede perder. Es el primer artefacto de trabajo del carril de migración. Elígelo para describir un sistema que ya existe; para pedir algo nuevo corresponde un PRD.
9
+ tags: [proceso, migracion, inventario]
10
+
11
+ kinds:
12
+ - name: objetivo
13
+ describes: "pieza de la solicitud (L0): qué sistema se inventaría y para qué migración"
14
+ - name: funcion
15
+ describes: algo que el sistema hace hoy y que alguien usa
16
+ - name: documento
17
+ describes: el fichero del inventario, 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: SISTEMA
28
+ instruction: >
29
+ Declara qué sistema se inventaría, dónde vive y hacia dónde se migra.
30
+ - id: L1
31
+ requiredRoles: []
32
+ title: FUNCIONES
33
+ instruction: >
34
+ Declara las funciones del sistema actual, cada una con quién la usa, y el
35
+ fichero del inventario (tipo `documento`, con su `location`). Una función
36
+ que nadie usa se declara igual: decidir si se pierde es del plan. Una
37
+ función puede sembrar el índice de requisitos del sistema con los mismos
38
+ atributos que un requisito del PRD (`tipo`, `requisito`, `titulo`,
39
+ `sale_de` y los demás): aprobar el inventario los acuerda.
40
+ fanout:
41
+ min: 1
42
+ max: 80