@dforce2055/dai 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +30 -0
- package/CHANGELOG.md +46 -0
- package/CODE_OF_CONDUCT.md +37 -0
- package/CONTRIBUTING.md +66 -0
- package/LICENSE +674 -0
- package/README.md +288 -0
- package/SECURITY.md +37 -0
- package/VERSION +1 -0
- package/cli/dai.mjs +692 -0
- package/cli/lib/ac-hash.mjs +74 -0
- package/cli/lib/args.mjs +23 -0
- package/cli/lib/bootstrap.mjs +74 -0
- package/cli/lib/env.mjs +23 -0
- package/cli/lib/forge-api.mjs +96 -0
- package/cli/lib/forge-url.mjs +61 -0
- package/cli/lib/fsutil.mjs +24 -0
- package/cli/lib/implements.mjs +94 -0
- package/cli/lib/link-us.mjs +59 -0
- package/cli/lib/pm-adapter.mjs +59 -0
- package/cli/lib/pm-clickup.mjs +54 -0
- package/cli/lib/pm-jira.mjs +123 -0
- package/cli/lib/pr.mjs +53 -0
- package/cli/lib/us.mjs +36 -0
- package/docs/EJEMPLO-END-TO-END.md +330 -0
- package/docs/MANIFIESTO.md +114 -0
- package/docs/METODOLOGIA.md +254 -0
- package/docs/PROBAR.md +91 -0
- package/docs/SCRUM-CON-IA.md +190 -0
- package/docs/adr/0001-contrato-ac-hash.md +86 -0
- package/docs/adr/0002-agnostico-del-asistente.md +87 -0
- package/docs/adr/0003-deteccion-y-estampado-son-comandos.md +73 -0
- package/docs/adr/0004-ubicacion-y-schema-implements.md +94 -0
- package/docs/adr/0005-superficie-comandos-y-stamp.md +65 -0
- package/docs/adr/0006-distribucion-y-licencia.md +59 -0
- package/docs/adr/0007-modelo-de-autenticacion.md +63 -0
- package/docs/adr/README.md +19 -0
- package/docs/detalle/01-refinamiento.md +33 -0
- package/docs/detalle/02-planning.md +27 -0
- package/docs/detalle/03-ramas.md +32 -0
- package/docs/detalle/04-tdd.md +35 -0
- package/docs/detalle/05-smoke.md +32 -0
- package/docs/detalle/06-code-review.md +34 -0
- package/docs/detalle/07-merge-trazabilidad.md +33 -0
- package/docs/detalle/08-daily.md +29 -0
- package/docs/detalle/09-review.md +25 -0
- package/docs/detalle/10-retro.md +27 -0
- package/docs/detalle/README.md +20 -0
- package/docs/glosario.md +79 -0
- package/docs/guias/dev.md +66 -0
- package/docs/guias/lead.md +53 -0
- package/docs/guias/po.md +50 -0
- package/governance/branch-naming.md +36 -0
- package/governance/ci-rules.md +57 -0
- package/governance/commit-convention.md +76 -0
- package/index.html +479 -0
- package/install.sh +19 -0
- package/manifest.yaml +76 -0
- package/package.json +55 -0
- package/skills/dai-review/SKILL.md +78 -0
- package/skills/doc-to-backlog/SKILL.md +70 -0
- package/skills/doc-to-backlog/templates/backlog-candidato.md +49 -0
- package/skills/grill-epic/SKILL.md +76 -0
- package/skills/grill-intent/SKILL.md +43 -0
- package/skills/grill-intent/templates/intent.md +36 -0
- package/skills/grill-user-story/SKILL.md +76 -0
- package/skills/grill-user-story/templates/user-story.md +61 -0
- package/skills/link-us/SKILL.md +42 -0
- package/skills/link-us/templates/implements.yaml +16 -0
- package/skills/tdd/SKILL.md +109 -0
- package/skills/tdd/deep-modules.md +33 -0
- package/skills/tdd/interface-design.md +31 -0
- package/skills/tdd/mocking.md +59 -0
- package/skills/tdd/refactoring.md +10 -0
- package/skills/tdd/tests.md +61 -0
- package/templates/adr.md +43 -0
- package/templates/commit-msg +48 -0
- package/templates/definition-of-done.md +50 -0
- package/templates/definition-of-ready.md +51 -0
- package/templates/epica.md +62 -0
- package/templates/formato-us.md +129 -0
- package/templates/pull-request.md +62 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dai-review
|
|
3
|
+
description: Revisa una Pull/Merge Request de un repo remoto (GitHub o GitLab) de forma consciente de la metodología dai, y deja un comentario estándar en español con errores y mejoras. Corre `dai check` (¿la US está atrasada?), valida el Definition of Done, hace el review de código (correctitud + calidad), compone el comentario estándar y lo postea — vía el MCP del forge si está disponible, o vía `dai forge comment` (token) si no. Invocar como /dai-review <URL-de-la-PR o número>. Usar en el paso 6 de SCRUM-CON-IA (code review), antes de que un partner humano firme.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# dai-review — review de PR consciente de la metodología
|
|
7
|
+
|
|
8
|
+
Es el **primer pase** del paso 6 (code review). No reemplaza al partner humano: le
|
|
9
|
+
saca el ruido para que firme lo que importa ([Art. 5](../../docs/MANIFIESTO.md#art-5) del manifiesto). Funciona igual
|
|
10
|
+
en **GitHub y GitLab**.
|
|
11
|
+
|
|
12
|
+
## Las dos caras (cómo postea el comentario)
|
|
13
|
+
|
|
14
|
+
Mismo comentario estándar, dos formas de dejarlo (elige la disponible, en este orden):
|
|
15
|
+
|
|
16
|
+
1. **MCP del forge** — si hay un MCP de GitHub/GitLab conectado, postea por ahí.
|
|
17
|
+
2. **CLI con token** — si no, `dai forge comment <ref> --body-file <archivo>`. Usa
|
|
18
|
+
`GITHUB_TOKEN`/`GITLAB_TOKEN` del `.env` (token scopeado, **nunca** contraseña).
|
|
19
|
+
|
|
20
|
+
> **Auth:** git (traer la branch) usa **SSH**; comentar la PR usa **token del forge**
|
|
21
|
+
> (comentar no se puede por SSH). Cero contraseñas.
|
|
22
|
+
|
|
23
|
+
## Input
|
|
24
|
+
|
|
25
|
+
- **Ref de la PR/MR:** URL completa o solo el número (con el remoto git configurado).
|
|
26
|
+
- Si no viene, intenta inferirla de la branch actual; si no, pedila.
|
|
27
|
+
|
|
28
|
+
## Proceso
|
|
29
|
+
|
|
30
|
+
1. **Resolver la PR** — `dai forge pr <ref>` (o el MCP) para título, descripción, branch.
|
|
31
|
+
2. **Traer el diff** — `git fetch` + `git diff <base>...<branch>` (local, por SSH). No
|
|
32
|
+
dependas de la API para el diff.
|
|
33
|
+
3. **Chequeos de metodología (mecánicos, deterministas):**
|
|
34
|
+
- `dai check` → ¿la US quedó **atrasada** (ac_hash) respecto de la viva?
|
|
35
|
+
- ¿existe `implements.yaml`? (si es un PR de producto, es obligatorio)
|
|
36
|
+
- **Definition of Done** (`templates/definition-of-done.md`): cuenta cuántos ítems cumple.
|
|
37
|
+
4. **Review de código (criterio, no mecánico):** busca
|
|
38
|
+
- 🔴 **Errores** de correctitud (bugs, casos borde, seguridad).
|
|
39
|
+
- 🟡 **Mejoras** de calidad (reuso, simplicidad, eficiencia).
|
|
40
|
+
- ✅ Lo que está **bien** (refuerza lo bueno).
|
|
41
|
+
5. **Componer el comentario estándar** (ver formato abajo).
|
|
42
|
+
6. **Postear** por MCP o `dai forge comment`. Confirmar el link al comentario.
|
|
43
|
+
|
|
44
|
+
## El comentario estándar
|
|
45
|
+
|
|
46
|
+
Es el mismo que emite `renderReviewComment` del CLI — respeta esta forma:
|
|
47
|
+
|
|
48
|
+
```markdown
|
|
49
|
+
## 🤖 dai-review
|
|
50
|
+
|
|
51
|
+
**US:** `ABC-482` @ v1 · `dai check`: ✅ al día
|
|
52
|
+
**Definition of Done:** 4/5
|
|
53
|
+
|
|
54
|
+
### 🔴 Errores (correctitud)
|
|
55
|
+
- <hallazgo concreto con archivo:línea>
|
|
56
|
+
|
|
57
|
+
### 🟡 Mejoras (calidad, reuso, simplicidad)
|
|
58
|
+
- <sugerencia concreta>
|
|
59
|
+
|
|
60
|
+
### ✅ Lo que está bien
|
|
61
|
+
- <algo real y específico>
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
_Revisión asistida por dai. La aprobación la firma un humano (Art. 5 del manifiesto)._
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Dos cortes duros
|
|
68
|
+
|
|
69
|
+
1. **No aprobar.** La skill **comenta**, no firma la aprobación. Eso es de un humano.
|
|
70
|
+
2. **Hallazgos concretos.** Nada de "mejorar la calidad" en abstracto: archivo, línea,
|
|
71
|
+
y el porqué. Si no es accionable, no va.
|
|
72
|
+
|
|
73
|
+
## Relación con el modelo
|
|
74
|
+
|
|
75
|
+
- Es el paso 6 de [`SCRUM-CON-IA.md`](../../docs/SCRUM-CON-IA.md).
|
|
76
|
+
- Se apoya en `dai check` (ADR-0003) y en el forge adapter (`dai forge`, ADR-0002:
|
|
77
|
+
lo mecánico en el CLI, la inteligencia en la skill).
|
|
78
|
+
- El comentario estándar hace que todos los reviews del equipo se lean igual.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: doc-to-backlog
|
|
3
|
+
description: Toma un documento de análisis (PDF, Word, o un archivo en Drive/SharePoint/ClickUp vía MCP) y produce un BACKLOG CANDIDATO — un mapa de épicas y User Stories propuestas — para que el funcional lo priorice y lo valide. NO emite US ni épicas finales: extrae candidatos marcados "sin validar" y hace handoff de cada sobreviviente a grill-epic / grill-user-story (modo refinar). Es la puerta de entrada del caso "llegué con un documento y quiero sacar el backlog". Invocar como /doc-to-backlog con el path o el link del documento. Usar antes de grill-epic / grill-user-story cuando el input es un doc grande.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# doc-to-backlog
|
|
7
|
+
|
|
8
|
+
Convierte un **documento de análisis** en un **backlog candidato** (épicas + US), para
|
|
9
|
+
arrancar el trabajo funcional cuando el input no es una idea suelta sino un PDF/Word con
|
|
10
|
+
todo el proyecto adentro.
|
|
11
|
+
|
|
12
|
+
Llena [templates/backlog-candidato.md](templates/backlog-candidato.md) — es la única
|
|
13
|
+
fuente de verdad de la forma del mapa. Nunca lo reescribas inline.
|
|
14
|
+
|
|
15
|
+
## El principio que NO se negocia
|
|
16
|
+
|
|
17
|
+
**El documento SIEMBRA el grilling, no lo reemplaza.** Un doc tienta a "genera 40 US de
|
|
18
|
+
una" — eso es vibe coding de requerimientos: salen US que nadie validó, de features que
|
|
19
|
+
quizás nadie necesita. Por eso esta skill **no publica nada final**: produce **candidatos**,
|
|
20
|
+
el humano prioriza, y recién ahí cada ítem pasa por su grill ([Art. 4](../../docs/MANIFIESTO.md#art-4) y Art. 5).
|
|
21
|
+
|
|
22
|
+
## Input
|
|
23
|
+
|
|
24
|
+
- **El documento:** path a un PDF/Word local, o un link a Drive/SharePoint/ClickUp
|
|
25
|
+
(traelo por **MCP** si está conectado). Claude lee PDFs de forma nativa.
|
|
26
|
+
- Si no viene, pedirlo.
|
|
27
|
+
|
|
28
|
+
## Proceso — 3 fases
|
|
29
|
+
|
|
30
|
+
### ① Extraer (la IA lee)
|
|
31
|
+
|
|
32
|
+
1. Leer el documento entero.
|
|
33
|
+
2. Armar el **mapa de candidatos**: las **épicas** que el doc sugiere, y bajo cada una,
|
|
34
|
+
las **US candidatas**. Cada ítem con un título corto y una línea de qué cubre.
|
|
35
|
+
3. **Anotar la procedencia:** de qué sección/página del doc salió cada candidato (para
|
|
36
|
+
poder trazar de vuelta al análisis).
|
|
37
|
+
4. Marcar TODO como **`sin validar`**. Es una hipótesis, no un backlog final.
|
|
38
|
+
|
|
39
|
+
### ② Triage (el humano decide)
|
|
40
|
+
|
|
41
|
+
5. Presentar el mapa y **frenar**: el doc es un **menú, no un mandato**. Pedir al
|
|
42
|
+
funcional que **priorice y corte** — qué entra, qué queda para después, qué se
|
|
43
|
+
descarta. No todo lo que está en el doc hay que construirlo.
|
|
44
|
+
6. Para lo dudoso, sugerir pasar por `/grill-intent` (Gate 0): ¿este ítem resuelve un
|
|
45
|
+
problema real, o está en el doc "por las dudas"?
|
|
46
|
+
|
|
47
|
+
### ③ Routear (cada sobreviviente a su grill)
|
|
48
|
+
|
|
49
|
+
7. **No grillar todo de golpe.** Empezar por la **rebanada priorizada** (las 1–3 épicas o
|
|
50
|
+
US más importantes), no las 40 (Art. 14).
|
|
51
|
+
8. Handoff, en modo **refinar** (el doc pre-llena, el grill cubre solo los huecos):
|
|
52
|
+
- épica candidata → `/grill-epic` (con el fragmento del doc como fuente)
|
|
53
|
+
- US candidata (suelta) → `/grill-user-story`
|
|
54
|
+
9. Recién en ese paso se publica en el tracker, testeable y linkeable (`dai link-us`).
|
|
55
|
+
|
|
56
|
+
## Dos cortes duros
|
|
57
|
+
|
|
58
|
+
1. **No emitir US/épicas finales desde el doc.** Solo candidatos. Lo final sale del grill,
|
|
59
|
+
con el humano respondiendo. Si te descubres "completando" criterios que el doc no dice,
|
|
60
|
+
detente: eso lo define el funcional en el grill.
|
|
61
|
+
2. **No ahogar.** Un doc de 60 páginas puede sugerir 50 ítems. Prioriza y entrega la
|
|
62
|
+
rebanada de arriba; el resto queda en el mapa candidato, listo para más tarde.
|
|
63
|
+
|
|
64
|
+
## Relación con el modelo
|
|
65
|
+
|
|
66
|
+
- **Es la puerta de entrada** del caso bulk. Reemplaza "idea suelta" por "doc" como fuente.
|
|
67
|
+
- **Abajo:** `grill-epic` (épicas) y `grill-user-story` (US) toman cada candidato y lo
|
|
68
|
+
vuelven artefacto válido. `grill-intent` desafía el problema de los dudosos.
|
|
69
|
+
- **No toca el link:** el `implements.yaml` y el `ac_hash` viven a nivel US, mucho después
|
|
70
|
+
(`dai link-us`). Esta skill solo prepara el QUÉ.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
BACKLOG CANDIDATO · lo produce la skill doc-to-backlog
|
|
3
|
+
─────────────────────────────────────────────────────────────────
|
|
4
|
+
Es un BORRADOR para triage, NO un backlog final. Nada de acá se publica
|
|
5
|
+
en el tracker hasta que pase por grill-epic / grill-user-story.
|
|
6
|
+
Todo arranca en estado "sin validar".
|
|
7
|
+
-->
|
|
8
|
+
|
|
9
|
+
# Backlog candidato — <nombre del proyecto>
|
|
10
|
+
|
|
11
|
+
> **Fuente:** <documento.pdf / link de Drive> · Extraído por `doc-to-backlog`
|
|
12
|
+
> **Estado:** 🟡 candidato, sin validar — pendiente de triage y grilling.
|
|
13
|
+
|
|
14
|
+
## Resumen
|
|
15
|
+
|
|
16
|
+
2–3 líneas de qué es el proyecto según el documento. Sin interpretar de más.
|
|
17
|
+
|
|
18
|
+
## Épicas candidatas
|
|
19
|
+
|
|
20
|
+
### E1 · <título de la épica> 🟡 sin validar
|
|
21
|
+
- **Qué cubre:** <una línea>
|
|
22
|
+
- **Procedencia:** <sección / página del doc>
|
|
23
|
+
- **Prioridad:** _(la pone el funcional en el triage)_
|
|
24
|
+
- **US candidatas:**
|
|
25
|
+
- [ ] <título US> — <una línea> · _proc: <ref>_
|
|
26
|
+
- [ ] <título US> — <una línea> · _proc: <ref>_
|
|
27
|
+
|
|
28
|
+
### E2 · <título de la épica> 🟡 sin validar
|
|
29
|
+
- **Qué cubre:** …
|
|
30
|
+
- **US candidatas:** …
|
|
31
|
+
|
|
32
|
+
## US sueltas candidatas (sin épica)
|
|
33
|
+
|
|
34
|
+
- [ ] <título US> — <una línea> · _proc: <ref>_
|
|
35
|
+
|
|
36
|
+
## Dudas para el triage
|
|
37
|
+
|
|
38
|
+
Ítems que quizás NO haya que construir (candidatos a `/grill-intent` — Gate 0):
|
|
39
|
+
|
|
40
|
+
- <ítem> — <por qué es dudoso / qué habría que confirmar>
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
<!--
|
|
45
|
+
PRÓXIMO PASO (no lo hace esta skill sola):
|
|
46
|
+
1. El funcional prioriza y corta este mapa (menú, no mandato).
|
|
47
|
+
2. La rebanada de arriba se rutea: épicas → /grill-epic, US → /grill-user-story.
|
|
48
|
+
3. Recién ahí se publica en el tracker, testeable y linkeable.
|
|
49
|
+
-->
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: grill-epic
|
|
3
|
+
description: Interroga a un PO o analista funcional para producir una ÉPICA bien formada — un bloque grande de valor de negocio que se parte en varias User Stories — siguiendo el template del método. O toma una US que resultó demasiado grande y la promueve a épica. Se queda a nivel funcional/alcance: define el objetivo de negocio y la partición en US, NUNCA criterios de aceptación (esos viven en cada US) ni diseño técnico. Al terminar, publica la épica en Jira/ClickUp (o deja un .md) y hace handoff de cada US hija a grill-user-story. Invocar como /grill-epic, opcionalmente con un título, un ID/URL del tracker, o una US grande a promover. Usar cuando algo es demasiado grande para una sola US.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# grill-epic
|
|
7
|
+
|
|
8
|
+
Producir una **épica** por interrogación, no por generación. Una épica es un **bloque
|
|
9
|
+
grande de valor de negocio** que se parte en varias User Stories. Es el nivel de
|
|
10
|
+
arriba de la US: define el **alcance**, no el detalle.
|
|
11
|
+
|
|
12
|
+
Llena [templates/epica.md](../../templates/epica.md) — es la única fuente de verdad de
|
|
13
|
+
la forma. Nunca reescribas el formato inline.
|
|
14
|
+
|
|
15
|
+
## Qué es (y qué NO es) una épica
|
|
16
|
+
|
|
17
|
+
- **Es** un contenedor: agrupa US que juntas entregan una capacidad grande.
|
|
18
|
+
- **No se implementa directamente** — las US que la componen son las que viajan por el
|
|
19
|
+
flujo (`grill-user-story` → `dai link-us` → …). El link QUÉ↔CÓMO vive a nivel US.
|
|
20
|
+
- **No tiene criterios de aceptación** — esos son de cada US. La épica tiene objetivo
|
|
21
|
+
de negocio, alcance y métricas de éxito.
|
|
22
|
+
|
|
23
|
+
## Inputs (cualquier combinación)
|
|
24
|
+
|
|
25
|
+
- **Título** — nombre corto de la épica.
|
|
26
|
+
- **ID / URL del tracker** — si ya existe el ticket.
|
|
27
|
+
- **Fuente:**
|
|
28
|
+
- *Desde cero* — solo una idea grande. Grillar desde 0.
|
|
29
|
+
- *Promover una US* — una US que resultó demasiado grande (viene de `grill-user-story`).
|
|
30
|
+
Leerla, y usar su contenido como material para la partición.
|
|
31
|
+
|
|
32
|
+
## Dos cortes duros (no negociables)
|
|
33
|
+
|
|
34
|
+
1. **Cortar en los criterios de aceptación.** Si la charla deriva a definir ACs
|
|
35
|
+
testeables, frenar: "eso es de cada US, no de la épica". La épica define *qué
|
|
36
|
+
capacidades* entran, no *cómo se verifica cada una*.
|
|
37
|
+
2. **Cortar en lo técnico.** Endpoints, tablas, arquitectura → es diseño, va mucho
|
|
38
|
+
después. La épica es puro negocio de alto nivel.
|
|
39
|
+
|
|
40
|
+
## Proceso
|
|
41
|
+
|
|
42
|
+
1. **Resolver inputs.** Título e ID del tracker. Si se promueve una US, leerla.
|
|
43
|
+
2. **Grillar, un eje por vez.** Preguntar, escuchar, profundizar. Cubrir en orden:
|
|
44
|
+
- **Objetivo de negocio** — qué resultado grande persigue, y *por qué ahora*.
|
|
45
|
+
- **Alcance** — qué entra y qué **no** entra (el límite grueso que las US respetan).
|
|
46
|
+
- **Partición en US** — el eje central: partir la épica en **User Stories
|
|
47
|
+
independientes**, cada una con valor propio y que quepa en un sprint (INVEST).
|
|
48
|
+
Nombrar cada una con un título corto. No detallar los criterios acá.
|
|
49
|
+
- **Métricas de éxito** — indicadores de negocio de la épica entera.
|
|
50
|
+
- **Dependencias y riesgos** — qué tiene que existir antes o en paralelo.
|
|
51
|
+
3. **Chequeo de tamaño (al revés que en la US).**
|
|
52
|
+
- Si la "épica" **no se puede partir** en US independientes, probablemente sea **una
|
|
53
|
+
sola US grande** — devolverla a `grill-user-story`, no forzar una épica.
|
|
54
|
+
- Si una US hija sigue siendo enorme, puede ser una **sub-épica** — raro; primero
|
|
55
|
+
revisar si el corte está bien.
|
|
56
|
+
4. **Emitir + publicar** (ver abajo).
|
|
57
|
+
|
|
58
|
+
## Salida — publicar + handoff a las US
|
|
59
|
+
|
|
60
|
+
1. **Armar la épica** con el formato de `templates/epica.md`: metadata (`ID`, autor,
|
|
61
|
+
estado, US que la componen) + objetivo + alcance (in/out) + lista de US + métricas +
|
|
62
|
+
dependencias.
|
|
63
|
+
2. **Publicar en el tracker** (según `DAI_PM` del `.env`: `jira` → MCP de Atlassian ·
|
|
64
|
+
`clickup` → MCP de ClickUp · `md`/sin token → `.md` para pegar a mano). **No asumas
|
|
65
|
+
el tracker: lee `DAI_PM` primero.** Crear el ticket de épica; las US hijas se crean
|
|
66
|
+
como tickets vinculados (o quedan listadas para crearse).
|
|
67
|
+
3. **Handoff.** Ofrecer pasar **cada US hija** por `/grill-user-story` para convertirla
|
|
68
|
+
de "título en la lista" a US testeable con criterios. Ese es el paso que las hace
|
|
69
|
+
linkeables (`dai link-us`).
|
|
70
|
+
|
|
71
|
+
## Relación con el modelo
|
|
72
|
+
|
|
73
|
+
- **Arriba:** `grill-intent` puede desafiar el *problema* de la épica antes de armarla.
|
|
74
|
+
- **Abajo:** cada US de la partición pasa por `grill-user-story` → `dai link-us`.
|
|
75
|
+
- El link QUÉ↔CÓMO y el `ac_hash` viven **a nivel US**, nunca de épica (la épica agrupa,
|
|
76
|
+
no se implementa).
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: grill-intent
|
|
3
|
+
description: Gate 0 of the SDD workflow — challenge the *problem* behind a clean user story before any spec is generated. Interrogates whether this is the right problem, for the right user, within constraints, and whether the story's implied solution is a premature jump. Produces intent.md and a verdict that can be "go to spec", "reframe", or "don't build". In the spirit of grill-me, specialized for problem-challenge. Invoke as /grill-intent on a user story (the output of grill-user-story). Use after grill-user-story and before openspec propose.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# grill-intent — Gate 0, challenge the problem
|
|
7
|
+
|
|
8
|
+
The highest-ROI gate in the cycle: catch the wrong feature *before* a single spec artifact is written. This challenges the problem behind a user story — it does not construct the story (`grill-user-story` did that) and does not design the solution (`openspec propose` / `design.md` does that).
|
|
9
|
+
|
|
10
|
+
A valid outcome is "don't build this" or "the real problem is different". That is the point of Gate 0, not a failure of it.
|
|
11
|
+
|
|
12
|
+
Fill [templates/intent.md](templates/intent.md). That template is the single source of truth for the shape — never restate it inline.
|
|
13
|
+
|
|
14
|
+
## Input
|
|
15
|
+
|
|
16
|
+
- The clean user story (output of `grill-user-story`).
|
|
17
|
+
- The constitution: `openspec/project.md`, `CLAUDE.md`, and the team's AI-native manifesto — the immutable constraints the problem must live within.
|
|
18
|
+
|
|
19
|
+
## The challenge (five axes)
|
|
20
|
+
|
|
21
|
+
Pull *up* from the story's "I want Y" to the problem underneath, and pressure-test it:
|
|
22
|
+
|
|
23
|
+
1. **Right problem** — what actually hurts today, in the user's terms? Is the story solving that, or a symptom?
|
|
24
|
+
2. **Right user** — who genuinely has this pain? Reject a generic actor; name the one who feels it.
|
|
25
|
+
3. **Why now / cost of inaction** — what happens if we don't do this? If "nothing much", that's a signal to stop.
|
|
26
|
+
4. **Constraints** — does the problem collide with anything in the constitution (security, stack, roles, performance, branding, hard limits)?
|
|
27
|
+
5. **Solution-lock** — the story says "I want Y". Is Y a premature jump? Is there a cheaper or different way to solve the *same* problem? Could we solve it by *not building*?
|
|
28
|
+
|
|
29
|
+
## Two hard cuts (non-negotiable)
|
|
30
|
+
|
|
31
|
+
1. **Cut on solutioning.** If the conversation slides into how to build it, or even into shaping the feature's behaviour, stop it: "we're testing the problem, not designing the solution." Design is later.
|
|
32
|
+
2. **Cut on rubber-stamping.** Do not emit the intent until the problem has actually survived a challenge — at minimum axes 1, 3 and 5 answered with something real. Approving the story's implicit problem unexamined is the exact failure this gate exists to prevent.
|
|
33
|
+
|
|
34
|
+
## Process
|
|
35
|
+
|
|
36
|
+
1. **Read** the user story and the constitution.
|
|
37
|
+
2. **Challenge, one axis at a time.** grill-me discipline: ask, listen, push, move on. Don't dump the five questions at once.
|
|
38
|
+
3. **Reach a verdict** — `a-spec` (problem survived, go to propose), `reframe` (the real problem is different, back to `grill-user-story`), or `descartar` (not worth solving now, stop and record why).
|
|
39
|
+
4. **Emit** the filled `intent.md` (default location `openspec/intents/<YYYYMMDD-slug>/intent.md`; adjust to where the manifesto puts intents). Embed the tracker ID (the issue/task key — Jira or ClickUp, per `DAI_PM` in the repo's `.env`) and the source story.
|
|
40
|
+
|
|
41
|
+
## Hand-off
|
|
42
|
+
|
|
43
|
+
If the verdict is `a-spec`, the validated `intent.md` plus the user story together are the description you hand to `/openspec:proposal` — propose explores the specs and codebase itself and generates `proposal.md`, `design.md`, `tasks.md` and the `specs/` deltas. If `reframe`, return to the story. If `descartar`, stop — that is the gate doing its highest-value work.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
<!-- Plantilla canónica de intent (Gate 0). Define y DESAFÍA el problema, antes de la solución.
|
|
2
|
+
La llena grill-intent. No describe el cómo ni la solución — eso es openspec propose / design.md. -->
|
|
3
|
+
|
|
4
|
+
# Intent: <slug del problema>
|
|
5
|
+
|
|
6
|
+
> US de origen: <link o título> · ClickUp: <id> · Veredicto: pendiente | a-spec | reframe | descartar
|
|
7
|
+
|
|
8
|
+
## Problema
|
|
9
|
+
|
|
10
|
+
<Qué duele hoy, en términos del usuario. No la solución. Un párrafo.>
|
|
11
|
+
|
|
12
|
+
## Usuario / actor
|
|
13
|
+
|
|
14
|
+
<Quién tiene realmente este problema. Concreto, nunca "el usuario".>
|
|
15
|
+
|
|
16
|
+
## Por qué ahora / costo de no hacerlo
|
|
17
|
+
|
|
18
|
+
<Qué pasa si no lo resolvemos. Si la respuesta honesta es "nada grave", eso es una señal.>
|
|
19
|
+
|
|
20
|
+
## Restricciones
|
|
21
|
+
|
|
22
|
+
<Lo que la constitution / el contexto impone: seguridad, stack, performance, roles, branding, límites absolutos.>
|
|
23
|
+
|
|
24
|
+
## No-goals
|
|
25
|
+
|
|
26
|
+
<Lo que este intent explícitamente NO abarca. Corta el scope creep desde la raíz.>
|
|
27
|
+
|
|
28
|
+
## Alternativas consideradas
|
|
29
|
+
|
|
30
|
+
<Otras formas de resolver el MISMO problema — incluidas "no hacer nada" y "una solución más barata". Por qué la dirección elegida.>
|
|
31
|
+
|
|
32
|
+
## Veredicto
|
|
33
|
+
|
|
34
|
+
<a-spec: el problema sobrevivió el desafío → pasa a openspec propose.
|
|
35
|
+
reframe: el problema real es otro → volver a grill-user-story.
|
|
36
|
+
descartar: no vale la pena resolverlo ahora → motivo.>
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: grill-user-story
|
|
3
|
+
description: Interroga a un PO o analista funcional para producir una User Story funcional y testeable siguiendo el formato del modelo de trazabilidad — o pule una US vaga existente. Se queda a nivel funcional/usuario y se niega a derivar en diseño técnico o a emitir una US con criterios no testeables. Al terminar, PUBLICA la US en el tracker configurado del repo (Jira o ClickUp, según DAI_PM del .env) usando su MCP; si no hay MCP/token, deja un .md con el mismo formato para copiar y pegar. Invocar como /grill-user-story, opcionalmente con un título, un ID/URL del tracker, y/o una US rústica existente. Usar antes de opsx:propose, o cuando alguien dice "necesito una US", "convierte esto en una US como corresponde", o "esta historia está muy vaga".
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# grill-user-story
|
|
7
|
+
|
|
8
|
+
Producir una buena User Story **por interrogación, no por generación**. Es la puerta de entrada funcional del pipeline de specs (el QUÉ): su salida alimenta `opsx:propose` del lado técnico. Trabaja **solo a nivel usuario/solución** — el grill técnico ocurre después, en el `design.md` del dev.
|
|
9
|
+
|
|
10
|
+
Llena [templates/user-story.md](templates/user-story.md). El formato completo y su racional viven en [../../templates/formato-us.md](../../templates/formato-us.md) — es la única fuente de verdad de la forma. Nunca reescribas el formato inline.
|
|
11
|
+
|
|
12
|
+
## Por qué el formato importa (modelo de trazabilidad)
|
|
13
|
+
|
|
14
|
+
Esta US es el **QUÉ linkeable**. El `implements.yaml` del repo la va a referenciar por su **ID del tracker**, y `dai stamp` la usa para estampar cobertura. Por eso la salida DEBE tener:
|
|
15
|
+
- **ID** = el ticket del tracker (`ABC-###` en Jira, `86xxxx` en ClickUp) — identidad estable.
|
|
16
|
+
- **spec_version** = `v1` al nacer.
|
|
17
|
+
- **Criterios de aceptación en Gherkin** — es el bloque que se hashea (`ac_hash`); tienen que ser estables y testeables.
|
|
18
|
+
- **Autor** = quién la definió.
|
|
19
|
+
|
|
20
|
+
## Inputs (cualquier combinación, por argumento o preguntando)
|
|
21
|
+
|
|
22
|
+
- **Título** — nombre corto de la historia.
|
|
23
|
+
- **ID / URL de Jira** — si ya existe el ticket, para preservar el seam con el PM.
|
|
24
|
+
- **Fuente**:
|
|
25
|
+
- *Desde cero* — solo un título o idea. Grillar desde 0.
|
|
26
|
+
- *Refinar existente* — una US vaga ya escrita (texto pegado o path de archivo). Leerla primero, diagnosticar qué falta contra el formato, y grillar solo los huecos — no re-preguntar lo que ya está claro.
|
|
27
|
+
|
|
28
|
+
Si no viene nada, pedir título y si hay un borrador existente.
|
|
29
|
+
|
|
30
|
+
## Tres cortes duros (no negociables)
|
|
31
|
+
|
|
32
|
+
1. **Cortar en lo técnico.** Si la charla deriva a tablas, endpoints, migraciones o elección de framework, frenar: "eso es diseño, no ahora". La US nombra *qué necesita el usuario*, nunca *cómo se construye*.
|
|
33
|
+
2. **Cortar en lo no testeable.** Nunca emitir un criterio que no pueda volverse un test. "El usuario tiene una buena experiencia" se rechaza. "Un carrito vacío no se puede finalizar" se acepta — funcional y verificable. Empujar cada AC hasta que sea observable.
|
|
34
|
+
3. **Publicar, no pedir.** Si el tracker está configurado (`DAI_PM=jira|clickup` con token en `.env`), **CREA el ticket tú** (por MCP o con `dai publish`). **Nunca** cierres pidiéndole al usuario que te "pase el ID/URL del ticket" como si ya existiera — el ticket lo creas tú en este paso. Solo pides un ID existente si el usuario dijo explícitamente que está refinando una US ya creada.
|
|
35
|
+
|
|
36
|
+
## Proceso
|
|
37
|
+
|
|
38
|
+
0. **Detectar el tracker (SIEMPRE, antes de nada).** Lee el archivo `.env` del repo y observa `DAI_PM`:
|
|
39
|
+
- `DAI_PM=jira` → publicas en **Jira** (base: `DAI_JIRA_BASE_URL`), vía el MCP de Atlassian/Jira.
|
|
40
|
+
- `DAI_PM=clickup` → publicas en **ClickUp**, vía el MCP de ClickUp.
|
|
41
|
+
- `DAI_PM=md` (o sin `.env`) → no hay tracker: dejas la US como `.md`.
|
|
42
|
+
**No asumas el tracker** — depende del `.env`. Si no hay `.env`, pregunta cuál usa el equipo.
|
|
43
|
+
1. **Resolver inputs.** Obtener título e ID del tracker (si existe). Si se refina, leer la US y anotar — para uno mismo — qué secciones del formato faltan o están flojas: rol genérico ("el usuario"), falta el "para", sin flujo de excepción, solución prefijada, ACs vagos.
|
|
44
|
+
2. **Grillar, un eje por vez.** No tirar un cuestionario — preguntar, escuchar, profundizar, y seguir. Cubrir en orden:
|
|
45
|
+
- **Título** — corto, **3 a 6 palabras**, nombra la capacidad (de ahí sale la branch). Si el título es una frase larga, acórtalo: el detalle va en la descripción, no en el título. Ej: "Confirmar acciones con consecuencias", no "Confirmación deliberada antes de ejecutar acciones con consecuencias".
|
|
46
|
+
- **Quién** — el usuario/rol real. Rechazar "el usuario"; conseguir el actor concreto.
|
|
47
|
+
- **Job-to-be-done** — qué intenta lograr de verdad, y el *por qué* (el "para").
|
|
48
|
+
- **Flujos** — happy path primero, después alternativos, después excepciones: "¿qué pasa cuando no es válido / no está permitido / está vacío?"
|
|
49
|
+
- **Criterios de aceptación** — convertir cada flujo en una condición funcional y testeable, en Gherkin. Aplicar el corte #2 acá, fuerte.
|
|
50
|
+
- **Fuera de scope** — qué NO hace esta historia (mata el scope creep más adelante).
|
|
51
|
+
3. **Chequeo de tamaño (INVEST).** Si los flujos y ACs desbordan y la historia se dispersa, es demasiado grande para una sola US. No seguir empujando: **promoverla a una épica** con `/grill-epic` (que la parte en varias US independientes) y después volver acá para grillar cada US hija. Una US que no entra en un sprint es la señal de que hay una épica adentro.
|
|
52
|
+
4. **Publicar la US en el tracker (PASO OBLIGATORIO, ver abajo).** No termines con "¿la guardo y/o disparo el siguiente paso?": el trabajo de esta skill **incluye dejar la US publicada** en el tracker (con su key), no solo redactarla.
|
|
53
|
+
|
|
54
|
+
## Salida — publicar en el tracker (según `DAI_PM`), con fallback a .md
|
|
55
|
+
|
|
56
|
+
La US se produce UNA vez con el formato de `../../templates/formato-us.md`. Lo que cambia es **dónde se publica** — lo definió el paso 0:
|
|
57
|
+
|
|
58
|
+
1. **Armar la US** completa: metadata de trazabilidad (`ID`, `spec_version: v1`, autor, repos esperados) + historia + contexto + casos de uso + criterios Gherkin + fuera de scope + reglas + dependencias + métricas.
|
|
59
|
+
2. **Publicar en el tracker que dice `DAI_PM`:**
|
|
60
|
+
- **Jira** (`DAI_PM=jira`): vía el MCP de Atlassian, crear/actualizar el issue en `DAI_JIRA_BASE_URL` — título (summary), descripción, y los **criterios bajo un heading `## Criterios de aceptación`** (es lo que `dai` hashea). El issue devuelve el key (`ABC-###`).
|
|
61
|
+
- **ClickUp** (`DAI_PM=clickup`): vía el MCP de ClickUp, crear/actualizar la tarea con los criterios en la descripción, bajo el mismo heading. Devuelve el task ID.
|
|
62
|
+
- Confirmar al usuario con el link al ticket publicado.
|
|
63
|
+
- **Importante:** los criterios SIEMPRE van bajo `## Criterios de aceptación` en la descripción — así `dai link-us`/`check` los encuentran, sin importar el tracker.
|
|
64
|
+
3. **Fallback SIN MCP → publicar con el CLI (`dai publish`):**
|
|
65
|
+
- Si NO hay MCP del tracker conectado (pero sí `DAI_PM=jira|clickup` + token en `.env`):
|
|
66
|
+
escribe la US como `.md` (formato `formato-us.md`) y publícala con el comando:
|
|
67
|
+
**`dai publish <ruta-del-md>`** → crea el issue/tarea vía REST y devuelve el key.
|
|
68
|
+
(Jira necesita además `DAI_JIRA_PROJECT` en el `.env`.)
|
|
69
|
+
- Si tampoco hay token (o `DAI_PM=md`): deja solo el `.md` para que la persona lo
|
|
70
|
+
pegue a mano en el tracker. Avisa el motivo.
|
|
71
|
+
- El contenido es **idéntico** en los tres caminos (MCP / `dai publish` / manual).
|
|
72
|
+
4. **Estado.** Dejar la US en `pulida`. Ofrecer que el dev siga con `dai link-us <ID>` → `opsx:propose` (lado técnico).
|
|
73
|
+
|
|
74
|
+
## Hand-off
|
|
75
|
+
|
|
76
|
+
La US terminada es el input de `opsx:propose`, que produce las capas técnicas (`design.md`, `specs/`, `tasks.md`) y donde el dev declara el link con la skill `link-us`. El grill técnico —modelo de datos, roles, migraciones— ocurre ahí, con un dev o arquitecto, no acá.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
<!-- Plantilla canónica de historia de usuario · Modelo de Trazabilidad QUÉ↔CÓMO.
|
|
2
|
+
Funcional y de alto nivel: sin tecnología. La llena la skill grill-user-story.
|
|
3
|
+
Formato completo y su racional en ../../formato-us.md (fuente de verdad de la forma). -->
|
|
4
|
+
|
|
5
|
+
# 🔗 Metadata de trazabilidad
|
|
6
|
+
|
|
7
|
+
| Campo | Valor |
|
|
8
|
+
|-------|-------|
|
|
9
|
+
| **ID** | `ABC-###` |
|
|
10
|
+
| **spec_version** | `v1` |
|
|
11
|
+
| **Autor** | `<PO / analista>` |
|
|
12
|
+
| **Estado** | `borrador` |
|
|
13
|
+
| **Repos esperados** | `<frontend, bff, backend — opcional>` |
|
|
14
|
+
|
|
15
|
+
# <título de la historia>
|
|
16
|
+
|
|
17
|
+
## Historia
|
|
18
|
+
|
|
19
|
+
Como <rol / tipo de usuario concreto, nunca "el usuario">
|
|
20
|
+
quiero <capacidad o resultado>
|
|
21
|
+
para <valor / por qué>.
|
|
22
|
+
|
|
23
|
+
## Contexto / Problema
|
|
24
|
+
|
|
25
|
+
Por qué esto importa ahora. Qué duele hoy sin esta funcionalidad.
|
|
26
|
+
|
|
27
|
+
## Casos de uso
|
|
28
|
+
|
|
29
|
+
Flujos a nivel usuario — qué hace la persona y qué responde el sistema. Sin tecnología.
|
|
30
|
+
|
|
31
|
+
- **Happy path** — <el usuario hace X, obtiene Y>
|
|
32
|
+
- **Alternativo** — <variación esperada del flujo>
|
|
33
|
+
- **Excepción** — <qué pasa cuando algo no es válido, no está permitido, o está vacío>
|
|
34
|
+
|
|
35
|
+
## Criterios de aceptación
|
|
36
|
+
|
|
37
|
+
Gherkin (Dado / Cuando / Entonces). Cada uno tiene que poder convertirse en un test.
|
|
38
|
+
Este bloque es lo que se hashea (ac_hash) — orden estable, sin tecnología.
|
|
39
|
+
|
|
40
|
+
- [ ] **AC-1** — Dado <precondición>, cuando <acción>, entonces <resultado observable>
|
|
41
|
+
- [ ] **AC-2** — Dado <...>, cuando <...>, entonces <...>
|
|
42
|
+
|
|
43
|
+
## Reglas de negocio
|
|
44
|
+
|
|
45
|
+
- <invariante / límite / restricción de dominio>
|
|
46
|
+
|
|
47
|
+
## Fuera de scope
|
|
48
|
+
|
|
49
|
+
- <lo que esta historia explícitamente NO hace>
|
|
50
|
+
|
|
51
|
+
## Dependencias
|
|
52
|
+
|
|
53
|
+
- <ABC-### / sistema / decisión previa>
|
|
54
|
+
|
|
55
|
+
## Métricas de éxito
|
|
56
|
+
|
|
57
|
+
- <indicador de negocio observable>
|
|
58
|
+
|
|
59
|
+
## Preguntas abiertas
|
|
60
|
+
|
|
61
|
+
- <lo que necesita una decisión antes de implementar>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: link-us
|
|
3
|
+
description: Del lado del dev — crea la branch desde el link de la User Story en Jira SIN margen de error y genera el archivo implements.yaml con el link a la US (id + version + ac_hash). Es la que hace que el link QUÉ↔CÓMO sea correcto por construcción, sin que el dev tipee el key a mano. Invocar como /link-us ABC-### (o con la URL del ticket de Jira). Usar al arrancar la implementación de una US, antes o junto con opsx:explore / opsx:propose.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# link-us
|
|
7
|
+
|
|
8
|
+
Arranca la implementación de una User Story **atándola al QUÉ desde el primer commit**. El dev no escribe el key de Jira a mano en ningún lado: la branch y el `implements.yaml` salen los dos del mismo ID, así el link no puede quedar mal tipeado.
|
|
9
|
+
|
|
10
|
+
Es la contraparte técnica de `grill-user-story`: donde esa produce el QUÉ (en Jira), esta abre el CÓMO (en el repo) ya linkeado.
|
|
11
|
+
|
|
12
|
+
## Input
|
|
13
|
+
|
|
14
|
+
- **ID o URL de la US en Jira** — `ABC-###` o el link completo. Es lo único obligatorio.
|
|
15
|
+
- Si no viene, pedirlo. Validar el formato del key antes de seguir; si no matchea `ABC-\d+`, frenar y avisar.
|
|
16
|
+
|
|
17
|
+
## Proceso
|
|
18
|
+
|
|
19
|
+
1. **Resolver el key.** Extraer `ABC-###` del argumento (acepta key crudo o URL). Este key es la **única fuente** de todo lo que sigue — no re-tipearlo.
|
|
20
|
+
2. **Traer la US (si se puede).**
|
|
21
|
+
- Si hay **MCP de Jira/Atlassian** o **token** (`JIRA_BASE_URL` + `JIRA_TOKEN`): traer título, `spec_version` y el bloque de **criterios de aceptación**.
|
|
22
|
+
- Calcular `ac_hash` = hash del bloque de criterios normalizado (whitespace colapsado, orden estable).
|
|
23
|
+
- Si no hay acceso a Jira: pedir al dev el título y la `spec_version`, o leer un `.md` local de la US; dejar `ac_hash` como `pendiente` con un aviso de que el CI lo completará.
|
|
24
|
+
3. **Crear la branch, sin margen de error.**
|
|
25
|
+
- Nombre: `feature/ABC-###-<slug>` donde `<slug>` sale del título (minúsculas, sin acentos, `-` como separador).
|
|
26
|
+
- Base según convención del repo (`main` o `develop`). Verificar que la branch no exista ya.
|
|
27
|
+
- No permitir crear la branch si el key no fue validado en el paso 1.
|
|
28
|
+
4. **Generar el link.** Crear `openspec/changes/<change-id>/implements.yaml` a partir de [templates/implements.yaml](templates/implements.yaml), completando `id`, `version`, `ac_hash`, `repo` y `autor`. Dejar `introduces` para que el dev liste las capacidades técnicas nuevas.
|
|
29
|
+
5. **Hand-off.** Ofrecer seguir con `opsx:explore` → `opsx:propose` para armar el change (proposal/design/tasks) sobre la branch ya creada y linkeada.
|
|
30
|
+
|
|
31
|
+
## Guardrails (por qué esta skill existe)
|
|
32
|
+
|
|
33
|
+
- **El key nunca se tipea a mano** en la branch ni en el `implements.yaml`: ambos derivan del argumento validado. Elimina el error de tipeo que rompe la trazabilidad.
|
|
34
|
+
- **Sin `implements.yaml`, no hay link** — y el CI del repo falla el PR si falta. Esta skill garantiza que exista desde el arranque.
|
|
35
|
+
- **El link apunta del CÓMO al QUÉ** (`implements: ABC-###`), nunca al revés. La cobertura inversa la genera el CI, no esta skill.
|
|
36
|
+
|
|
37
|
+
## Relación con el modelo
|
|
38
|
+
|
|
39
|
+
- `grill-user-story` → produce el QUÉ en Jira (`ABC-###`).
|
|
40
|
+
- **`link-us`** → abre el CÓMO en el repo, ya atado a ese `ABC-###`.
|
|
41
|
+
- El CI → al mergear, estampa en Jira "implementado por <repo> @<version> ✓".
|
|
42
|
+
- El CD → al desplegar, reporta en qué ambiente (dev/test/pre/prod) quedó viva esa versión.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Link QUÉ↔CÓMO · lo genera link-us / `dai link-us`, lo versiona git junto al código.
|
|
2
|
+
# Es el ÚNICO link autorado a mano. La cobertura inversa la deriva `dai stamp`.
|
|
3
|
+
# Schema: docs/adr/0004-ubicacion-y-schema-implements.md
|
|
4
|
+
|
|
5
|
+
change: <change-id> # ← identidad del CÓMO (nombre local del change/spec). Auto-contenido.
|
|
6
|
+
repo: <nombre-del-repo> # ← p. ej. frontend
|
|
7
|
+
|
|
8
|
+
implements: # FORWARD: qué QUÉ del negocio cumple este change
|
|
9
|
+
- id: ABC-### # ← ticket de Jira/ClickUp (identidad del QUÉ). NO tipear a mano: lo pone link-us.
|
|
10
|
+
version: v1 # ← spec_version de la US al momento de implementar (nº legible)
|
|
11
|
+
ac_hash: <autogenerado> # ← lo calcula `dai ac-hash`. Dispara el ⚠️ si el QUÉ cambia.
|
|
12
|
+
|
|
13
|
+
introduces: # capacidades TÉCNICAS nuevas que agrega este change (opcional)
|
|
14
|
+
- <capacidad-tecnica> # p. ej. guard-carrito-vacio
|
|
15
|
+
|
|
16
|
+
autor: <dev> # quién implementa
|