@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,36 @@
1
+ # Desplegar es parte del trabajo guiado. Antes de preparar el despliegue hay un
2
+ # levantamiento completo de la infraestructura (que puede quedar pendiente: el
3
+ # cuestionario lo genera Arketum y se escribe fuera del repositorio); el modo se
4
+ # elige después de entender; el despliegue es un artefacto del sistema
5
+ # (`despliegue-compose` en este catálogo), y el hito lo cumple la persona al
6
+ # confirmar que se desplegó y corrió.
7
+ #
8
+ # Cambios:
9
+ # - 1.1.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.
10
+ name: despliegue
11
+ version: 1.1.0
12
+ when: Desplegar un sistema que existe por primera vez, en un entorno nuevo, o cambiar lo acordado de un entorno.
13
+ milestones: [despliegue]
14
+ steps:
15
+ # El levantamiento de infraestructura: los papeles de la fase 1, con la instrucción del nivel por delante en lo técnico.
16
+ - { id: infraestructura, kind: artifact, archetype: { name: levantamiento-de-infraestructura }, gate: true, pendientes: true, feeds: [sistema, preparado] }
17
+ # Añade el artefacto de despliegue al proyecto si todavía no existe.
18
+ - { id: arquitectura, kind: artifact, archetype: { name: arquitectura-de-sistema }, optional: true, gate: true }
19
+ # Publica el arquetipo de un modo que no está en los catálogos (pipeline, script…).
20
+ - { id: arquetipo, kind: artifact, archetype: { name: arquetipo-autor }, optional: true, gate: true }
21
+ - { id: sistema, kind: system, fedBy: [infraestructura] }
22
+ - id: preparado
23
+ kind: evidence
24
+ fedBy: [infraestructura]
25
+ # Además, la verificación de cada referencia verificable del levantamiento (`infraestructura/<id>`, `on: entorno`).
26
+ requires:
27
+ - { id: validacion, describes: "la validación en seco de la definición del despliegue (en el compose, `docker compose -f despliegue/compose.yaml config --quiet`)", classes: [execution], expect: success, on: change }
28
+ - id: hito
29
+ kind: milestone
30
+ optional: true
31
+ gate: true
32
+ # `despliegue <entorno>`: exige la confirmación de la persona por el canal interactivo
33
+ # (`despliegue/<entorno>/confirmacion`: «¿se desplegó en <entorno> y corrió?», sí o no); una ejecución
34
+ # o un reporte del CI son respaldo opcional. No se completa mientras una decisión de antes de
35
+ # desplegar ese entorno siga por decidir.
36
+ confirmacion: true
@@ -0,0 +1,14 @@
1
+ # Digerir un código que ya existe: proponer su estructura base (los artefactos
2
+ # con su stack y su componente o su arquetipo, la forma con su variante y sus
3
+ # escalones, el andamiaje y la cobertura), que la persona confirma en el gate.
4
+ # Al aprobarse, Arketum la escribe en `proyecto.yaml` sin fijar tocados ni
5
+ # cambiar código; no infiere requisitos funcionales. En un proyecto que ya tiene
6
+ # artefactos, legaliza lo que está fuera de lo declarado (y retira artefactos sin
7
+ # raíz, sin unidad viva y sin requisitos).
8
+ name: digestion
9
+ version: 1.0.0
10
+ when: Un código que ya existe sin la estructura base de Arketum, o lo que está fuera de lo declarado en un proyecto que ya la tiene.
11
+ milestones: []
12
+ steps:
13
+ - { id: digestion, kind: artifact, archetype: { name: digestion }, gate: true, digestion: true }
14
+ - { id: arquetipo, kind: artifact, archetype: { name: arquetipo-autor }, optional: true, gate: true }
@@ -0,0 +1,34 @@
1
+ # Una funcionalidad en un sistema que existe: se pide (PRD), se acota (radio de
2
+ # alcance) y se construye en los artefactos tocados, con aceptación y sin
3
+ # regresiones.
4
+ #
5
+ # Cambios:
6
+ # - 1.2.0: la aceptación exige además las salidas de los tocados (`salidas: true`).
7
+ # - 1.3.0: el hito `despliegue <entorno>` cuenta (`humo: true`): exige la prueba de humo y que el entorno exista.
8
+ # - 1.4.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.
9
+ # - 1.5.0: el radio de alcance y la arquitectura opcional son gates del proceso (`gate: proceso`): una delegación de la persona los aprueba; lo que se construye (el PRD) y el hito siguen siendo de ella.
10
+ name: funcionalidad
11
+ version: 1.5.0
12
+ when: Añadir o cambiar una funcionalidad de un sistema que ya existe.
13
+ milestones: [despliegue, entrega, ejecucion]
14
+ steps:
15
+ - { id: prd, kind: artifact, archetype: { name: prd }, gate: true, levantamiento: true, feeds: [sistema] }
16
+ - { id: radio-de-alcance, kind: artifact, archetype: { name: radio-de-alcance }, gate: proceso, feeds: [sistema] }
17
+ - { id: arquitectura, kind: artifact, archetype: { name: arquitectura-de-sistema }, optional: true, gate: proceso }
18
+ - { id: arquetipo, kind: artifact, archetype: { name: arquetipo-autor }, optional: true, gate: true }
19
+ - { id: sistema, kind: system, fedBy: [prd, radio-de-alcance] }
20
+ - id: aceptacion
21
+ # Además de lo suyo, las salidas de cada tocado cuyo arquetipo efectivo las pide:
22
+ # el suelo y la suite e2e entera, con sus comandos compuestos (`salidas/<artefacto>/…`).
23
+ salidas: true
24
+ kind: evidence
25
+ requires:
26
+ - { id: aceptacion, describes: la funcionalidad hace lo que pide el PRD, classes: [execution], expect: success }
27
+ - { id: no-regresion, describes: lo que ya funcionaba sigue funcionando, classes: [execution], expect: success }
28
+ - id: hito
29
+ kind: milestone
30
+ optional: true
31
+ gate: true
32
+ confirmacion: true
33
+ requires:
34
+ - { id: cumplido, describes: la persona confirma que el hito se cumplió, classes: [statement] }
@@ -0,0 +1,27 @@
1
+ # Una migración: qué hace hoy el sistema, cómo se mueve (el plan fija los
2
+ # tocados) y la evidencia de que funciona después. El inventario lo aprueba la
3
+ # persona y alimenta al sistema: lo que hoy hace el sistema lo tiene que atender
4
+ # lo migrado, y sus funciones pueden sembrar el índice de requisitos.
5
+ #
6
+ # Cambios:
7
+ # - 1.2.0: el hito `despliegue <entorno>` cuenta (`humo: true`): exige la prueba de humo y que el entorno exista.
8
+ # - 1.3.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.
9
+ name: migracion
10
+ version: 1.3.0
11
+ when: Llevar un sistema existente a otra forma, plataforma o arquitectura sin perder lo que hace.
12
+ milestones: [despliegue, entrega, ejecucion]
13
+ steps:
14
+ - { id: inventario, kind: artifact, archetype: { name: inventario-funcional }, gate: true, feeds: [sistema] }
15
+ - { id: plan, kind: artifact, archetype: { name: plan-de-migracion }, gate: true, fixesTouches: true, feeds: [sistema] }
16
+ - { id: sistema, kind: system, fedBy: [inventario, plan] }
17
+ - id: evidencia
18
+ kind: evidence
19
+ requires:
20
+ - { id: funciona, describes: lo migrado hace lo que hacía, classes: [execution], expect: success }
21
+ - id: hito
22
+ kind: milestone
23
+ optional: true
24
+ gate: true
25
+ confirmacion: true
26
+ requires:
27
+ - { id: cumplido, describes: la persona confirma que el hito se cumplió, classes: [statement] }
@@ -0,0 +1,30 @@
1
+ # Un producto nuevo: del PRD a la arquitectura, que fija los artefactos, y de
2
+ # ahí al sistema, aceptado con evidencia.
3
+ #
4
+ # Cambios:
5
+ # - 1.2.0: la aceptación exige además las salidas de los tocados (`salidas: true`).
6
+ # - 1.3.0: el hito `despliegue <entorno>` cuenta (`humo: true`): exige la prueba de humo y que el entorno exista.
7
+ # - 1.4.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.
8
+ name: nuevo
9
+ version: 1.4.0
10
+ when: Un producto o sistema que todavía no existe, sin proyecto que tocar.
11
+ milestones: [despliegue, entrega, ejecucion]
12
+ steps:
13
+ - { id: prd, kind: artifact, archetype: { name: prd }, gate: true, levantamiento: true, feeds: [sistema] }
14
+ - { id: arquitectura, kind: artifact, archetype: { name: arquitectura-de-sistema }, gate: true, fixesTouches: true }
15
+ - { id: arquetipo, kind: artifact, archetype: { name: arquetipo-autor }, optional: true, gate: true }
16
+ - { id: sistema, kind: system, fedBy: [prd] }
17
+ - id: aceptacion
18
+ # Además de lo suyo, las salidas de cada tocado cuyo arquetipo efectivo las pide:
19
+ # el suelo y la suite e2e entera, con sus comandos compuestos (`salidas/<artefacto>/…`).
20
+ salidas: true
21
+ kind: evidence
22
+ requires:
23
+ - { id: aceptacion, describes: el producto hace lo que pide el PRD, classes: [execution, statement], expect: success }
24
+ - id: hito
25
+ kind: milestone
26
+ optional: true
27
+ gate: true
28
+ confirmacion: true
29
+ requires:
30
+ - { id: cumplido, describes: la persona confirma que el hito se cumplió, classes: [statement] }
@@ -0,0 +1,185 @@
1
+ # Forma de sistema: una aplicación de un solo despliegue, con datos que
2
+ # persisten o con varias pantallas o actores.
3
+ #
4
+ # Cambios:
5
+ # - 1.2.0: los papeles de la fase 2 (`implementador` y `revisor`) y las
6
+ # salidas (`suelo` y `e2e`) en las dos variantes; el contrato de arranque
7
+ # en el `oficio` del componente.
8
+ # - 1.1.0: señales `pantallas` y `actores`; variantes (`simple` y `completa`,
9
+ # con el componente `aplicacion`) y los escalones `varios-actores`,
10
+ # `varias-pantallas` e `integraciones`. Un artefacto con capas declara `stack`
11
+ # y `componente: aplicacion`; la profundidad la pone la variante.
12
+ name: aplicacion-por-capas
13
+ version: 1.2.0
14
+ description: >-
15
+ Una aplicación de un solo despliegue con datos que persisten, o con varias pantallas o actores: sus reglas separadas de cómo se guardan los datos y de cómo se usa.
16
+ orden: 2
17
+ senales:
18
+ despliegues: numero
19
+ integraciones: numero
20
+ pantallas: numero
21
+ actores: numero
22
+ aplica:
23
+ - [despliegues, '<=', 1]
24
+ - [integraciones, '<=', 3]
25
+ diseno:
26
+ - Una sola aplicación, con sus reglas separadas de cómo se guardan los datos y de cómo se usa (pantallas o comandos).
27
+ - Lo que se guarda sobrevive a cerrar y volver a abrir; si no se puede leer, se avisa y no se sigue con vacío ni se sobrescribe.
28
+ - Las reglas que dependen del tiempo reciben el instante; no dependen de cuándo se ejecutan.
29
+ huecos:
30
+ - Qué datos se guardan, de dónde salen los primeros y qué tiene que seguir ahí al cerrar y volver a abrir.
31
+ - Qué se calcula a partir del tiempo (días, semanas, cambios de fecha) y desde cuándo cuenta.
32
+ - Quién la usa, para qué cada uno, y qué puede cambiar cada uno.
33
+ - Qué hay que poder corregir cuando alguien se equivoca, y si importa lo que había antes.
34
+ - Qué pasa si los datos guardados se estropean o no se pueden leer.
35
+
36
+ variantes:
37
+ - nombre: simple
38
+ aplica:
39
+ - [actores, '<=', 1]
40
+ - [pantallas, '<=', 2]
41
+ papeles: &papeles
42
+ - nombre: implementador
43
+ para_que: construye el sistema en el paso de sistema (el código, sus pruebas y las salidas que exige el paso de evidencia)
44
+ texto: >-
45
+ PAPEL: IMPLEMENTADOR (fase 2). Construyes lo acordado, nada más: los requisitos que trae la unidad y los técnicos vigentes, con el oficio del arquetipo.
46
+ Desciendes cada artefacto tocado nivel a nivel y el código se queda como lo pide su stack; no lo deformas para encajar.
47
+ Cada funcional que construyes lleva su prueba de extremo a extremo, que arranca el artefacto por su contrato de arranque y lo usa como una persona:
48
+ una prueba que llama por dentro a una función que el camino real no usa no demuestra nada.
49
+ Copias las fijaciones del catálogo tal cual y no las editas. Corres tú las pruebas, el suelo y la suite e2e entera, y vinculas cada ejecución
50
+ a sus requisitos con `satisfies`. No rebajas ni borras una prueba para que pase. Si algo que funcionaba se rompe, lo arreglas;
51
+ si no puedes, lo reportas con `solicitar` (`pide: defecto`) y decide la persona. Nunca lo escondes.
52
+ - nombre: revisor
53
+ para_que: revisa en el paso de evidencia que lo construido funciona por el camino real, antes de entregar la evidencia
54
+ texto: >-
55
+ PAPEL: REVISOR (fase 2). No escribes el código: lo revisas como lo usaría la persona. Compruebas que cada funcional construido tiene su prueba e2e,
56
+ que arranca el artefacto por su contrato de arranque y no lo llama por dentro, y que pasa; que las fijaciones del catálogo no se tocaron;
57
+ y miras las pruebas modificadas o borradas desde la foto (las lista el resumen del paso): si alguna se rebajó para que pase, lo dices.
58
+ Corres el suelo y la suite e2e entera con el comando compuesto exacto y entregas esa evidencia. Lo que falla no lo das por bueno:
59
+ se arregla, o se reporta como defecto con `solicitar` y decide la persona. Si un funcional no admite una prueba automática
60
+ (un correo, algo visual, una integración externa), lo pides con `solicitar` (`pide: sin_e2e`), con el motivo.
61
+ salidas: { suelo: true, e2e: true }
62
+ componentes:
63
+ - nombre: aplicacion
64
+ oficio: &oficio
65
+ - "Arranque: la aplicación se lanza con `sh arrancar.sh` desde la raíz del artefacto, en una terminal. Recibe del entorno `DATOS_DIR` (la carpeta de sus datos) y `PUERTO` (si sirve HTTP, escucha en 127.0.0.1 en ese puerto). Escribe en la terminal qué es y cómo se sale, responde a lo que se teclea, termina limpio (código 0) con `q`, con `salir` y Enter o al cerrarse la entrada, y vuelve a arrancar con los datos que dejó."
66
+ description: >-
67
+ La aplicación entera, en tres peldaños: lo que se pide, sus capas y el código, con el dominio separado del almacén y de la interfaz.
68
+ kinds:
69
+ - { name: objetivo, describes: "pieza de la solicitud (L0), sin ubicación en el árbol", ubicado: false }
70
+ - { name: modulo, describes: la definición del paquete o del módulo, ubicado: true }
71
+ - { name: dominio, describes: "las entidades y sus reglas, puras: sin ficheros, sin interfaz y sin leer el reloj", ubicado: true }
72
+ - { name: almacen, describes: guardar y cargar el estado, ubicado: true }
73
+ - { name: servicio, describes: "un caso de uso por acción, sobre el dominio y el almacén, sin interfaz", ubicado: true }
74
+ - { name: interfaz, describes: "la presentación y la lectura de órdenes; llama a los servicios", ubicado: true }
75
+ - { name: cliente, describes: el único sitio que habla con otro sistema, ubicado: true }
76
+ - { name: arranque, describes: "compone almacén, servicios e interfaz y arranca", ubicado: true }
77
+ - { name: prueba, describes: fichero de prueba, ubicado: true }
78
+ coRequirements:
79
+ - { when: servicio, requires: [prueba] }
80
+ levels:
81
+ - id: L0
82
+ requiredRoles: []
83
+ title: SOLICITUD
84
+ instruction: Declara qué tiene que hacer la aplicación, para quién y qué tiene que seguir ahí al cerrarla y volver a abrirla.
85
+ - id: L1
86
+ requiredRoles: []
87
+ title: CAPAS
88
+ instruction: Propón las piezas por capa (dominio, almacén, servicios, interfaz, arranque), con el dominio sin ficheros ni interfaz.
89
+ fanout: { min: 3, max: 16 }
90
+ - id: L2
91
+ requiredRoles: []
92
+ title: IMPLEMENTACIÓN
93
+ instruction: Escribe el código; cada servicio con su prueba, que no abre la interfaz.
94
+ fanout: { min: 1, max: 60 }
95
+ selfReview:
96
+ criteria:
97
+ - check: La interfaz solo llama a los servicios; nunca al almacén ni a ficheros
98
+ how: Busca en la interfaz cualquier uso del almacén o de ficheros.
99
+ evidence: medida
100
+ - check: Lo que se guarda sobrevive a cerrar y volver a abrir, y un fallo al leerlo se avisa
101
+ how: Lee la prueba que guarda, vuelve a cargar y la que lee un fichero estropeado.
102
+ evidence: medida
103
+ - nombre: completa
104
+ aplica: []
105
+ papeles: *papeles
106
+ salidas: { suelo: true, e2e: true }
107
+ componentes:
108
+ - nombre: aplicacion
109
+ oficio: *oficio
110
+ description: >-
111
+ La aplicación entera, en cinco peldaños: lo que se pide, sus capas, sus contratos, el cableado y el código.
112
+ kinds:
113
+ - { name: objetivo, describes: "pieza de la solicitud (L0), sin ubicación en el árbol", ubicado: false }
114
+ - { name: modulo, describes: la definición del paquete o del módulo, ubicado: true }
115
+ - { name: dominio, describes: "las entidades y sus reglas, puras: sin ficheros, sin interfaz y sin leer el reloj", ubicado: true }
116
+ - { name: almacen, describes: guardar y cargar el estado, ubicado: true }
117
+ - { name: servicio, describes: "un caso de uso por acción, sobre el dominio y el almacén, sin interfaz", ubicado: true }
118
+ - { name: interfaz, describes: "la presentación y la lectura de órdenes; llama a los servicios", ubicado: true }
119
+ - { name: cliente, describes: el único sitio que habla con otro sistema, ubicado: true }
120
+ - { name: arranque, describes: "compone almacén, servicios e interfaz y arranca", ubicado: true }
121
+ - { name: prueba, describes: fichero de prueba, ubicado: true }
122
+ - { name: dependencia, describes: "arista del cableado (L3) entre dos piezas declaradas", ubicado: false }
123
+ coRequirements:
124
+ - { when: servicio, requires: [prueba] }
125
+ - { when: almacen, requires: [prueba] }
126
+ levels:
127
+ - id: L0
128
+ requiredRoles: []
129
+ title: SOLICITUD
130
+ instruction: Declara qué tiene que hacer la aplicación, para quién y qué tiene que seguir ahí al cerrarla y volver a abrirla.
131
+ - id: L1
132
+ requiredRoles: []
133
+ title: CAPAS
134
+ instruction: Propón las piezas por capa (dominio, almacén, servicios, interfaz, arranque), con el dominio sin ficheros ni interfaz.
135
+ fanout: { min: 3, max: 20 }
136
+ - id: L2
137
+ requiredRoles: []
138
+ title: CONTRATOS
139
+ instruction: Declara cada caso de uso con lo que recibe, lo que devuelve y cómo falla; y qué guarda el almacén.
140
+ fanout: { min: 1, max: 40 }
141
+ - id: L3
142
+ requiredRoles: []
143
+ title: CABLEADO
144
+ instruction: Declara qué depende de qué; el dominio no depende de nadie y la interfaz solo de los servicios.
145
+ fanout: { min: 1, max: 50 }
146
+ - id: L4
147
+ requiredRoles: []
148
+ title: IMPLEMENTACIÓN
149
+ instruction: Escribe el código; cada servicio y el almacén con su prueba, que no abre la interfaz.
150
+ fanout: { min: 1, max: 90 }
151
+ selfReview:
152
+ criteria:
153
+ - check: La interfaz solo llama a los servicios; nunca al almacén ni a ficheros
154
+ how: Sigue las dependencias declaradas en L3 desde la interfaz.
155
+ evidence: medida
156
+ - check: Lo que se guarda sobrevive a cerrar y volver a abrir, y un fallo al leerlo se avisa
157
+ how: Lee la prueba que guarda, vuelve a cargar y la que lee un fichero estropeado.
158
+ evidence: medida
159
+
160
+ escalones:
161
+ - nombre: varios-actores
162
+ cuando:
163
+ - [actores, '>=', 2]
164
+ diseno:
165
+ - Cada actor tiene su vía y solo ve lo suyo; lo que es de gestión no se mezcla con el uso diario.
166
+ huecos:
167
+ - Qué puede hacer cada actor y qué no, y cómo se sabe quién es.
168
+ oficio:
169
+ - Cada actor tiene su vía en la interfaz; lo que es de gestión no se mezcla con el uso diario.
170
+ - nombre: varias-pantallas
171
+ cuando:
172
+ - [pantallas, '>=', 3]
173
+ oficio:
174
+ - Cada pantalla es una función de la interfaz con su propia lectura de órdenes; un mismo menú no se copia en varios sitios.
175
+ - nombre: integraciones
176
+ cuando:
177
+ - [integraciones, '>=', 1]
178
+ diseno:
179
+ - Cada sistema ajeno se usa a través de un solo sitio, que se puede sustituir por un doble para probar.
180
+ huecos:
181
+ - Qué pasa cuando el otro sistema falla, tarda o responde algo inesperado.
182
+ oficio:
183
+ - Cada cliente de otro sistema tiene un doble para probar sin el sistema real, que cubre el fallo y la demora.
184
+ coRequirements:
185
+ - { when: cliente, requires: [prueba] }
@@ -0,0 +1,161 @@
1
+ # Forma de sistema: un juego de una pantalla en la terminal, para una persona,
2
+ # sin datos que guardar.
3
+ #
4
+ # Cambios:
5
+ # - 1.2.0: los papeles de la fase 2 (`implementador` y `revisor`) y las
6
+ # salidas (`suelo` y `e2e`) en las dos variantes; el contrato de arranque
7
+ # en el `oficio` del componente.
8
+ # - 1.1.0: variantes (`simple` y `completa`, con el componente `juego`) y el
9
+ # escalón `varias-pantallas`. Un artefacto con capas declara `stack` y
10
+ # `componente: juego`; la profundidad la pone la variante.
11
+ name: juego-terminal
12
+ version: 1.2.0
13
+ description: >-
14
+ Un juego de una pantalla en la terminal, para una persona, sin datos que guardar entre partidas ni otros sistemas.
15
+ orden: 1
16
+ senales:
17
+ pantallas: numero
18
+ actores: numero
19
+ persistencia: booleano
20
+ integraciones: numero
21
+ despliegues: numero
22
+ aplica:
23
+ - [pantallas, '<=', 3]
24
+ - [actores, '<=', 1]
25
+ - [persistencia, '==', false]
26
+ - [integraciones, '==', 0]
27
+ - [despliegues, '<=', 1]
28
+ diseno:
29
+ - Un solo programa de una pantalla, sin datos que guardar entre partidas.
30
+ - La lógica del juego (estado, reglas, puntuación) está separada de cómo se dibuja y de cómo se leen las teclas.
31
+ huecos:
32
+ - Con qué teclas se juega y cómo se sale.
33
+ - Cómo empieza y cómo termina una partida, y qué se ve al terminar.
34
+ - Contra quién o qué se juega y qué lo hace más difícil.
35
+ - En qué tamaño de pantalla tiene que caber y qué pasa si no cabe.
36
+
37
+ # De la más simple a la más completa: vale la primera cuyo `aplica` se cumple.
38
+ variantes:
39
+ - nombre: simple
40
+ aplica:
41
+ - [pantallas, '<=', 1]
42
+ papeles: &papeles
43
+ - nombre: implementador
44
+ para_que: construye el sistema en el paso de sistema (el código, sus pruebas y las salidas que exige el paso de evidencia)
45
+ texto: >-
46
+ PAPEL: IMPLEMENTADOR (fase 2). Construyes lo acordado, nada más: los requisitos que trae la unidad y los técnicos vigentes, con el oficio del arquetipo.
47
+ Desciendes cada artefacto tocado nivel a nivel y el código se queda como lo pide su stack; no lo deformas para encajar.
48
+ Cada funcional que construyes lleva su prueba de extremo a extremo, que arranca el artefacto por su contrato de arranque y lo usa como una persona:
49
+ una prueba que llama por dentro a una función que el camino real no usa no demuestra nada.
50
+ Copias las fijaciones del catálogo tal cual y no las editas. Corres tú las pruebas, el suelo y la suite e2e entera, y vinculas cada ejecución
51
+ a sus requisitos con `satisfies`. No rebajas ni borras una prueba para que pase. Si algo que funcionaba se rompe, lo arreglas;
52
+ si no puedes, lo reportas con `solicitar` (`pide: defecto`) y decide la persona. Nunca lo escondes.
53
+ - nombre: revisor
54
+ para_que: revisa en el paso de evidencia que lo construido funciona por el camino real, antes de entregar la evidencia
55
+ texto: >-
56
+ PAPEL: REVISOR (fase 2). No escribes el código: lo revisas como lo usaría la persona. Compruebas que cada funcional construido tiene su prueba e2e,
57
+ que arranca el artefacto por su contrato de arranque y no lo llama por dentro, y que pasa; que las fijaciones del catálogo no se tocaron;
58
+ y miras las pruebas modificadas o borradas desde la foto (las lista el resumen del paso): si alguna se rebajó para que pase, lo dices.
59
+ Corres el suelo y la suite e2e entera con el comando compuesto exacto y entregas esa evidencia. Lo que falla no lo das por bueno:
60
+ se arregla, o se reporta como defecto con `solicitar` y decide la persona. Si un funcional no admite una prueba automática
61
+ (un correo, algo visual, una integración externa), lo pides con `solicitar` (`pide: sin_e2e`), con el motivo.
62
+ salidas: { suelo: true, e2e: true }
63
+ componentes:
64
+ - nombre: juego
65
+ oficio: &oficio
66
+ - "Arranque: el juego se lanza con `sh arrancar.sh` desde la raíz del artefacto, en una terminal, y juega en ella. Termina limpio con `q`. A una pantalla más pequeña de la que necesita, avisa o sale limpio, sin traza."
67
+ description: >-
68
+ El juego entero, en tres peldaños: lo que se pide, sus partes y el código, con la lógica separada de la pantalla.
69
+ kinds:
70
+ - { name: objetivo, describes: "pieza de la solicitud (L0), sin ubicación en el árbol", ubicado: false }
71
+ - { name: modulo, describes: la definición del paquete o del módulo, ubicado: true }
72
+ - { name: dominio, describes: "el estado, las reglas y la puntuación, sin dibujar ni leer teclas", ubicado: true }
73
+ - { name: interfaz, describes: cómo se dibuja la pantalla y cómo se leen las teclas, ubicado: true }
74
+ - { name: arranque, describes: el punto de entrada del programa, ubicado: true }
75
+ - { name: prueba, describes: fichero de prueba, ubicado: true }
76
+ coRequirements:
77
+ - { when: dominio, requires: [prueba] }
78
+ levels:
79
+ - id: L0
80
+ requiredRoles: []
81
+ title: SOLICITUD
82
+ instruction: Declara qué juego se quiere, cómo se juega y cómo se gana o se pierde.
83
+ - id: L1
84
+ requiredRoles: []
85
+ title: PARTES
86
+ instruction: Propón las partes, con la lógica del juego separada de cómo se dibuja y de cómo se leen las teclas.
87
+ fanout: { min: 2, max: 12 }
88
+ - id: L2
89
+ requiredRoles: []
90
+ title: IMPLEMENTACIÓN
91
+ instruction: Escribe el código; la lógica se prueba sin terminal.
92
+ fanout: { min: 1, max: 40 }
93
+ selfReview:
94
+ criteria:
95
+ - check: La lógica del juego se prueba sin abrir la terminal
96
+ how: Busca en las pruebas del dominio cualquier uso de la pantalla o de las teclas.
97
+ evidence: medida
98
+ - check: Lo implementado es el juego que se pidió en L0, y no uno parecido
99
+ evidence: juicio
100
+ - nombre: completa
101
+ aplica: []
102
+ papeles: *papeles
103
+ salidas: { suelo: true, e2e: true }
104
+ componentes:
105
+ - nombre: juego
106
+ oficio: *oficio
107
+ description: >-
108
+ El juego entero, en cinco peldaños: lo que se pide, sus partes, sus contratos, el cableado y el código.
109
+ kinds:
110
+ - { name: objetivo, describes: "pieza de la solicitud (L0), sin ubicación en el árbol", ubicado: false }
111
+ - { name: modulo, describes: la definición del paquete o del módulo, ubicado: true }
112
+ - { name: dominio, describes: "el estado, las reglas y la puntuación, sin dibujar ni leer teclas", ubicado: true }
113
+ - { name: interfaz, describes: cómo se dibuja la pantalla y cómo se leen las teclas, ubicado: true }
114
+ - { name: arranque, describes: el punto de entrada del programa, ubicado: true }
115
+ - { name: prueba, describes: fichero de prueba, ubicado: true }
116
+ - { name: dependencia, describes: "arista del cableado (L3) entre dos piezas declaradas", ubicado: false }
117
+ coRequirements:
118
+ - { when: dominio, requires: [prueba] }
119
+ levels:
120
+ - id: L0
121
+ requiredRoles: []
122
+ title: SOLICITUD
123
+ instruction: Declara qué juego se quiere, cómo se juega y cómo se gana o se pierde.
124
+ - id: L1
125
+ requiredRoles: []
126
+ title: PARTES
127
+ instruction: Propón las partes, con la lógica del juego separada de cómo se dibuja y de cómo se leen las teclas.
128
+ fanout: { min: 2, max: 14 }
129
+ - id: L2
130
+ requiredRoles: []
131
+ title: CONTRATOS
132
+ instruction: Declara qué ofrece cada parte a las demás, y qué pasa en los bordes (la pantalla pequeña, la tecla que no vale).
133
+ fanout: { min: 1, max: 30 }
134
+ - id: L3
135
+ requiredRoles: []
136
+ title: CABLEADO
137
+ instruction: Declara qué depende de qué; la lógica no depende de la pantalla.
138
+ fanout: { min: 1, max: 40 }
139
+ - id: L4
140
+ requiredRoles: []
141
+ title: IMPLEMENTACIÓN
142
+ instruction: Escribe el código; la lógica se prueba sin terminal.
143
+ fanout: { min: 1, max: 70 }
144
+ selfReview:
145
+ criteria:
146
+ - check: La lógica del juego se prueba sin abrir la terminal
147
+ how: Busca en las pruebas del dominio cualquier uso de la pantalla o de las teclas.
148
+ evidence: medida
149
+ - check: Lo implementado es el juego que se pidió en L0, y no uno parecido
150
+ evidence: juicio
151
+
152
+ escalones:
153
+ - nombre: varias-pantallas
154
+ cuando:
155
+ - [pantallas, '>=', 2]
156
+ diseno:
157
+ - Cada pantalla tiene su propia lectura de teclas; un mismo menú no se copia en varios sitios.
158
+ huecos:
159
+ - Cómo se pasa de una pantalla a otra y cómo se vuelve.
160
+ oficio:
161
+ - Cada pantalla es una función de la interfaz con su propia lectura de teclas.