@dforce2055/dai 0.9.0 → 0.11.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 → .env.dai.example} +3 -3
- package/CHANGELOG.md +148 -0
- package/README.md +47 -26
- package/VERSION +1 -1
- package/cli/dai.mjs +528 -61
- package/cli/lib/bootstrap.mjs +44 -9
- package/cli/lib/branch-scope.mjs +144 -0
- package/cli/lib/env.mjs +12 -0
- package/cli/lib/forge-api.mjs +57 -0
- package/cli/lib/pm-adapter.mjs +16 -2
- package/cli/lib/pm-clickup.mjs +18 -3
- package/cli/lib/pm-jira.mjs +23 -3
- package/cli/lib/skills-source.mjs +8 -0
- package/cli/lib/us-format.mjs +147 -0
- package/docs/EJEMPLO-END-TO-END.md +78 -46
- package/docs/MANIFIESTO.md +2 -2
- package/docs/METODOLOGIA.md +25 -15
- package/docs/PROBAR.md +25 -15
- package/docs/SCRUM-CON-IA.md +11 -11
- package/docs/adr/0003-deteccion-y-estampado-son-comandos.md +1 -1
- package/docs/adr/0006-distribucion-y-licencia.md +1 -1
- package/docs/adr/0013-skills-externas-install-from.md +11 -4
- package/docs/adr/0015-jira-corporativo.md +1 -1
- package/docs/adr/0017-env-dai.md +64 -0
- package/docs/adr/0018-alcance-de-stamp-y-gate-de-ci.md +183 -0
- package/docs/adr/README.md +2 -0
- package/docs/detalle/01-refinamiento.md +20 -5
- package/docs/detalle/03-ramas.md +2 -2
- package/docs/detalle/04-tdd.md +15 -9
- package/docs/detalle/06-code-review.md +8 -5
- package/docs/detalle/07-merge-trazabilidad.md +13 -2
- package/docs/detalle/08-daily.md +1 -1
- package/docs/detalle/README.md +1 -1
- package/docs/glosario.md +3 -3
- package/docs/guias/dev.md +31 -7
- package/docs/guias/index.md +12 -0
- package/docs/guias/lead.md +1 -1
- package/docs/guias/po.md +53 -8
- package/docs/index.md +35 -0
- package/docs/public/favicon.svg +12 -0
- package/docs/public/logo-link.svg +12 -0
- package/docs/public/logo.svg +12 -0
- package/docs/public/tutoriales/clickup-1-settings.png +0 -0
- package/docs/public/tutoriales/clickup-2-api.png +0 -0
- package/docs/public/tutoriales/clickup-3-generate-copy.png +0 -0
- package/docs/public/tutoriales/jira-1-avatar.png +0 -0
- package/docs/public/tutoriales/jira-2-seguridad-tokens.png +0 -0
- package/docs/public/tutoriales/jira-3-crear-token.png +0 -0
- package/docs/public/tutoriales/jira-4-nombre-vencimiento.png +0 -0
- package/docs/public/tutoriales/jira-5-copiar.png +0 -0
- package/docs/tutoriales/claves-ssh.md +93 -0
- package/docs/tutoriales/configurar-git.md +53 -0
- package/docs/tutoriales/index.md +18 -0
- package/docs/tutoriales/instalar-glab.md +74 -0
- package/docs/tutoriales/token-clickup.md +73 -0
- package/docs/tutoriales/token-jira.md +74 -0
- package/governance/ci-rules.md +47 -8
- package/package.json +9 -3
- package/skills/dai-review/SKILL.md +1 -1
- package/skills/grill-epic/SKILL.md +2 -2
- package/skills/grill-intent/SKILL.md +1 -1
- package/skills/grill-user-story/SKILL.md +58 -10
- package/templates/ci-dai-gate.yml +50 -0
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# ADR-0018 — El alcance de `stamp` lo decide la rama, el gate de CI se ejecuta, y editar el QUÉ es un comando
|
|
2
|
+
|
|
3
|
+
- **Estado:** aceptado
|
|
4
|
+
- **Fecha:** 2026-07-22
|
|
5
|
+
- **Decide:** lead / arquitecto de la metodología
|
|
6
|
+
|
|
7
|
+
## Contexto
|
|
8
|
+
|
|
9
|
+
Tres agujeros con la misma raíz: **dai suponía cosas sobre el QUÉ que nunca escribió en
|
|
10
|
+
ningún lado** — que un repo tiene una sola US viva, que toda rama implementa una US, y que
|
|
11
|
+
la US, una vez publicada, no se vuelve a tocar. Las tres suposiciones fallan en el primer
|
|
12
|
+
sprint real.
|
|
13
|
+
|
|
14
|
+
### 1. `dai stamp` estampaba todo el repo
|
|
15
|
+
|
|
16
|
+
`cmdStamp` recorría el repo entero con `discoverImplements(cwd)` —**archivados
|
|
17
|
+
incluidos**— y le dejaba un comentario de cobertura a cada US que encontrara. Cerrar una
|
|
18
|
+
historia dejaba esto en el tracker:
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
➜ backend git:(feature/331qtr-historia-motor) dai stamp
|
|
22
|
+
✓ 86acme482 → task 86acme482 (comentario) (✅ al día)
|
|
23
|
+
✓ 86acme483 → task 86acme483 (comentario) (✅ al día)
|
|
24
|
+
✓ 86acme484 → task 86acme484 (comentario) (✅ al día)
|
|
25
|
+
✓ 86acme485 → task 86acme485 (comentario) (✅ al día)
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Tres de esos cuatro comentarios son ruido en el ticket de otra persona. Y un comentario
|
|
29
|
+
en un tracker **no se deshace**: queda en el historial de la US, en la notificación por
|
|
30
|
+
mail de quien la sigue, y en el Slack del canal conectado.
|
|
31
|
+
|
|
32
|
+
Lo llamativo es que `dai check` **ya** filtraba los archivados (`includeArchived: false`,
|
|
33
|
+
ADR-0010) y `stamp` no. La divergencia era un descuido, no una decisión.
|
|
34
|
+
|
|
35
|
+
### 2. `governance/ci-rules.md` prometía un gate que no existía
|
|
36
|
+
|
|
37
|
+
El documento decía, en una tabla, que el CI **bloquea** el PR si una rama de producto no
|
|
38
|
+
tiene `implements.yaml`. No había ningún comando que hiciera eso. No estaba en `ci.yml`,
|
|
39
|
+
no estaba en el CLI, no estaba en ningún template. Era una regla escrita que nadie
|
|
40
|
+
aplicaba — el peor estado posible: el equipo cree que está protegido y no lo está.
|
|
41
|
+
|
|
42
|
+
Y al ir a implementarla apareció el problema real, el que probablemente explica por qué
|
|
43
|
+
nunca se implementó: **la regla como estaba escrita es demasiado dura**. Un `chore/` de
|
|
44
|
+
bump de dependencias, un `docs/` de typo, un `hotfix/` de las tres de la mañana no
|
|
45
|
+
tienen US, no deberían tenerla, y un gate que los bloquea se desactiva la primera semana.
|
|
46
|
+
Un gate desactivado protege exactamente igual que un gate que no existe, pero además
|
|
47
|
+
enseña al equipo que los checks de dai son un obstáculo.
|
|
48
|
+
|
|
49
|
+
### 3. Editar una US publicada era copiar y pegar
|
|
50
|
+
|
|
51
|
+
`dai publish` creaba la US y `dai check` detectaba que había cambiado. En el medio no
|
|
52
|
+
había nada: para **editarla** el PO abría el navegador y escribía en un textarea sin
|
|
53
|
+
validación, o el dev editaba el `us.md` local y el tracker quedaba viejo. El formato
|
|
54
|
+
canónico (`templates/formato-us.md`) existía como documento y no como chequeo, así que una
|
|
55
|
+
US podía volver al tracker sin criterios y nadie se enteraba hasta que `dai link-us`
|
|
56
|
+
fallaba, sprints después.
|
|
57
|
+
|
|
58
|
+
## Decisión
|
|
59
|
+
|
|
60
|
+
### 1. El alcance de `stamp` sale del nombre de la rama, y ante la duda se pregunta
|
|
61
|
+
|
|
62
|
+
`dai stamp` deja de recorrer el repo. La decisión vive en un módulo puro
|
|
63
|
+
(`cli/lib/branch-scope.mjs`) que responde **qué estampar y por qué**:
|
|
64
|
+
|
|
65
|
+
| Situación | Qué hace |
|
|
66
|
+
|---|---|
|
|
67
|
+
| `dai stamp ABC-482` | esas US, aunque el change esté archivado |
|
|
68
|
+
| `dai stamp --all` | todo (el comportamiento viejo, ahora explícito) |
|
|
69
|
+
| la rama nombra una US del repo | **solo esa** |
|
|
70
|
+
| hay una sola US viva | esa |
|
|
71
|
+
| varias US vivas y la rama no dice cuál | **no estampa: pregunta** |
|
|
72
|
+
|
|
73
|
+
Los changes archivados **salen del default**. Se alcanzan con `--all` o nombrando el ID
|
|
74
|
+
—que es justo el caso de estampar después del merge.
|
|
75
|
+
|
|
76
|
+
> **El default es preguntar, no estampar de más.** Es la asimetría del costo: no estampar
|
|
77
|
+
> se arregla corriendo el comando otra vez; estampar de más deja cuatro comentarios que
|
|
78
|
+
> no se borran. Cuando no hay TTY (CI), en vez de preguntar **falla** y pide el ID
|
|
79
|
+
> explícito — que es lo que un pipeline debería estar pasando de todos modos.
|
|
80
|
+
|
|
81
|
+
El matcheo rama↔US es deliberadamente conservador: `feature/331qtr-historia-motor` **no**
|
|
82
|
+
matchea `86acme482` aunque ambos sean alfanuméricos. Se comparan candidatos del nombre
|
|
83
|
+
contra los IDs que el repo realmente declara, y si no hay coincidencia exacta se pregunta.
|
|
84
|
+
|
|
85
|
+
Para el gate —que no tiene contra qué comparar, justamente porque el `implements.yaml` no
|
|
86
|
+
existe— un key de tracker se reconoce por **MAYÚSCULAS + guion + números** (`ABC-482`). El
|
|
87
|
+
case es lo único que lo separa de una palabra del slug con un número pegado: dogfoodeando
|
|
88
|
+
esto, la rama `feat/issues-22-26` hacía que el gate sugiriera `dai link-us issues-22`, o
|
|
89
|
+
sea mandar al dev a crear un link inventado. `dai link-us` preserva el case del key, y los
|
|
90
|
+
keys de tracker son mayúsculas por convención en Jira, GitLab y Azure Boards.
|
|
91
|
+
|
|
92
|
+
### 2. El gate es un comando, y sabe qué ramas no exigir
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
dai check --ci # 0 = pasa · 1 = falta el link · 2 = el QUÉ cambió
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Lee el nombre de la rama y aplica `branch-naming.md`:
|
|
99
|
+
|
|
100
|
+
- `feature/`, `feat/` → **siempre** exige `implements.yaml`
|
|
101
|
+
- `chore/`, `docs/`, `ci/`, `build/`, `test/`, `refactor/`, `style/`, `release/`,
|
|
102
|
+
`hotfix/`, `revert/` → **exentas**
|
|
103
|
+
- `fix/` y cualquier otro prefijo → exige **solo si el nombre trae un ID** de tracker
|
|
104
|
+
- sin prefijo (`main`, `develop`) → no es rama de trabajo
|
|
105
|
+
|
|
106
|
+
> El nombre de la rama **es** la declaración del tipo de trabajo. Si el gate te bloquea
|
|
107
|
+
> un chore, la respuesta no es inventarle una US: es renombrar la rama. Esto convierte
|
|
108
|
+
> `branch-naming.md` de convención sugerida en algo con consecuencia, sin agregar
|
|
109
|
+
> ceremonia nueva.
|
|
110
|
+
|
|
111
|
+
En CI, la rama de una PR no se saca de git: `HEAD` es un merge commit detached. El
|
|
112
|
+
comando lee `GITHUB_HEAD_REF` / `CI_MERGE_REQUEST_SOURCE_BRANCH_NAME` / equivalentes.
|
|
113
|
+
|
|
114
|
+
### 3. El gate no bloquea por falta de red ni de credencial
|
|
115
|
+
|
|
116
|
+
`--no-network` valida el link y no compara contra la US viva; es el **default del
|
|
117
|
+
template** (`templates/ci-dai-gate.yml`). Con los secrets del tracker cargados se saca el
|
|
118
|
+
flag y el gate detecta además las US atrasadas.
|
|
119
|
+
|
|
120
|
+
Mismo criterio dentro del modo completo: si el tracker no responde, **avisa y no
|
|
121
|
+
bloquea**. Un gate que se pone rojo porque venció un token enseña al equipo a mirar para
|
|
122
|
+
otro lado, y ahí perdimos los dos checks — el de red y el que sí importaba.
|
|
123
|
+
|
|
124
|
+
### 4. Editar el QUÉ es un comando, y el `spec_version` lo decide la persona
|
|
125
|
+
|
|
126
|
+
El tercer agujero del mismo origen: **la US vivía en el tracker y no había forma de
|
|
127
|
+
editarla sin copiar y pegar.** El PO abría el navegador, escribía en un textarea sin
|
|
128
|
+
validación, y el `.md` del repo quedaba viejo — o al revés. Dos comandos, un camino:
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
dai edit-us <ID> # la baja del tracker → $EDITOR → valida → preview → guarda (PO)
|
|
132
|
+
dai update-us <ID> # ya tenés el .md escrito (lo refinaste implementando) → guarda (dev)
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
No son dos implementaciones: `edit-us` termina llamando al mismo tramo que `update-us`
|
|
136
|
+
(`pushUS`), así que las dos puertas dan **el mismo preview y la misma confirmación**. La
|
|
137
|
+
única diferencia es de dónde sale el markdown.
|
|
138
|
+
|
|
139
|
+
**La validación bloquea tres cosas y avisa del resto.** Frenan: sin título, sin sección
|
|
140
|
+
de criterios, sección vacía. Nada más — y no por permisividad: son exactamente las tres
|
|
141
|
+
sin las cuales no hay `ac_hash`, y sin `ac_hash` no hay link QUÉ↔CÓMO. Que un criterio no
|
|
142
|
+
sea Gherkin completo, o que el título tenga doce palabras, son **avisos**: dai opina en su
|
|
143
|
+
dominio (la trazabilidad) y sugiere en el resto. `--strict` sube los avisos a errores para
|
|
144
|
+
quien quiera esa política; no es el default, porque un gate que rechaza US legítimas se
|
|
145
|
+
esquiva editando en el navegador y volvemos al punto de partida.
|
|
146
|
+
|
|
147
|
+
Un formato inválido **no tira lo escrito**: te devuelve al editor con los errores a la
|
|
148
|
+
vista, tantas veces como haga falta, y salir sin guardar deja tu `.md` intacto.
|
|
149
|
+
|
|
150
|
+
**El `spec_version` se propone, no se impone.** Si el `ac_hash` se movió, dai pregunta:
|
|
151
|
+
|
|
152
|
+
| El PO responde | Qué significa | Qué pasa |
|
|
153
|
+
|---|---|---|
|
|
154
|
+
| `s` | cambio **material** | `v1` → `v2`; los repos con `v1` se marcan atrasados |
|
|
155
|
+
| `n` | cambio **editorial** | se queda en `v1`; nadie se marca atrasado |
|
|
156
|
+
|
|
157
|
+
Es la línea que ya estaba escrita en [METODOLOGIA §4](../METODOLOGIA.md) —*el número
|
|
158
|
+
comunica, el hash detecta*— llevada a una pregunta concreta. La máquina sabe **que** algo
|
|
159
|
+
cambió; solo la persona sabe **si importa**. Automatizarlo en cualquiera de las dos
|
|
160
|
+
direcciones rompe algo: subirlo siempre infla la versión con cada typo y entrena al equipo
|
|
161
|
+
a ignorar los ⚠️; no subirlo nunca deja el número mintiendo. `--bump` / `--no-bump` cubren
|
|
162
|
+
el caso no interactivo.
|
|
163
|
+
|
|
164
|
+
## Consecuencias
|
|
165
|
+
|
|
166
|
+
- `dai stamp` sin argumentos **cambia de comportamiento**: antes estampaba todo, ahora
|
|
167
|
+
estampa una. Es un cambio incompatible en el papel, pero el comportamiento viejo era el
|
|
168
|
+
bug; quien lo quiera tiene `--all`. Va en una **minor** por eso.
|
|
169
|
+
- En CI hay que pasar el ID (`dai stamp ABC-482`). `governance/ci-rules.md` lo dice.
|
|
170
|
+
- `branch-naming.md` pasa a tener consecuencia mecánica. Un repo con otras convenciones de
|
|
171
|
+
prefijo va a ver ramas "exentas" que él considera de producto — el escape es nombrar la
|
|
172
|
+
rama con el ID, que es lo que `dai link-us` hace solo.
|
|
173
|
+
- El gate no valida tests ni lint: eso ya lo hace el CI del repo y dai no se mete
|
|
174
|
+
(ver `dai` como herramienta, no como mandato).
|
|
175
|
+
- Los adaptadores de PM ahora devuelven `raw` (el markdown completo de la US) además del
|
|
176
|
+
parseo. Es lo que `edit-us` abre; antes solo teníamos título + hash, que alcanza para
|
|
177
|
+
detectar drift pero no para editar.
|
|
178
|
+
- `dai edit-us` le da al **PO** un comando de terminal, cuando hasta ahora su superficie
|
|
179
|
+
eran skills en el asistente y el tracker. Es opcional —seguir editando en el navegador
|
|
180
|
+
funciona igual— pero es el único camino donde el formato se valida ANTES de guardar.
|
|
181
|
+
- La validación de formato vive en el CLI (`us-format.mjs`), no en la skill. Es lo
|
|
182
|
+
mecánico y verificable; el criterio de si un criterio es *bueno* sigue en
|
|
183
|
+
`/grill-user-story`, que interroga (ADR-0002).
|
package/docs/adr/README.md
CHANGED
|
@@ -22,6 +22,8 @@ decisión cambia, se escribe un ADR nuevo que supersede al viejo. Molde en
|
|
|
22
22
|
| [0014](0014-copilot-agent-skills.md) | Copilot lee `SKILL.md` nativo (Agent Skills): se elimina el adaptador `.prompt.md` — modifica la 0002 | aceptado |
|
|
23
23
|
| [0015](0015-jira-corporativo.md) | `dai publish` en Jira corporativo: campos propios declarados, `--parent`/`--issuetype`, TLS con CA (nunca apagar la verificación) | aceptado |
|
|
24
24
|
| [0016](0016-review-inline.md) | Review inline: `review.json` como contrato y puerta humana, el CLI valida las posiciones contra el diff, `--yes` explícito, nunca `APPROVE` | aceptado |
|
|
25
|
+
| [0017](0017-env-dai.md) | La config de dai vive en `.env.dai` (no versionado), no en el `.env` del equipo; el loader lee ambos con precedencia shell > `.env.dai` > `.env` | aceptado |
|
|
26
|
+
| [0018](0018-alcance-de-stamp-y-gate-de-ci.md) | El alcance de `dai stamp` lo decide la rama (ante la duda pregunta, no estampa de más), `dai check --ci` ejecuta el gate de governance con ramas exentas, y `dai edit-us`/`update-us` editan el QUÉ validando el formato y proponiendo el `spec_version` | aceptado |
|
|
25
27
|
|
|
26
28
|
> Estas son las decisiones que cierran las "Decisiones abiertas" de
|
|
27
29
|
> [`METODOLOGIA.md §7`](../METODOLOGIA.md) y las enmiendas al
|
|
@@ -7,17 +7,32 @@
|
|
|
7
7
|
El PO llega con una idea (a veces un ticket de una línea). Antes de escribir specs,
|
|
8
8
|
la IA hace dos cosas, en orden:
|
|
9
9
|
|
|
10
|
-
1. **
|
|
11
|
-
`a-spec` (seguir), `reframe` (el problema real es otro) o `descartar` (no vale la
|
|
12
|
-
pena ahora). Un "no lo construyas" es un éxito del gate, no una falla.
|
|
13
|
-
2. **Pulido** (`grill-user-story`) — interroga hasta que la US es **testeable por
|
|
10
|
+
1. **Pulido** (`grill-user-story`) — interroga hasta que la US es **testeable por
|
|
14
11
|
construcción** (INVEST + Gherkin) y la publica en el tracker.
|
|
12
|
+
2. **Gate 0** (`grill-intent`) — con la US ya formada, desafía el *problema* detrás
|
|
13
|
+
(no la solución). Veredicto: `a-spec` (seguir), `reframe` (el problema real es otro)
|
|
14
|
+
o `descartar` (no vale la pena ahora). Un "no lo construyas" es un éxito del gate,
|
|
15
|
+
no una falla.
|
|
16
|
+
|
|
17
|
+
## Cuando la US ya existe y hay que editarla
|
|
18
|
+
|
|
19
|
+
El refinamiento no termina cuando la US entra al sprint: aparece un criterio que faltaba,
|
|
20
|
+
o una regla que nadie había dicho. `dai edit-us <ID>` cierra ese ciclo sin copiar y pegar:
|
|
21
|
+
baja la US del tracker, la abre en el editor del PO, **valida el formato** (título +
|
|
22
|
+
criterios + Gherkin completo), muestra qué cambia, pregunta si el cambio es **material**
|
|
23
|
+
(sube `spec_version`, los repos atrasados se marcan solos) o **editorial** (no sube nada),
|
|
24
|
+
y recién con la confirmación escribe.
|
|
25
|
+
|
|
26
|
+
Si el que refina es el **dev** —un criterio que aparece escribiendo el test— es el mismo
|
|
27
|
+
camino por la otra puerta: `dai update-us <ID>` empuja el `us.md` del change, con el mismo
|
|
28
|
+
preview y la misma confirmación ([ADR-0018](../adr/0018-alcance-de-stamp-y-gate-de-ci.md)).
|
|
15
29
|
|
|
16
30
|
## Herramientas
|
|
17
31
|
|
|
18
|
-
- `/grill-intent` → `openspec/intents/<fecha-slug>/intent.md`
|
|
19
32
|
- `/grill-user-story` → US en formato [`formato-us.md`](../../templates/formato-us.md),
|
|
20
33
|
publicada en Jira/ClickUp (o `.md` de fallback).
|
|
34
|
+
- `/grill-intent` → `openspec/intents/<fecha-slug>/intent.md`
|
|
35
|
+
- `dai edit-us <ID>` → trae la US del tracker, la editas, dai valida el formato y la devuelve.
|
|
21
36
|
- Gate de entrada: [`definition-of-ready.md`](../../templates/definition-of-ready.md).
|
|
22
37
|
|
|
23
38
|
## Qué firma el humano
|
package/docs/detalle/03-ramas.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
## En qué consiste en detalle
|
|
6
6
|
|
|
7
|
-
El dev
|
|
7
|
+
El dev empieza la implementación **atándola al QUÉ**: la branch y el `implements.yaml`
|
|
8
8
|
salen del mismo ID del tracker, así el link no puede quedar mal tipeado.
|
|
9
9
|
|
|
10
10
|
## Herramientas
|
|
@@ -21,7 +21,7 @@ dai link-us ABC-482 --us us.md
|
|
|
21
21
|
|
|
22
22
|
## Qué firma el humano
|
|
23
23
|
|
|
24
|
-
El dev **elige qué US
|
|
24
|
+
El dev **elige qué US toma**. El resto es mecánico y determinista (el CLI), no
|
|
25
25
|
criterio humano — por eso el key **no se tipea a mano** ([Art. 8](../MANIFIESTO.md#art-8), Art. 9).
|
|
26
26
|
|
|
27
27
|
## Antipatrones
|
package/docs/detalle/04-tdd.md
CHANGED
|
@@ -1,32 +1,38 @@
|
|
|
1
|
-
# Paso 4 —
|
|
1
|
+
# Paso 4 — Implementación: el agente construye con TDD (`/opsx:apply`)
|
|
2
2
|
|
|
3
3
|
← vuelve a [`SCRUM-CON-IA.md`](../SCRUM-CON-IA.md)
|
|
4
4
|
|
|
5
5
|
## En qué consiste en detalle
|
|
6
6
|
|
|
7
|
-
El CÓMO
|
|
7
|
+
El CÓMO **lo implementa el agente** con `/opsx:apply`: aplica las tareas que salieron de
|
|
8
|
+
`opsx:propose`, escribiendo **test primero**, un comportamiento a la vez:
|
|
8
9
|
|
|
9
10
|
```
|
|
10
|
-
RED →
|
|
11
|
+
RED → el agente escribe UN test que falla (un criterio de aceptación)
|
|
11
12
|
GREEN → el código mínimo para que pase
|
|
12
|
-
REFACTOR →
|
|
13
|
+
REFACTOR → limpia, con los tests en verde
|
|
13
14
|
```
|
|
14
15
|
|
|
15
16
|
*Vertical slices* (un test → una implementación → repetir), **no** horizontal
|
|
16
|
-
(todos los tests, después todo el código).
|
|
17
|
+
(todos los tests, después todo el código). Se verifica por la **interfaz pública**.
|
|
17
18
|
|
|
18
19
|
## Herramientas
|
|
19
20
|
|
|
20
|
-
-
|
|
21
|
-
|
|
21
|
+
- **`/opsx:apply`** — el paso donde el agente implementa las tareas del change.
|
|
22
|
+
- Skill [`tdd`](../../skills/tdd/SKILL.md) — la disciplina que `/opsx:apply` sigue: el
|
|
23
|
+
loop red-green-refactor y qué es un buen test.
|
|
22
24
|
|
|
23
25
|
## Qué firma el humano
|
|
24
26
|
|
|
25
|
-
El
|
|
26
|
-
|
|
27
|
+
El agente escribe el test y el código; el **dev decide qué comportamientos importa
|
|
28
|
+
testear** (no se testea todo), valida cada slice, y **es responsable del resultado — no
|
|
29
|
+
la IA** ([Art. 7](../MANIFIESTO.md#art-7)). Ese es el antídoto del vibe coding: la
|
|
30
|
+
revisión minuciosa de lo que produjo el agente (paso 6, code review propio).
|
|
27
31
|
|
|
28
32
|
## Antipatrones
|
|
29
33
|
|
|
34
|
+
- **Aceptar lo que sale sin revisarlo** → vibe coding con otra cara. El agente propone;
|
|
35
|
+
el dev responde por el código.
|
|
30
36
|
- **Horizontal slicing** (todos los tests juntos) → tests de la *forma imaginada*, no
|
|
31
37
|
del comportamiento real.
|
|
32
38
|
- **Testear lo interno** (mocks de colaboradores, métodos privados) → el test se rompe
|
|
@@ -8,16 +8,19 @@ Dos revisiones distintas:
|
|
|
8
8
|
|
|
9
9
|
1. **El dev revisa su propia implementación** — la que produjo la IA, minucioso y con
|
|
10
10
|
criterio (correctitud, casos borde, seguridad, calidad). Es responsable del código, no
|
|
11
|
-
la IA (anti vibe-coding).
|
|
11
|
+
la IA (anti vibe-coding). Solo con eso en orden, y todo **commiteado**, crea la PR.
|
|
12
12
|
2. **Un partner revisa la PR** y **firma** aprobación/rechazo. Se apoya en la skill
|
|
13
13
|
`dai-review` para un primer pase consciente de la metodología: corre `dai check` (¿la US
|
|
14
|
-
quedó atrasada?), valida el DoD, revisa el código (
|
|
15
|
-
|
|
14
|
+
quedó atrasada?), valida el DoD, revisa el código (severidad low/medium/high) y deja un
|
|
15
|
+
**review inline** — un resumen + **un comentario anclado a cada `archivo:línea`**. La
|
|
16
|
+
skill valida cada posición contra el diff (descarta lo que el modelo inventó), te muestra
|
|
17
|
+
el preview y **espera tu OK antes de postear** ([ADR-0016](../adr/0016-review-inline.md)).
|
|
16
18
|
|
|
17
19
|
## Herramientas
|
|
18
20
|
|
|
19
|
-
- Skill [`dai-review`](../../skills/dai-review/SKILL.md) — GitHub y GitLab
|
|
20
|
-
MCP del forge o por `dai forge
|
|
21
|
+
- Skill [`dai-review`](../../skills/dai-review/SKILL.md) — GitHub y GitLab. Postea el review
|
|
22
|
+
inline por el MCP del forge o por `dai forge review <ref> --from <review.json>` (token);
|
|
23
|
+
`dai forge comment` queda como fallback simple sin anclar.
|
|
21
24
|
- `dai check` ([ADR-0003](../adr/0003-deteccion-y-estampado-son-comandos.md)).
|
|
22
25
|
- Gate de cierre: [`definition-of-done.md`](../../templates/definition-of-done.md).
|
|
23
26
|
|
|
@@ -11,13 +11,22 @@ cobertura inversa** en el tracker: qué repo/change implementa la US, contra qu
|
|
|
11
11
|
versión, con estado ✅/⚠️ y links (branch + commit-ancla).
|
|
12
12
|
|
|
13
13
|
```bash
|
|
14
|
-
dai check
|
|
15
|
-
dai
|
|
14
|
+
dai check # ¿estoy atrasado respecto de la US? (read-only)
|
|
15
|
+
dai check --ci # el mismo chequeo como GATE del PR: 0 pasa · 1 falta el link · 2 atrasado
|
|
16
|
+
dai stamp # escribe la cobertura en el tracker (branch + commit)
|
|
16
17
|
```
|
|
17
18
|
|
|
19
|
+
`dai stamp` sin argumentos deduce **qué US** estampar del nombre de tu rama, y si el repo
|
|
20
|
+
tiene varias vivas y no puede saberlo, **pregunta** antes de escribir: un comentario en un
|
|
21
|
+
tracker no se deshace. **En un pipeline pasá el ID** — `dai stamp ABC-482` — que además es
|
|
22
|
+
lo único que un CI sabe con certeza ([ADR-0018](../adr/0018-alcance-de-stamp-y-gate-de-ci.md)).
|
|
23
|
+
|
|
18
24
|
## Herramientas
|
|
19
25
|
|
|
20
26
|
- `dai check` / `dai stamp` — mismos comandos los corra un humano o el CI.
|
|
27
|
+
- `dai check --ci` — el gate de [`ci-rules.md`](../../governance/ci-rules.md) ejecutable:
|
|
28
|
+
exige el link en las ramas de producto y deja pasar `chore/`, `docs/`, `release/`…
|
|
29
|
+
Workflow listo para copiar: [`templates/ci-dai-gate.yml`](../../templates/ci-dai-gate.yml).
|
|
21
30
|
- Contenido del stamp: [ADR-0005](../adr/0005-superficie-comandos-y-stamp.md).
|
|
22
31
|
|
|
23
32
|
## Qué firma el humano
|
|
@@ -28,6 +37,8 @@ dai stamp # escribe la cobertura en el tracker (branch + commit)
|
|
|
28
37
|
## Antipatrones
|
|
29
38
|
|
|
30
39
|
- **Actualizar el estado del ticket a mano** → desincronización garantizada.
|
|
40
|
+
- **`dai stamp --all` en el CI** → le deja un comentario a cada US del repo, incluidas las
|
|
41
|
+
de sprints viejos. En un pipeline el ID va explícito.
|
|
31
42
|
- **Escribir el link en los dos lados** → se desincroniza al primer cambio (Art. 9).
|
|
32
43
|
- **Guardar solo la branch en el stamp** → 404 al borrarse; va con commit-ancla.
|
|
33
44
|
- **Creer que hace falta "un CI en Jira"** → es un comando; el tracker no ejecuta nada.
|
package/docs/detalle/08-daily.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
15 minutos: qué hice, qué voy a hacer, qué me traba. Es **sincronización**, no
|
|
8
8
|
reporte de estado. Se hace **a mano, sin IA, a propósito**.
|
|
9
9
|
|
|
10
|
-
## Por qué no metemos IA
|
|
10
|
+
## Por qué no metemos IA aquí
|
|
11
11
|
|
|
12
12
|
La IA *podría* auto-generar el "qué se hizo" desde git + el tracker. **No lo hacemos**:
|
|
13
13
|
el daily es donde el equipo se **apropia** del proceso, lo entiende y se coordina de
|
package/docs/detalle/README.md
CHANGED
|
@@ -9,7 +9,7 @@ los antipatrones a evitar.
|
|
|
9
9
|
| [01](01-refinamiento.md) | Refinamiento (idea → US testeable) | ●●● |
|
|
10
10
|
| [02](02-planning.md) | Planning (derivar el CÓMO) | ●● |
|
|
11
11
|
| [03](03-ramas.md) | Rama ligada al QUÉ | ●●● |
|
|
12
|
-
| [04](04-tdd.md) |
|
|
12
|
+
| [04](04-tdd.md) | Implementación (`/opsx:apply`, con TDD) | ●●● |
|
|
13
13
|
| [05](05-smoke.md) | Smoke end-to-end | ●● |
|
|
14
14
|
| [06](06-code-review.md) | Code review (IA + partner) | ●● |
|
|
15
15
|
| [07](07-merge-trazabilidad.md) | Merge + trazabilidad | ●●● |
|
package/docs/glosario.md
CHANGED
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
| **`implements.yaml`** | El archivo, en el change del repo, que contiene ese link. Lo genera `link-us`. Ejemplo lleno + árbol de dónde vive entre los artefactos de OpenSpec: [ADR-0004](adr/0004-ubicacion-y-schema-implements.md). |
|
|
25
25
|
| **Trazabilidad inversa / cobertura** | El mapa "quién implementó este QUÉ". **Se genera, nunca se escribe.** |
|
|
26
26
|
| **Índice / router** | La tabla central que dice qué ID vive en qué repos. Es un router, **no un almacén**: no guarda el detalle. |
|
|
27
|
-
| **Federación (dos niveles)** | Cómo se guarda la trazabilidad a escala: Nivel 1 = índice central chico; Nivel 2 = detalle en cada repo, resuelto on-demand. *(Es un eje distinto de los niveles de ceremonia N1/N2/N3:
|
|
27
|
+
| **Federación (dos niveles)** | Cómo se guarda la trazabilidad a escala: Nivel 1 = índice central chico; Nivel 2 = detalle en cada repo, resuelto on-demand. *(Es un eje distinto de los niveles de ceremonia N1/N2/N3: aquí "nivel" es dónde vive el dato, no el tamaño del equipo.)* |
|
|
28
28
|
| **Matriz de trazabilidad** | La vista "repo × versión × estado (al día / atrasado)". Derivada, no mantenida a mano. |
|
|
29
29
|
|
|
30
30
|
## El versionado
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
| **PR / MR (Pull / Merge Request)** | La unidad revisable del CÓMO. En dai lleva **dos activos**, y el review cubre ambos: (1) la **implementación** (el código) y (2) el **spec trazable** (el `implements.yaml` con el link a la US y el `@version` verificado). Sin el segundo, el CI bloquea el PR. Template en `../templates/pull-request.md`. |
|
|
47
47
|
| **Change** | La unidad de trabajo de OpenSpec (proposal + design + tasks + specs). |
|
|
48
48
|
| **ADR (Architecture Decision Record)** | El registro de una decisión estructural: contexto, decisión, consecuencias. Chico e **inmutable** — si algo cambia, se escribe uno nuevo que supersede al viejo. Template en `../templates/adr.md`; los de dai, en [`adr/`](adr/). |
|
|
49
|
-
| **TDD (Test-Driven Development)** | Escribir el test **antes** que el código: RED (test que falla) → GREEN (código mínimo) → REFACTOR. En dai
|
|
49
|
+
| **TDD (Test-Driven Development)** | Escribir el test **antes** que el código: RED (test que falla) → GREEN (código mínimo) → REFACTOR. En dai lo aplica el **agente** dentro de `/opsx:apply` (disciplina de la skill `tdd`): cada AC se vuelve un test. El dev valida y es responsable. Es el antídoto del vibe coding. |
|
|
50
50
|
| **Vertical slice** | Un test → una implementación → repetir. Lo opuesto a "todos los tests, después todo el código". |
|
|
51
51
|
| **Smoke** | Escenario end-to-end que verifica que el flujo grueso no se rompió. |
|
|
52
52
|
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
|
|
55
55
|
| Término | Qué es |
|
|
56
56
|
|---|---|
|
|
57
|
-
| **CI (Integración Continua)** | La automatización que corre en cada *push* / PR: compila, corre los tests y valida el repo. **En dai**, el CI ejecuta `dai check` como *gate* del PR (valida que el link exista y que el `ac_hash` coincida con la US viva) y, al mergear, `dai stamp
|
|
57
|
+
| **CI (Integración Continua)** | La automatización que corre en cada *push* / PR: compila, corre los tests y valida el repo. **En dai**, el CI ejecuta `dai check --ci` como *gate* del PR (valida que el link exista y que el `ac_hash` coincida con la US viva; las ramas `chore/`/`docs/` quedan exentas) y, al mergear, `dai stamp <ID>` (estampa la cobertura inversa en el tracker — nadie la escribe a mano). Qué valida, en [`governance/ci-rules.md`](../governance/ci-rules.md); workflow listo para copiar en [`templates/ci-dai-gate.yml`](../templates/ci-dai-gate.yml). |
|
|
58
58
|
| **CD (Despliegue Continuo)** | La automatización que lleva la versión a los ambientes (`dev` / `test` / `pre` / `prod`) y reporta a cuál llegó. **En dai**, el CD alimenta la **matriz repo × ambiente**: *implementado ≠ desplegado* — el CI dice "el repo implementó `@v3`", el CD dice "`@v3` está viva en `pre`". |
|
|
59
59
|
| **CI/CD** | Juntos, la "plomería" que **blinda** el método sin depender de que la gente se acuerde (enforcement, no vigilancia). En dai es **opcional** (ADR-0003): aparece sobre todo en **N3** (organización grande). En **N1/N2** los mismos comandos (`dai check`, `dai stamp`) corren a mano o por un git-hook — la trazabilidad es idéntica; solo cambia **quién** los dispara. dai **no trae** su propio CI/CD: se apoya en el pipeline que la organización ya tenga. |
|
|
60
60
|
|
package/docs/guias/dev.md
CHANGED
|
@@ -18,12 +18,14 @@
|
|
|
18
18
|
|
|
19
19
|
## Tu día a día
|
|
20
20
|
|
|
21
|
-
1. **
|
|
21
|
+
1. **Tomas una US** que cumple el [DoR](../../templates/definition-of-ready.md) → `/link-us ABC-###`. Crea la rama y el
|
|
22
22
|
`implements.yaml` **desde el ID, sin que tipees el key a mano** (Art. 8, Art. 9).
|
|
23
23
|
2. **Armas el CÓMO** → `opsx:explore` → `opsx:propose`. OpenSpec genera
|
|
24
24
|
`design.md`/`tasks.md`; tú validas y ajustas. Las tareas nacen del cómo.
|
|
25
|
-
3. **
|
|
26
|
-
|
|
25
|
+
3. **El agente implementa el CÓMO** → `/opsx:apply`. Aplica las tareas escribiendo
|
|
26
|
+
test-primero (TDD, vertical slices: RED → GREEN → refactor), por la **interfaz
|
|
27
|
+
pública** (Art. 7). Tú decides qué comportamientos importa testear; el agente los
|
|
28
|
+
construye.
|
|
27
29
|
4. **Smoke** → ejecutas el escenario end-to-end del flujo.
|
|
28
30
|
5. **Revisas la implementación de la IA** (code review propio) → minucioso y con criterio:
|
|
29
31
|
correctitud, casos borde, seguridad, calidad. **Eres responsable del código, no la IA**
|
|
@@ -33,11 +35,15 @@
|
|
|
33
35
|
arma la PR **precargada** (US + estado del check + links; los **dos activos**: código +
|
|
34
36
|
spec trazable) y la asignas a un partner.
|
|
35
37
|
7. **Review de un partner** → un compañero revisa tu PR y **firma** aprobación/rechazo
|
|
36
|
-
(Art. 5). Se apoya en la skill `/dai-review` para un primer pase
|
|
38
|
+
(Art. 5). Se apoya en la skill `/dai-review` para un primer pase: un **review inline**
|
|
39
|
+
(resumen + un comentario por línea), que le muestra el preview y espera su OK antes de postear.
|
|
37
40
|
*(Tu PR la revisas tú en el paso 5; la de un compañero, lo ayudas con la skill.)*
|
|
38
41
|
8. **Verificas el DoD** → [`definition-of-done.md`](../../templates/definition-of-done.md) antes de mergear.
|
|
39
42
|
9. **Merge → se estampa la cobertura** con `dai stamp` (lo corres tú tras mergear, o el CI
|
|
40
43
|
si la org lo tiene automatizado — mismo comando, ADR-0003). El estado se **deriva** (Art. 10).
|
|
44
|
+
`dai stamp` deduce **qué US** estampar del nombre de tu rama; si el repo tiene varias
|
|
45
|
+
vivas y no puede saberlo, te pregunta antes de escribir en el tracker. En un pipeline
|
|
46
|
+
pasa el ID: `dai stamp ABC-482` ([ADR-0018](../adr/0018-alcance-de-stamp-y-gate-de-ci.md)).
|
|
41
47
|
10. **(Opcional) Limpias la rama** → `dai done` te devuelve a la base (default `main`, o
|
|
42
48
|
`--base develop`), hace `fetch --prune` + `pull` y borra la rama local **solo si está
|
|
43
49
|
mergeada**. Higiene del repo tras el merge, sin riesgo de perder trabajo sin integrar.
|
|
@@ -45,7 +51,7 @@
|
|
|
45
51
|
## La trampa a evitar
|
|
46
52
|
|
|
47
53
|
**Vibe coding.** Nada de codear sobre una idea vaga o "improvisar y después vemos".
|
|
48
|
-
Si no hay US con criterios testeables, no
|
|
54
|
+
Si no hay US con criterios testeables, no empieces: falta el [DoR](../../templates/definition-of-ready.md). La disciplina
|
|
49
55
|
—US clara → design → test → código— es lo que separa esto de pedirle cosas a un chat.
|
|
50
56
|
|
|
51
57
|
## Cuando el QUÉ cambia
|
|
@@ -54,13 +60,31 @@ Si el PO sube la US a `v2`, tu `implements.yaml` (que apunta a `v1`) se marca
|
|
|
54
60
|
**atrasado** solo. Abres una nueva iteración contra `v2` y vuelves al paso 3. Nadie
|
|
55
61
|
te avisa: el link versionado lo hace [Art. 11](../MANIFIESTO.md#art-11).
|
|
56
62
|
|
|
63
|
+
### Cuando el que cambia el QUÉ eres tú
|
|
64
|
+
|
|
65
|
+
Implementando aparece un criterio que la US no decía, y lo escribes en el `us.md` del
|
|
66
|
+
change. Ahí el tracker queda viejo y tu `ac_hash` deja de coincidir con nada:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
dai update-us ABC-482 # empuja tu us.md al tracker + re-estampa el ac_hash local
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Te muestra qué va a cambiar allá arriba y **pide confirmación** antes de pisar la US
|
|
73
|
+
(`--dry-run` para solo mirar, `--yes` para saltar la pregunta). Sin `--us` toma el `us.md`
|
|
74
|
+
que está junto a tu `implements.yaml`.
|
|
75
|
+
|
|
76
|
+
> Que un criterio nuevo pase por el tracker no es burocracia: es lo que hace que el
|
|
77
|
+
> **PO se entere** de que la historia creció. Editar solo el `us.md` local deja el QUÉ
|
|
78
|
+
> partido en dos versiones y ninguna es la buena.
|
|
79
|
+
|
|
57
80
|
## Tus herramientas
|
|
58
81
|
|
|
59
82
|
- `/link-us`
|
|
60
83
|
- `/opsx:explore`
|
|
61
84
|
- `/opsx:propose`
|
|
62
|
-
- `/opsx:apply`
|
|
63
|
-
- `/tdd`
|
|
85
|
+
- `/opsx:apply` — el agente implementa las tareas (con TDD)
|
|
86
|
+
- `/tdd` — la disciplina TDD que aplica el paso anterior
|
|
64
87
|
- `/dai-review`
|
|
65
88
|
- `dai check` · `dai pr` · `dai stamp` · `dai done` (limpieza, opcional)
|
|
89
|
+
- `dai update-us` — empuja al tracker una US que refinaste implementando
|
|
66
90
|
- `definition-of-done.md`
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Guías por rol
|
|
2
|
+
|
|
3
|
+
Un camino corto según quién eres. Cada guía te dice de qué eres **dueño**, qué **no tocas**,
|
|
4
|
+
y tu **día a día**.
|
|
5
|
+
|
|
6
|
+
- [**Guía del PO / funcional**](./po) — dueño del **QUÉ**: defines las User Stories y el
|
|
7
|
+
porqué, nunca el CÓMO. Entrás por `grill-user-story`, `grill-epic` o `doc-to-backlog`.
|
|
8
|
+
- [**Guía del dev / ingeniero**](./dev) — dueño del **CÓMO** y del **link**: el agente
|
|
9
|
+
implementa con `/opsx:apply`, tú revisas y autoras el `implements.yaml`.
|
|
10
|
+
- [**Guía del lead / SM / arquitecto**](./lead) — custodio de las **invariantes** y del
|
|
11
|
+
**nivel de ceremonia** (N1 / N2 / N3): haces que el método se cumpla y se aligere donde
|
|
12
|
+
corresponde.
|
package/docs/guias/lead.md
CHANGED
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
|
|
24
24
|
## Tus decisiones clave
|
|
25
25
|
|
|
26
|
-
### 1. ¿En qué nivel
|
|
26
|
+
### 1. ¿En qué nivel empieza el equipo?
|
|
27
27
|
- **1 dev / 1 repo →** N1 (OpenSpec solo, cero herramientas externas).
|
|
28
28
|
- **Equipo compacto →** N2 (US en el gestor + `implements.yaml`).
|
|
29
29
|
- **Muchos repos + equipos separados →** N3 (Jira hub, CI estampa, matriz de ambientes).
|
package/docs/guias/po.md
CHANGED
|
@@ -18,16 +18,58 @@
|
|
|
18
18
|
|
|
19
19
|
## Tu día a día
|
|
20
20
|
|
|
21
|
-
1. **Nace una idea** → creas el ticket en el gestor (nace con ID,
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
21
|
+
1. **Nace una idea — o llega un documento** → creas el ticket en el gestor (nace con ID,
|
|
22
|
+
aunque sea vago). Si en cambio partes de un **documento de análisis** (PDF, Word),
|
|
23
|
+
`/doc-to-backlog` lo convierte en un **backlog candidato** de épicas + US para que
|
|
24
|
+
priorices y valides. Y si algo es **demasiado grande** para una sola US,
|
|
25
|
+
`/grill-epic` lo parte en varias.
|
|
26
|
+
2. **Pulir el QUÉ** → ejecutas `/grill-user-story`. La IA te **interroga** hasta que
|
|
26
27
|
la US es testeable (INVEST + Gherkin) y la publica en el gestor. La IA no
|
|
27
28
|
inventa requerimientos: te los saca a preguntas. Tú respondes y decides.
|
|
29
|
+
3. **Gate 0** → ejecutas `/grill-intent` sobre la US ya formada. La IA te desafía el
|
|
30
|
+
*problema*: ¿es el correcto? ¿quién lo sufre? ¿qué pasa si no lo hacemos? Un veredicto
|
|
31
|
+
válido es *"no lo construyas"* — eso es el gate haciendo su trabajo (Art. 4).
|
|
28
32
|
4. **Verificas el [DoR](../../templates/definition-of-ready.md)** → antes de que entre al sprint, la US cumple el
|
|
29
33
|
[`definition-of-ready.md`](../../templates/definition-of-ready.md).
|
|
30
|
-
5. **
|
|
34
|
+
5. **Editas una US que ya existe** → `dai edit-us ABC-482`. La **baja del gestor**, te la
|
|
35
|
+
abre en tu editor, **valida el formato** cuando guardas, te muestra qué cambia y
|
|
36
|
+
recién ahí la sube. Ver [Cuando el QUÉ cambia](#cuando-el-que-cambia) abajo.
|
|
37
|
+
6. **Demo** → aceptas o rechazas contra los mismos criterios que ya eran tests.
|
|
38
|
+
|
|
39
|
+
## Cuando el QUÉ cambia {#cuando-el-que-cambia}
|
|
40
|
+
|
|
41
|
+
Un criterio que faltaba, una regla que aparece a mitad del sprint. La US **vive en el
|
|
42
|
+
gestor**, no en un `.md` que alguien tiene que acordarse de sincronizar — así que dai la
|
|
43
|
+
trae, te deja editarla y la devuelve:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
dai edit-us ABC-482
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
1. **Baja** la US del gestor (Jira / ClickUp) a un `.md`.
|
|
50
|
+
2. **La abre** en tu `$EDITOR`. Escribes en markdown, con el
|
|
51
|
+
[molde canónico](../../templates/formato-us.md) delante.
|
|
52
|
+
3. **Valida el formato** al guardar: que tenga título, que tenga criterios, y que cada
|
|
53
|
+
criterio sea Gherkin completo (`Dado / Cuando / Entonces`). Si algo no da, **te
|
|
54
|
+
devuelve al editor** — no te tira lo escrito.
|
|
55
|
+
4. **Te muestra qué cambia** allá arriba: título, cuántos criterios, el `ac_hash`.
|
|
56
|
+
5. **Te pregunta si subir el `spec_version`** — y esta es la decisión tuya, no de dai:
|
|
57
|
+
|
|
58
|
+
| Tu cambio | Respondes | Qué pasa |
|
|
59
|
+
|---|---|---|
|
|
60
|
+
| Un criterio nuevo, una regla distinta (**material**) | `s` → `v1` → `v2` | los repos que implementaron `v1` se marcan **atrasados** solos |
|
|
61
|
+
| Un typo, redacción más clara (**editorial**) | `n` → se queda en `v1` | nadie se marca atrasado |
|
|
62
|
+
|
|
63
|
+
dai no puede distinguir las dos cosas mirando el hash: sabe *que* cambió, no *si
|
|
64
|
+
importa*. Eso lo sabes tú.
|
|
65
|
+
6. **Confirmas** y recién ahí escribe en el gestor. Sin confirmación no se toca nada.
|
|
66
|
+
|
|
67
|
+
> **`--dry-run`** te muestra todo el preview sin escribir. Úsalo la primera vez.
|
|
68
|
+
|
|
69
|
+
Solo dos cosas te **frenan**: que la US no tenga título, o que no tenga criterios. Sin
|
|
70
|
+
criterios no hay `ac_hash`, y sin `ac_hash` la US no se puede linkear a ningún repo — no
|
|
71
|
+
es una regla de estilo, es lo que sostiene la trazabilidad. Todo lo demás (un criterio
|
|
72
|
+
que no es Gherkin, un título largo) es un **aviso**: dai te lo dice y sigue.
|
|
31
73
|
|
|
32
74
|
## La trampa a evitar
|
|
33
75
|
|
|
@@ -44,7 +86,10 @@ el CI (Art. 10).
|
|
|
44
86
|
|
|
45
87
|
## Tus herramientas
|
|
46
88
|
|
|
47
|
-
- `/
|
|
48
|
-
- `/grill-
|
|
89
|
+
- `/doc-to-backlog` — un documento (PDF/Word) → backlog candidato de épicas + US
|
|
90
|
+
- `/grill-epic` — algo grande → una épica partida en varias US
|
|
91
|
+
- `/grill-user-story` — una US funcional y testeable
|
|
92
|
+
- `/grill-intent` — Gate 0: desafía el problema de la US antes del spec
|
|
93
|
+
- `dai edit-us <ID>` — traes una US del gestor, la editas, dai valida y la devuelve
|
|
49
94
|
- el gestor de proyectos
|
|
50
95
|
- [`definition-of-ready.md`](../../templates/definition-of-ready.md)
|
package/docs/index.md
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
layout: home
|
|
3
|
+
|
|
4
|
+
hero:
|
|
5
|
+
name: dai
|
|
6
|
+
text: Desarrollo Asistido por IA
|
|
7
|
+
tagline: La documentación del método — el manifiesto, las decisiones (ADRs) y las guías por rol. Todo buscable con ⌘K.
|
|
8
|
+
actions:
|
|
9
|
+
- theme: brand
|
|
10
|
+
text: Empezar
|
|
11
|
+
link: /PROBAR
|
|
12
|
+
- theme: alt
|
|
13
|
+
text: El manifiesto
|
|
14
|
+
link: /MANIFIESTO
|
|
15
|
+
- theme: alt
|
|
16
|
+
text: ↩ Volver a la landing
|
|
17
|
+
link: https://dforce2055.github.io/dai/
|
|
18
|
+
|
|
19
|
+
features:
|
|
20
|
+
- icon: 📐
|
|
21
|
+
title: El método
|
|
22
|
+
details: Manifiesto, metodología y el Scrum con IA en 10 pasos. El porqué antes que el cómo.
|
|
23
|
+
link: /MANIFIESTO
|
|
24
|
+
linkText: Leer el manifiesto
|
|
25
|
+
- icon: 🧭
|
|
26
|
+
title: Las decisiones (ADRs)
|
|
27
|
+
details: Cada decisión de diseño, registrada — del contrato del ac_hash al review inline. Por qué dai es como es.
|
|
28
|
+
link: /adr/
|
|
29
|
+
linkText: Ver los ADRs
|
|
30
|
+
- icon: 🧑💻
|
|
31
|
+
title: Guías por rol
|
|
32
|
+
details: Caminos cortos según quién sos — PO / analista, dev, o lead. Directo a lo que te toca.
|
|
33
|
+
link: /guias/dev
|
|
34
|
+
linkText: Ir a las guías
|
|
35
|
+
---
|