@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.
- package/CHANGELOG.md +140 -0
- package/LICENSE +42 -0
- package/README.md +67 -2
- package/THIRD-PARTY-NOTICES +2428 -0
- package/catalogo-de-ejemplo/agentes.yaml +11 -0
- package/catalogo-de-ejemplo/arquetipos/ajuste.yaml +54 -0
- package/catalogo-de-ejemplo/arquetipos/arquetipo-autor.yaml +72 -0
- package/catalogo-de-ejemplo/arquetipos/arquitectura-de-sistema.yaml +72 -0
- package/catalogo-de-ejemplo/arquetipos/despliegue-compose.yaml +104 -0
- package/catalogo-de-ejemplo/arquetipos/digestion.yaml +97 -0
- package/catalogo-de-ejemplo/arquetipos/documento-academico.yaml +131 -0
- package/catalogo-de-ejemplo/arquetipos/inventario-funcional.yaml +42 -0
- package/catalogo-de-ejemplo/arquetipos/levantamiento-de-infraestructura.yaml +117 -0
- package/catalogo-de-ejemplo/arquetipos/plan-de-migracion.yaml +40 -0
- package/catalogo-de-ejemplo/arquetipos/prd.yaml +62 -0
- package/catalogo-de-ejemplo/arquetipos/radio-de-alcance.yaml +141 -0
- package/catalogo-de-ejemplo/arquetipos/rca.yaml +68 -0
- package/catalogo-de-ejemplo/arquetipos/servicio-con-integracion.yaml +154 -0
- package/catalogo-de-ejemplo/carriles/ajuste.yaml +14 -0
- package/catalogo-de-ejemplo/carriles/arquetipo.yaml +13 -0
- package/catalogo-de-ejemplo/carriles/comprobacion.yaml +23 -0
- package/catalogo-de-ejemplo/carriles/correccion.yaml +25 -0
- package/catalogo-de-ejemplo/carriles/despliegue.yaml +36 -0
- package/catalogo-de-ejemplo/carriles/digestion.yaml +14 -0
- package/catalogo-de-ejemplo/carriles/funcionalidad.yaml +34 -0
- package/catalogo-de-ejemplo/carriles/migracion.yaml +27 -0
- package/catalogo-de-ejemplo/carriles/nuevo.yaml +30 -0
- package/catalogo-de-ejemplo/formas/aplicacion-por-capas.yaml +185 -0
- package/catalogo-de-ejemplo/formas/juego-terminal.yaml +161 -0
- package/catalogo-de-ejemplo/formas/monorepo-de-aplicaciones.yaml +207 -0
- package/catalogo-de-ejemplo/incluido.yaml +3 -0
- package/catalogo-de-ejemplo/stacks/go/e2e-terminal/e2e_http.py +36 -0
- package/catalogo-de-ejemplo/stacks/go/e2e-terminal/pytest.ini +5 -0
- package/catalogo-de-ejemplo/stacks/go/e2e-terminal/requirements.txt +2 -0
- package/catalogo-de-ejemplo/stacks/go/e2e-terminal/terminal_e2e.py +112 -0
- package/catalogo-de-ejemplo/stacks/go/e2e-terminal/terminal_prueba.py +118 -0
- package/catalogo-de-ejemplo/stacks/go/suelo-aplicacion-por-capas/requirements.txt +1 -0
- package/catalogo-de-ejemplo/stacks/go/suelo-aplicacion-por-capas/suelo.py +102 -0
- package/catalogo-de-ejemplo/stacks/go/suelo-aplicacion-por-capas/terminal_prueba.py +118 -0
- package/catalogo-de-ejemplo/stacks/go/suelo-juego-terminal/requirements.txt +1 -0
- package/catalogo-de-ejemplo/stacks/go/suelo-juego-terminal/suelo.py +86 -0
- package/catalogo-de-ejemplo/stacks/go/suelo-juego-terminal/terminal_prueba.py +118 -0
- package/catalogo-de-ejemplo/stacks/go.yaml +74 -0
- package/catalogo-de-ejemplo/stacks/python/e2e-terminal/e2e_http.py +36 -0
- package/catalogo-de-ejemplo/stacks/python/e2e-terminal/pytest.ini +5 -0
- package/catalogo-de-ejemplo/stacks/python/e2e-terminal/requirements.txt +2 -0
- package/catalogo-de-ejemplo/stacks/python/e2e-terminal/terminal_e2e.py +112 -0
- package/catalogo-de-ejemplo/stacks/python/e2e-terminal/terminal_prueba.py +118 -0
- package/catalogo-de-ejemplo/stacks/python/suelo-aplicacion-por-capas/requirements.txt +1 -0
- package/catalogo-de-ejemplo/stacks/python/suelo-aplicacion-por-capas/suelo.py +102 -0
- package/catalogo-de-ejemplo/stacks/python/suelo-aplicacion-por-capas/terminal_prueba.py +118 -0
- package/catalogo-de-ejemplo/stacks/python/suelo-juego-terminal/requirements.txt +1 -0
- package/catalogo-de-ejemplo/stacks/python/suelo-juego-terminal/suelo.py +86 -0
- package/catalogo-de-ejemplo/stacks/python/suelo-juego-terminal/terminal_prueba.py +118 -0
- package/catalogo-de-ejemplo/stacks/python.yaml +167 -0
- package/catalogo-de-ejemplo/stacks/typescript/e2e-node/app.mjs +182 -0
- package/catalogo-de-ejemplo/stacks/typescript/e2e-node/requirements.txt +1 -0
- package/catalogo-de-ejemplo/stacks/typescript/e2e-node/terminal_prueba.py +118 -0
- package/catalogo-de-ejemplo/stacks/typescript/e2e-node/terminal_puente.py +51 -0
- package/catalogo-de-ejemplo/stacks/typescript/e2e-node/vitest.config.mjs +12 -0
- package/catalogo-de-ejemplo/stacks/typescript/suelo-aplicacion-por-capas/requirements.txt +1 -0
- package/catalogo-de-ejemplo/stacks/typescript/suelo-aplicacion-por-capas/suelo.py +102 -0
- package/catalogo-de-ejemplo/stacks/typescript/suelo-aplicacion-por-capas/terminal_prueba.py +118 -0
- package/catalogo-de-ejemplo/stacks/typescript/suelo-juego-terminal/requirements.txt +1 -0
- package/catalogo-de-ejemplo/stacks/typescript/suelo-juego-terminal/suelo.py +86 -0
- package/catalogo-de-ejemplo/stacks/typescript/suelo-juego-terminal/terminal_prueba.py +118 -0
- package/catalogo-de-ejemplo/stacks/typescript.yaml +88 -0
- package/dist/mcp/arketum.js +3 -0
- package/dist/mcp/ci-cli.js +2 -0
- package/dist/mcp/cli.js +2 -0
- package/dist/mcp/comun-ZEXDDERM.js +1 -0
- package/dist/mcp/comun-ZTEHRDHC.js +1 -0
- package/dist/mcp/panel-cli.js +2 -0
- package/dist/mcp/telemetria-cli.js +1 -0
- package/package.json +33 -4
- package/server.json +15 -0
- 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.
|