@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,254 @@
|
|
|
1
|
+
# Metodología de Desarrollo Asistido por IA
|
|
2
|
+
|
|
3
|
+
> **Fuente de verdad única.** Este documento es el maestro. Los dos HTML
|
|
4
|
+
> (`desarrollo-asistido-por-ia.html` federado y `-equipos-compactos.html`) son
|
|
5
|
+
> **vistas de presentación** derivadas de acá — si algo contradice a este `.md`,
|
|
6
|
+
> gana este `.md`. Versionado por git para que no driftee.
|
|
7
|
+
|
|
8
|
+
Una sola metodología para dos escalas opuestas:
|
|
9
|
+
|
|
10
|
+
- **Organización grande** — muchos procesos, muchos repos y desarrolladores,
|
|
11
|
+
funcional/PO y devs separados, tracker central (tipo Jira).
|
|
12
|
+
- **Equipo chico** — pocos desarrolladores que suelen usar los dos sombreros
|
|
13
|
+
(definen el QUÉ y el CÓMO), tracker liviano o ninguno.
|
|
14
|
+
|
|
15
|
+
No son dos metodologías. Es **un protocolo invariante** con **un dial de tres
|
|
16
|
+
niveles de ceremonia** — **N1** (un dev solo), **N2** (equipo compacto) y **N3**
|
|
17
|
+
(organización grande, federada), que se detallan en la
|
|
18
|
+
[§3](#3-el-dial-tres-niveles-de-ceremonia). El dev que aprende la ceremonia como sólo
|
|
19
|
+
developer o en equipo chico ya tiene todas las herramientas de la escala grande — solo le
|
|
20
|
+
suben la plomería.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 1. Los tres problemas que resolvemos
|
|
25
|
+
|
|
26
|
+
1. **Trazabilidad** entre especificaciones e implementación, desde el
|
|
27
|
+
requerimiento hasta el código — y de vuelta.
|
|
28
|
+
2. **Velocidad + calidad** del desarrollo asistido por IA: mejores specs, menos
|
|
29
|
+
retrabajo.
|
|
30
|
+
3. **No vibe coding**: implementación estructurada y estandarizada, no
|
|
31
|
+
improvisación. Se logra con una US bien definida + una herramienta de
|
|
32
|
+
implementación disciplinada (OpenSpec) + TDD.
|
|
33
|
+
|
|
34
|
+
La idea rectora: **separar el QUÉ del CÓMO** y mantenerlos **linkeados ida y
|
|
35
|
+
vuelta**, *sin importar la herramienta de abajo*.
|
|
36
|
+
|
|
37
|
+
| | **El QUÉ** | **El CÓMO** |
|
|
38
|
+
|---|---|---|
|
|
39
|
+
| Dueño | funcional / PO | dev / ingeniero |
|
|
40
|
+
| Herramienta | Jira/ClickUp + `grill-user-story` (o el `proposal.md` de OpenSpec en N1) | OpenSpec (o swagger, yml, md…) |
|
|
41
|
+
| Fuente de verdad de… | el contenido funcional | la relación QUÉ↔CÓMO y la implementación |
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## 2. El protocolo invariante (igual en los tres niveles)
|
|
46
|
+
|
|
47
|
+
Esto **no cambia nunca**, ni en el equipo chico ni en la organización grande. Es
|
|
48
|
+
lo que hace que sea *una* metodología.
|
|
49
|
+
|
|
50
|
+
### 2.1 Identidad estable
|
|
51
|
+
|
|
52
|
+
Todo QUÉ tiene un **ID único e independiente del path o del formato**. No se
|
|
53
|
+
inventa un esquema nuevo: el ID **es** el ticket del gestor (`ABC-###` en Jira,
|
|
54
|
+
el ID de ClickUp) o —en N1— el nombre del change de OpenSpec. El QUÉ nace con
|
|
55
|
+
identidad el día que se crea el ticket/change.
|
|
56
|
+
|
|
57
|
+
### 2.2 Formato linkeable garantizado
|
|
58
|
+
|
|
59
|
+
El QUÉ se produce con una forma mínima **testeable**: `id · spec_version · autor ·
|
|
60
|
+
criterios de aceptación en Gherkin`. Es exactamente lo que aseguran las skills
|
|
61
|
+
`grill-intent` → `grill-user-story` (ver `formato-us.md`). Sin esa forma, no hay
|
|
62
|
+
a qué linkear.
|
|
63
|
+
|
|
64
|
+
### 2.3 El link se autora una sola vez, del lado del CÓMO
|
|
65
|
+
|
|
66
|
+
El código declara `implements: <id>@<version>`. **Es el único link escrito a
|
|
67
|
+
mano.** La dirección inversa (cobertura: "quién implementó este QUÉ") **siempre se
|
|
68
|
+
genera**, nunca se escribe. Si se escribiera en los dos lados, se desincronizan al primer
|
|
69
|
+
cambio.
|
|
70
|
+
|
|
71
|
+
> **Regla de oro:** el link se escribe en un solo lado; la inversa se deriva. La
|
|
72
|
+
> matriz de trazabilidad no la mantiene nadie — se calcula.
|
|
73
|
+
|
|
74
|
+
### 2.4 `@version` = número + hash
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
@version = spec_version + ac_hash
|
|
78
|
+
(nº legible) (hash de los criterios de aceptación)
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
- **`spec_version`** (`v1`, `v2`…) lo sube la persona para **comunicar** un cambio
|
|
82
|
+
material del QUÉ.
|
|
83
|
+
- **`ac_hash`** lo calcula la máquina para **detectar**. Es el hash del bloque de
|
|
84
|
+
*Criterios de aceptación* normalizado (whitespace colapsado, orden estable).
|
|
85
|
+
|
|
86
|
+
Cuando el QUÉ evoluciona, cambia el `ac_hash`; todos los CÓMO que declaran el hash
|
|
87
|
+
viejo quedan marcados **atrasados** solos. El funcional ve "el backend todavía no
|
|
88
|
+
tomó mi cambio"; el dev ve "el QUÉ que implementé cambió". Nadie avisa a nadie — el
|
|
89
|
+
link versionado lo grita.
|
|
90
|
+
|
|
91
|
+
- Cambio **material** de los AC → cambia el hash → re-marca repos atrasados.
|
|
92
|
+
- Cambio **editorial** (typo, formato) → la normalización lo absorbe → **no**
|
|
93
|
+
dispara falso atraso.
|
|
94
|
+
|
|
95
|
+
### 2.5 Trazabilidad federada de dos niveles
|
|
96
|
+
|
|
97
|
+
El índice central es un **router, no un almacén**:
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
NIVEL 1 — Índice (central, grueso, chico, estable)
|
|
101
|
+
ABC-001 → implementado en: { backend, bff, frontend } @ v3
|
|
102
|
+
|
|
103
|
+
NIVEL 2 — Detalle (federado, en cada repo, se resuelve ON-DEMAND)
|
|
104
|
+
backend ── resolve implements=ABC-001 ──► su change / spec técnica
|
|
105
|
+
bff ── resolve implements=ABC-001 ──► su change / spec técnica
|
|
106
|
+
frontend ── resolve implements=ABC-001 ──► su change / spec técnica
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Una funcionalidad que toca 3 repos **no** genera 3× de mantenimiento central:
|
|
110
|
+
genera **una fila** con 3 destinos. El detalle se lee del repo cuando se necesita,
|
|
111
|
+
siempre fresco.
|
|
112
|
+
|
|
113
|
+
### 2.6 Granularidad del link: **capacidad entera** (norma)
|
|
114
|
+
|
|
115
|
+
`implements` es a nivel de **capacidad/US entera**, no criterio-por-criterio.
|
|
116
|
+
Si el QUÉ sabe *quién* lo implementó, obtener el detalle fino es trivial: se
|
|
117
|
+
resuelve el ID en el repo que interese. Criterio-por-criterio es trazabilidad
|
|
118
|
+
quirúrgica pero insostenible con multi-repo. **Decidido: capacidad entera +
|
|
119
|
+
federación.**
|
|
120
|
+
|
|
121
|
+
### 2.7 TDD como norma de implementación
|
|
122
|
+
|
|
123
|
+
El CÓMO se construye con **test primero**, en *vertical slices* (un test → una
|
|
124
|
+
implementación → repetir), verificando por la **interfaz pública**, no espiando lo
|
|
125
|
+
interno. Un buen test lee como una spec y sobrevive a un refactor. Ver
|
|
126
|
+
`skills/tdd/`.
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## 3. El dial: tres niveles de ceremonia
|
|
131
|
+
|
|
132
|
+
**Misma metodología, distinto nivel según escala.** Cada capa se agrega **cuando
|
|
133
|
+
duele, no antes.**
|
|
134
|
+
|
|
135
|
+
| | **N1 · Solo / 1 repo** | **N2 · Equipo compacto** | **N3 · Federado** |
|
|
136
|
+
|---|---|---|---|
|
|
137
|
+
| Caso típico | equipo chico arrancando, un dev | equipo chico | organización grande |
|
|
138
|
+
| El QUÉ vive en | `proposal.md` de OpenSpec | ClickUp (US) → el change la referencia | Jira (`ABC-###`, hub) |
|
|
139
|
+
| El link vive en | la carpeta del change (co-localizado) | `implements.yaml` en el repo | `implements.yaml` versionado |
|
|
140
|
+
| Inversa la genera | un comando local | comando / CI liviano | CI estampa cobertura + CD reporta ambiente |
|
|
141
|
+
| Índice central | no hace falta (todo co-localizado) | opcional (ClickUp como vista) | Jira = índice/router de la federación |
|
|
142
|
+
| Roles | 1 persona, ambos sombreros | pocos devs, PO informal | funcional/PO y devs separados |
|
|
143
|
+
| Gates | auto-review | review de un partner | Gate 0 formal + MR review + matriz repo×ambiente |
|
|
144
|
+
| Multi-repo | no | opcional (p. ej. front + back) | sí, es el punto |
|
|
145
|
+
|
|
146
|
+
### Regla de escala
|
|
147
|
+
|
|
148
|
+
> Empieza con lo mínimo que funciona (**N1: OpenSpec solo**). Suma ClickUp cuando el
|
|
149
|
+
> equipo lo pida (**N2**). Pasa al modelo federado solo cuando la escala lo
|
|
150
|
+
> justifique (**N3**). No adelantes complejidad.
|
|
151
|
+
|
|
152
|
+
El equipo chico vive en N1–N2 y quizás nunca necesite N3. La organización grande
|
|
153
|
+
vive en N3. **Ninguno mantiene dos metodologías** — es el mismo protocolo
|
|
154
|
+
(sección 2) con distinta plomería.
|
|
155
|
+
|
|
156
|
+
### Colapso de roles (clave para equipos chicos)
|
|
157
|
+
|
|
158
|
+
En un equipo chico una misma persona suele ser autor del QUÉ **y** del CÓMO. La metodología
|
|
159
|
+
lo permite **sin romper la trazabilidad**: el link `implements` sigue existiendo
|
|
160
|
+
aunque `autor_QUÉ == autor_CÓMO`, y los gates se **colapsan** (el Gate 0 y el
|
|
161
|
+
partner-review pasan a ser un auto-check honesto, no una firma de otra persona).
|
|
162
|
+
El artefacto no desaparece; se aligera la ceremonia alrededor.
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## 4. Responsabilidades (quién autora qué)
|
|
167
|
+
|
|
168
|
+
| | Autora | Herramienta | Fuente de verdad de… |
|
|
169
|
+
|---|---|---|---|
|
|
170
|
+
| QUÉ | PO / funcional (o el dev en N1) | Jira/ClickUp + `grill-user-story` | el contenido funcional |
|
|
171
|
+
| Link | dev / ingeniero | `implements:` en el código | la relación QUÉ↔CÓMO |
|
|
172
|
+
| Índice / vista inversa | CI (nadie a mano) | generado → publicado al PM | derivado, siempre verdadero |
|
|
173
|
+
| Implementación (CÓMO) | dev / ingeniero | OpenSpec + TDD | el código y su spec técnica |
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## 5. El flujo, punta a punta
|
|
178
|
+
|
|
179
|
+
```
|
|
180
|
+
① Nace la idea → ticket vago en el PM (o intención suelta en N1)
|
|
181
|
+
② Gate 0: ¿problema OK? → /grill-intent → veredicto: a-spec / reframe / descartar
|
|
182
|
+
③ Se pule el QUÉ → /grill-user-story → US testeable (formato-us.md),
|
|
183
|
+
publicada en Jira/ClickUp (o .md si no hay MCP)
|
|
184
|
+
④ Se abre el CÓMO → /link-us ABC-### → branch + implements.yaml ligados al ID
|
|
185
|
+
⑤ Se arma el change → opsx:explore → opsx:propose (proposal/design/tasks + specs)
|
|
186
|
+
⑥ Se implementa → TDD (red → green → refactor), vertical slices
|
|
187
|
+
⑦ Se promueve → opsx:apply → opsx:archive; el CI estampa cobertura en el PM
|
|
188
|
+
⑧ Se despliega → el CD reporta a qué ambiente (dev/test/pre/prod) fue la versión
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
- **En N1** los pasos ②–④ se colapsan: el `proposal.md` de OpenSpec **es** el QUÉ,
|
|
192
|
+
el change **es** el tracker, no hay PM externo.
|
|
193
|
+
- **En N2** aparece ③ (US en ClickUp) y el `implements.yaml` referencia esa US.
|
|
194
|
+
- **En N3** el flujo completo, con los gates formales y el CI/CD estampando estado
|
|
195
|
+
por repo y por ambiente.
|
|
196
|
+
|
|
197
|
+
**Implementación ≠ despliegue.** El CI dice "el repo implementó `@v3`"; el CD dice
|
|
198
|
+
"`@v3` está viva en `pre`, todavía no en `prod`". Se rastrea por ambiente.
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## 6. Las skills del proceso
|
|
203
|
+
|
|
204
|
+
| Skill | Lado | Qué hace |
|
|
205
|
+
|---|---|---|
|
|
206
|
+
| `grill-intent` | QUÉ | Gate 0: desafía el *problema* antes de escribir spec. Veredicto: a-spec / reframe / descartar. |
|
|
207
|
+
| `grill-user-story` | QUÉ | Interroga hasta producir una US testeable (INVEST + Gherkin). Publica en Jira/ClickUp o deja `.md`. |
|
|
208
|
+
| `link-us` | CÓMO | Crea branch + `implements.yaml` desde el ID del PM. El link, correcto por construcción. |
|
|
209
|
+
| `tdd` | CÓMO | Red-green-refactor en vertical slices, tests por interfaz pública. |
|
|
210
|
+
| `opsx:*` | CÓMO | OpenSpec: explore → propose → apply → archive. Lo provee OpenSpec. |
|
|
211
|
+
|
|
212
|
+
El **adaptador de PM** es un seam único: las skills del QUÉ publican en Jira **o**
|
|
213
|
+
ClickUp **o** dejan un `.md` según qué MCP/token haya. Es la **misma** skill con
|
|
214
|
+
distinto backend — no se bifurca por tamaño de equipo.
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## 7. Decisiones abiertas (plomería de N3)
|
|
219
|
+
|
|
220
|
+
El protocolo (sección 2) está cerrado **e implementado** en el CLI `dai`. De la plomería
|
|
221
|
+
de N3 queda **una** decisión sin resolver; el resto se cerró al construir la herramienta.
|
|
222
|
+
|
|
223
|
+
1. **Reporte de despliegue por ambiente (CD).** Cómo el CD reporta a Jira qué versión vive
|
|
224
|
+
en cada ambiente (`dev`/`test`/`pre`/`prod`), para la matriz repo×ambiente. dai hoy
|
|
225
|
+
estampa **cobertura** (implementación), no **despliegue** — *implementación ≠ despliegue*
|
|
226
|
+
(§2.5). Sigue abierta porque depende del pipeline que cada organización ya tenga; no la
|
|
227
|
+
fuerza el método ([ADR-0003](adr/0003-deteccion-y-estampado-son-comandos.md)).
|
|
228
|
+
|
|
229
|
+
**Ya resueltas** (al construir dai):
|
|
230
|
+
- **Adaptador de PM configurable** → `getAdapter` (backends `md`/`jira`/`clickup`, token del
|
|
231
|
+
`.env`); modelo de auth en [ADR-0007](adr/0007-modelo-de-autenticacion.md).
|
|
232
|
+
- **Formato de `implements.yaml`** → congelado en [ADR-0004](adr/0004-ubicacion-y-schema-implements.md)
|
|
233
|
+
(schema + ubicación + descubrimiento por glob).
|
|
234
|
+
- **Escritura multi-repo en el tracker** → `dai stamp` deja un **comentario por repo** (no se
|
|
235
|
+
pisan); superficie de comandos en [ADR-0005](adr/0005-superficie-comandos-y-stamp.md). Una org
|
|
236
|
+
N3 grande podría preferir un panel/custom-field, pero el mecanismo por defecto está decidido.
|
|
237
|
+
- **`ac_hash`** = algoritmo + tres momentos ([ADR-0001](adr/0001-contrato-ac-hash.md), en `dai ac-hash`) ·
|
|
238
|
+
**detección/estampado como comandos** ([ADR-0003](adr/0003-deteccion-y-estampado-son-comandos.md)) ·
|
|
239
|
+
**agnóstico del asistente** ([ADR-0002](adr/0002-agnostico-del-asistente.md)) · granularidad = capacidad
|
|
240
|
+
entera (§2.6) · colapso de roles (§3) · formato de US + skills del QUÉ.
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## 8. En resumen (para no técnicos)
|
|
245
|
+
|
|
246
|
+
El **funcional** dice *qué* hay que hacer, en su herramienta de siempre (Jira),
|
|
247
|
+
sin entrar nunca al editor de código. Una IA lo ayuda a que ese "qué" quede claro y
|
|
248
|
+
testeable. El **dev** dice *cómo* se hace, en su repo, y deja una etiqueta que
|
|
249
|
+
apunta al "qué". A partir de ahí, **una máquina** arma sola el mapa de quién hizo
|
|
250
|
+
qué, contra qué versión, y quién quedó atrasado — sin que nadie lo mantenga a mano.
|
|
251
|
+
Si el funcional cambia el "qué", el mapa marca solo a los que todavía no lo
|
|
252
|
+
tomaron. En un equipo chico la misma persona hace las dos cosas y todo vive en una
|
|
253
|
+
carpeta; en una organización grande hay equipos separados y el mapa lo publica el
|
|
254
|
+
CI en el tracker. **Es el mismo método; cambia cuánta maquinaria le cuelgas.**
|
package/docs/PROBAR.md
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Probar dai
|
|
2
|
+
|
|
3
|
+
No hace falta publicar en npm para probarlo. Se prueba local. Recomendado: hacer la
|
|
4
|
+
**Fase 0** (backend `md`, sin credenciales) para validar el flujo, y después la
|
|
5
|
+
**Fase 1** (ClickUp real).
|
|
6
|
+
|
|
7
|
+
> Esto es la guía para **usar** dai por primera vez. Para verlo funcionando sobre una
|
|
8
|
+
> US real (narrado), mira [`EJEMPLO-END-TO-END.md`](EJEMPLO-END-TO-END.md).
|
|
9
|
+
|
|
10
|
+
## Instalar el CLI
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm i -g @dforce2055/dai # desde npm
|
|
14
|
+
# — o, si clonaste el repo —
|
|
15
|
+
git clone https://github.com/dforce2055/dai && cd dai && npm link
|
|
16
|
+
|
|
17
|
+
dai --version
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Fase 0 — sin credenciales (backend `md`)
|
|
21
|
+
|
|
22
|
+
Valida el loop completo `link-us → check → stamp` sin depender de red ni tokens.
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# 1. Repo de prueba + bootstrap (dai init deja el .env; elige "md" cuando pregunte)
|
|
26
|
+
mkdir /tmp/dai-test && cd /tmp/dai-test
|
|
27
|
+
git init && git commit --allow-empty -m init
|
|
28
|
+
git remote add origin git@github.com:TU-USUARIO/dai-test.git # para los links de branch/commit
|
|
29
|
+
dai init --for both --pm md
|
|
30
|
+
|
|
31
|
+
# 2. Escribe una US (formato formato-us.md) y publícala con el CLI
|
|
32
|
+
cat > draft.md <<'EOF'
|
|
33
|
+
# Finalizar la compra del carrito
|
|
34
|
+
|
|
35
|
+
## Criterios de aceptación
|
|
36
|
+
- Dado un carrito vacío, cuando se finaliza, entonces se rechaza
|
|
37
|
+
EOF
|
|
38
|
+
dai publish draft.md # crea la US → devuelve el key (con md, un slug)
|
|
39
|
+
# ej: "US publicada en md: finalizar-la-compra-del-carrito"
|
|
40
|
+
|
|
41
|
+
# 3. El flujo del dev
|
|
42
|
+
dai link-us finalizar-la-compra-del-carrito # branch + implements.yaml
|
|
43
|
+
git add -A && git commit -m "feat: guard carrito vacío"
|
|
44
|
+
dai check # ✅ al día
|
|
45
|
+
|
|
46
|
+
# 4. La demo del ⚠️: edita el criterio en .dai/us/<slug>.md y vuelve a chequear
|
|
47
|
+
dai check # ⚠️ ATRASADO (exit 1) → sugiere: dai link-us <id> --resync
|
|
48
|
+
dai stamp # con md, deja .dai/us/<slug>.coverage.md
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Si esto anda, el flujo está bien. Pasa al tracker real.
|
|
52
|
+
|
|
53
|
+
## Fase 1 — ClickUp real
|
|
54
|
+
|
|
55
|
+
**Preparar ClickUp:**
|
|
56
|
+
|
|
57
|
+
1. **La US:** una tarea con los criterios en la **descripción**, bajo un heading que
|
|
58
|
+
matchee `Criterios de aceptación` (es lo que dai hashea).
|
|
59
|
+
2. **El ID:** en la tarea, `...` → *Copy ID* (tipo `86cxyz`).
|
|
60
|
+
3. **El token:** ClickUp → *Settings → Apps → Generate* (empieza con `pk_...`).
|
|
61
|
+
|
|
62
|
+
**Config y flujo:**
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
cat > .env <<'EOF'
|
|
66
|
+
DAI_PM=clickup
|
|
67
|
+
DAI_CLICKUP_TOKEN=pk_XXXXXXXX
|
|
68
|
+
DAI_TRACKER_URL_TEMPLATE=https://app.clickup.com/t/{id}
|
|
69
|
+
EOF
|
|
70
|
+
dai doctor # confirma DAI_PM=clickup y el token
|
|
71
|
+
|
|
72
|
+
dai link-us 86cxyz # trae la US de ClickUp → branch + implements.yaml
|
|
73
|
+
git add -A && git commit -m "feat: ..."
|
|
74
|
+
dai check # ✅ al día
|
|
75
|
+
|
|
76
|
+
# → edita un criterio de la tarea en ClickUp (en el navegador). Después:
|
|
77
|
+
dai check # ⚠️ ATRASADO (lo detectó solo)
|
|
78
|
+
dai stamp # deja un COMENTARIO en la tarea con la cobertura
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
> El `.env` está gitignored: el token no se commitea (ADR-0007).
|
|
82
|
+
|
|
83
|
+
## Troubleshooting
|
|
84
|
+
|
|
85
|
+
| Síntoma | Causa probable |
|
|
86
|
+
|---|---|
|
|
87
|
+
| `no encontré la US <id>` | ID mal, o el token no ve esa tarea |
|
|
88
|
+
| `clickup 401` | token inválido o expirado |
|
|
89
|
+
| `check` siempre da ⚠️ | editaste la US entre `link-us` y `check` (esperado), **o** los criterios no están bajo el heading `Criterios de aceptación` |
|
|
90
|
+
| `sin US` en `check` | la tarea no tiene el bloque de criterios en la descripción |
|
|
91
|
+
| branch/commit vacíos en el stamp | falta el remoto git (`git remote add origin …`) |
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# Scrum con IA — El puente de adopción
|
|
2
|
+
|
|
3
|
+
> **Para qué sirve este documento.** Es la pieza de *buy-in*: le muestra al equipo
|
|
4
|
+
> que **no cambiamos su Scrum**. Los mismos pasos, los mismos roles, las mismas
|
|
5
|
+
> ceremonias — solo que en cada paso donde hoy hay fricción o trabajo manual, hay
|
|
6
|
+
> una skill de IA que lo hace por ti o te obliga a hacerlo bien.
|
|
7
|
+
>
|
|
8
|
+
> El protocolo que hay debajo (identidad estable, link QUÉ↔CÓMO, `@version`) vive
|
|
9
|
+
> en [`METODOLOGIA.md`](METODOLOGIA.md). Acá contamos **la ceremonia**, paso a paso.
|
|
10
|
+
|
|
11
|
+
## La frase para el equipo
|
|
12
|
+
|
|
13
|
+
> **"Es tu mismo Scrum. Donde hoy haces algo a mano y con fricción, ahora invocas
|
|
14
|
+
> una skill. El esqueleto es el que ya conoces — la curva de aprendizaje es casi
|
|
15
|
+
> cero."**
|
|
16
|
+
|
|
17
|
+
## Cómo leer la tabla de cada paso
|
|
18
|
+
|
|
19
|
+
- **Clásico** — qué se hace hoy en Scrum tradicional.
|
|
20
|
+
- **Dolor** — qué duele hoy (incluso sin IA).
|
|
21
|
+
- **Con IA** — el pequeño ajuste potenciado por IA. No reemplaza el paso: lo mejora.
|
|
22
|
+
- **Humano ([`HITL`](glosario.md))** — qué queda en manos de la persona, a propósito, para que el
|
|
23
|
+
equipo se adueñe del proceso y lo entienda.
|
|
24
|
+
- **Herramienta** — la skill o pieza que lo habilita.
|
|
25
|
+
- **Detalle →** — link al entregable ampliado (uno por paso, para no hacer esto extenso).
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Los 10 pasos
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
ENTRADA DEL SPRINT DURANTE EL SPRINT (por cada US) EVENTOS / CIERRE
|
|
33
|
+
┌──────────────────┐ ┌──────────────────────────┐ ┌──────────────────┐
|
|
34
|
+
│ 1 Refinamiento │ │ 3 Rama ligada a la US │ │ 8 Daily (manual) │
|
|
35
|
+
│ 2 Sprint Planning│ → │ 4 Implementación TDD │ → │ 9 Review / Demo │
|
|
36
|
+
└──────────────────┘ │ 5 Smoke test │ │ 10 Retro (manual)│
|
|
37
|
+
│ 6 Code review │ └──────────────────┘
|
|
38
|
+
│ 7 Merge + trazabilidad │
|
|
39
|
+
└──────────────────────────┘
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
### Fase A — Entrada del sprint
|
|
45
|
+
|
|
46
|
+
#### 1. Refinamiento: de épica a US testeable
|
|
47
|
+
|
|
48
|
+
| | |
|
|
49
|
+
|---|---|
|
|
50
|
+
| **Clásico** | El PO parte épicas en Historias de Usuario y les pone criterios de aceptación. |
|
|
51
|
+
| **Dolor** | US vagas, no testeables ("el usuario quiere un botón"). El malentendido se descubre tarde, ya implementado. |
|
|
52
|
+
| **Con IA** | `grill-intent` (Gate 0: ¿es el problema correcto? veredicto a-spec / reframe / descartar) y luego `grill-user-story` **interrogan** al PO hasta que la US es testeable por construcción (INVEST + Gherkin). La IA no *escribe* la US: la *saca a preguntas*. La US nace con ID estable y criterios hasheables. |
|
|
53
|
+
| **Humano (HITL)** | El PO responde y decide. La IA no inventa requerimientos: los pule. |
|
|
54
|
+
| **Herramienta** | `grill-intent`, `grill-user-story`, `formato-us.md` |
|
|
55
|
+
| **Detalle →** | [`detalle/01-refinamiento.md`](detalle/01-refinamiento.md) |
|
|
56
|
+
|
|
57
|
+
#### 2. Sprint Planning: comprometer US y derivar tareas
|
|
58
|
+
|
|
59
|
+
| | |
|
|
60
|
+
|---|---|
|
|
61
|
+
| **Clásico** | El equipo elige qué US entran al sprint y las rompe en tareas técnicas. |
|
|
62
|
+
| **Dolor** | Las tareas las inventa alguien de arriba o no existen; se estima a ciegas. |
|
|
63
|
+
| **Con IA** | El dev corre `opsx:explore` → `opsx:propose`: OpenSpec **genera el design y las tareas** desde la US. Las tareas nacen del *cómo*, definidas por quien va a implementar. |
|
|
64
|
+
| **Humano (HITL)** | El equipo decide capacidad y prioridad. El dev valida y ajusta el design propuesto. |
|
|
65
|
+
| **Herramienta** | `opsx:explore`, `opsx:propose` |
|
|
66
|
+
| **Detalle →** | [`detalle/02-planning.md`](detalle/02-planning.md) |
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
### Fase B — Durante el sprint (por cada US)
|
|
71
|
+
|
|
72
|
+
#### 3. Rama ligada a la US
|
|
73
|
+
|
|
74
|
+
| | |
|
|
75
|
+
|---|---|
|
|
76
|
+
| **Clásico** | El dev crea una rama para trabajar la US. |
|
|
77
|
+
| **Dolor** | Nombres inconsistentes, ramas que no se sabe a qué US pertenecen → trazabilidad rota desde el commit uno. |
|
|
78
|
+
| **Con IA** | `link-us ABC-###` crea la rama **desde el ID de la US, sin tipearlo a mano**, y genera el `implements.yaml`. La rama *es* el link: correcto por construcción. |
|
|
79
|
+
| **Humano (HITL)** | El dev elige qué US agarra. |
|
|
80
|
+
| **Herramienta** | `link-us` |
|
|
81
|
+
| **Detalle →** | [`detalle/03-ramas.md`](detalle/03-ramas.md) |
|
|
82
|
+
|
|
83
|
+
#### 4. Implementación con TDD
|
|
84
|
+
|
|
85
|
+
| | |
|
|
86
|
+
|---|---|
|
|
87
|
+
| **Clásico** | El dev codea. Idealmente con tests. |
|
|
88
|
+
| **Dolor** | Se codea primero y se testea "si queda tiempo" (nunca queda). Vibe coding. |
|
|
89
|
+
| **Con IA** | La skill `tdd` fuerza test→código en *vertical slices* (un test → una implementación → repetir). La IA escribe el test como spec ejecutable **antes** del código, verificando por la interfaz pública. Anti vibe-coding real. |
|
|
90
|
+
| **Humano (HITL)** | El dev decide qué comportamientos importa testear y revisa cada slice. |
|
|
91
|
+
| **Herramienta** | `tdd` |
|
|
92
|
+
| **Detalle →** | [`detalle/04-tdd.md`](detalle/04-tdd.md) |
|
|
93
|
+
|
|
94
|
+
#### 5. Smoke test de la US
|
|
95
|
+
|
|
96
|
+
| | |
|
|
97
|
+
|---|---|
|
|
98
|
+
| **Clásico** | Antes de cerrar se verifica que no se rompió nada grueso. |
|
|
99
|
+
| **Dolor** | Smoke manual, se olvida, o no existe. |
|
|
100
|
+
| **Con IA** | La IA arma y corre un smoke del flujo end-to-end como paso de cierre de la US. |
|
|
101
|
+
| **Humano (HITL)** | El dev confirma que el escenario refleja el uso real. |
|
|
102
|
+
| **Herramienta** | skills de smoke por dominio (p. ej. `smoke-*`) |
|
|
103
|
+
| **Detalle →** | [`detalle/05-smoke.md`](detalle/05-smoke.md) |
|
|
104
|
+
|
|
105
|
+
#### 6. Code review
|
|
106
|
+
|
|
107
|
+
| | |
|
|
108
|
+
|---|---|
|
|
109
|
+
| **Clásico** | Un compañero revisa el PR/MR antes de mergear. |
|
|
110
|
+
| **Dolor** | Depende de que el partner tenga tiempo y ganas; reviews superficiales que dejan pasar lo importante. |
|
|
111
|
+
| **Con IA** | La IA hace el **primer pase** (correctitud + estándares del repo) antes del humano. El partner revisa lo que importa, no el ruido. |
|
|
112
|
+
| **Humano (HITL)** | El partner aprueba o rechaza. La IA sugiere; la persona decide y firma. |
|
|
113
|
+
| **Herramienta** | `dai-review` |
|
|
114
|
+
| **Detalle →** | [`detalle/06-code-review.md`](detalle/06-code-review.md) |
|
|
115
|
+
|
|
116
|
+
#### 7. Merge + trazabilidad automática
|
|
117
|
+
|
|
118
|
+
| | |
|
|
119
|
+
|---|---|
|
|
120
|
+
| **Clásico** | Se mergea y (a veces) alguien actualiza el estado en el tracker. |
|
|
121
|
+
| **Dolor** | El estado del tracker queda desactualizado; se llena a mano o no se llena. |
|
|
122
|
+
| **Con IA** | Al mergear, el CI **estampa la cobertura inversa** en el tracker: qué repo implementó qué US, contra qué `@version`. El estado se *deriva*, no se reporta. El `@version`/`ac_hash` marca solo si el QUÉ cambió y el código quedó atrás. |
|
|
123
|
+
| **Humano (HITL)** | Nadie mantiene la matriz a mano — ese es el punto. |
|
|
124
|
+
| **Herramienta** | CI + `implements.yaml` + índice/router |
|
|
125
|
+
| **Detalle →** | [`detalle/07-merge-trazabilidad.md`](detalle/07-merge-trazabilidad.md) |
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
### Fase C — Eventos y cierre
|
|
130
|
+
|
|
131
|
+
#### 8. Daily standup — **manual (HITL)**
|
|
132
|
+
|
|
133
|
+
| | |
|
|
134
|
+
|---|---|
|
|
135
|
+
| **Clásico** | 15 min: qué hice, qué voy a hacer, qué me traba. |
|
|
136
|
+
| **Dolor** | A veces se vuelve reporte de estado en vez de sincronización. |
|
|
137
|
+
| **Con IA** | **Ninguno, a propósito.** Se deja manual para mantener el *human-in-the-loop*: es donde el equipo se apropia del proceso, lo entiende y se coordina de verdad. La IA podría auto-generar el "qué se hizo" desde git, pero eso le sacaría al equipo la propiedad del ritual. |
|
|
138
|
+
| **Humano (HITL)** | Todo. La conversación es el valor. |
|
|
139
|
+
| **Herramienta** | — |
|
|
140
|
+
| **Detalle →** | [`detalle/08-daily.md`](detalle/08-daily.md) |
|
|
141
|
+
|
|
142
|
+
#### 9. Sprint Review / Demo
|
|
143
|
+
|
|
144
|
+
| | |
|
|
145
|
+
|---|---|
|
|
146
|
+
| **Clásico** | Se muestra lo terminado al PO y stakeholders; se acepta o rechaza contra criterios. |
|
|
147
|
+
| **Dolor** | "Esto no era lo que pedí". El QUÉ y el CÓMO se desincronizaron sin que nadie lo notara. |
|
|
148
|
+
| **Con IA** | Se valida contra criterios de aceptación que **ya eran tests**. Si el QUÉ evolucionó, el `@version` lo gritó antes de la demo — no hay sorpresas. |
|
|
149
|
+
| **Humano (HITL)** | El PO acepta o rechaza. La demo la corre una persona. |
|
|
150
|
+
| **Herramienta** | criterios Gherkin de la US + `@version` |
|
|
151
|
+
| **Detalle →** | [`detalle/09-review.md`](detalle/09-review.md) |
|
|
152
|
+
|
|
153
|
+
#### 10. Retrospective — **manual (HITL)**
|
|
154
|
+
|
|
155
|
+
| | |
|
|
156
|
+
|---|---|
|
|
157
|
+
| **Clásico** | El equipo mira *cómo trabajó* y elige 1–2 mejoras. |
|
|
158
|
+
| **Dolor** | Se mejora "la sensación", sin datos. |
|
|
159
|
+
| **Con IA** | **Ninguno directo, a propósito** — el ritual es humano. Pero la matriz de trazabilidad y las métricas de las US aportan **datos reales** de dónde se trabó el flujo, para que la conversación humana no sea a ciegas. |
|
|
160
|
+
| **Humano (HITL)** | Todo el análisis y las decisiones de mejora. |
|
|
161
|
+
| **Herramienta** | matriz de trazabilidad (input, no reemplazo) |
|
|
162
|
+
| **Detalle →** | [`detalle/10-retro.md`](detalle/10-retro.md) |
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## Resumen: dónde entra la IA y dónde no
|
|
167
|
+
|
|
168
|
+
| Paso | IA | Por qué |
|
|
169
|
+
|---|---|---|
|
|
170
|
+
| 1 Refinamiento | ●●● | La US testeable es la base de todo. |
|
|
171
|
+
| 2 Planning | ●● | El design y las tareas se derivan de la US. |
|
|
172
|
+
| 3 Rama | ●●● | El link correcto por construcción. |
|
|
173
|
+
| 4 TDD | ●●● | El corazón del anti vibe-coding. |
|
|
174
|
+
| 5 Smoke | ●● | Cierre verificable de la US. |
|
|
175
|
+
| 6 Code review | ●● | Primer pase automático, humano decide. |
|
|
176
|
+
| 7 Merge + trazabilidad | ●●● | La matriz se deriva sola. |
|
|
177
|
+
| 8 Daily | ○ | **Manual a propósito** — apropiación del proceso. |
|
|
178
|
+
| 9 Review / Demo | ● | Validación contra criterios que ya eran tests. |
|
|
179
|
+
| 10 Retro | ○ | **Manual a propósito** — la IA solo aporta datos. |
|
|
180
|
+
|
|
181
|
+
`●●● = la IA hace el trabajo pesado` · `●● = asiste fuerte` · `● = aporta` · `○ = humano puro (HITL)`
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## El detalle de cada paso
|
|
186
|
+
|
|
187
|
+
Cada paso `1–10` está ampliado en su propio doc bajo [`detalle/`](detalle/) — para
|
|
188
|
+
que este maestro quede corto y repartible. Cada uno incluye: en qué consiste en detalle, la
|
|
189
|
+
herramienta con ejemplos, qué firma la persona (HITL) y los antipatrones a evitar.
|
|
190
|
+
Ver el índice en [`detalle/README.md`](detalle/README.md).
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# ADR-0001 — El contrato del `ac_hash`
|
|
2
|
+
|
|
3
|
+
- **Estado:** aceptado
|
|
4
|
+
- **Fecha:** 2026-07-03
|
|
5
|
+
- **Decide:** lead / arquitecto de la metodología
|
|
6
|
+
|
|
7
|
+
## Contexto
|
|
8
|
+
|
|
9
|
+
El `@version` del link ([Art. 11](../MANIFIESTO.md#art-11) del manifiesto) es lo que hace que un cambio del QUÉ
|
|
10
|
+
marque solo a los CÓMO atrasados. Ese mecanismo depende del `ac_hash`: un hash de
|
|
11
|
+
los criterios de aceptación. Hasta ahora el `ac_hash` figuraba como "autogenerado"
|
|
12
|
+
pero ninguna skill ni CI lo calculaba de verdad — con lo cual el versionado era
|
|
13
|
+
decorativo. Sin un algoritmo definido, dos problemas: un typo dispararía un falso
|
|
14
|
+
atraso, y distintas implementaciones (skill vs CI) podrían calcular hashes distintos.
|
|
15
|
+
|
|
16
|
+
Y un tercero, más profundo: **el QUÉ muta después de publicarse, y no siempre por la
|
|
17
|
+
skill.** Un PO edita un criterio a mano en Jira. Si el `ac_hash` se calculara **una
|
|
18
|
+
sola vez** (al publicar la US), quedaría stale ante esa edición y la detección de
|
|
19
|
+
atrasos se rompería en silencio — justo el pecado que la metodología existe para
|
|
20
|
+
evitar. Por lo tanto el hash **no puede ser un evento de autoría**: tiene que
|
|
21
|
+
re-derivarse de la US viva en el momento de la verificación.
|
|
22
|
+
|
|
23
|
+
## Decisión
|
|
24
|
+
|
|
25
|
+
### El algoritmo (una sola implementación: `dai ac-hash`)
|
|
26
|
+
|
|
27
|
+
1. Tomar el bloque **Criterios de aceptación** de la US.
|
|
28
|
+
2. **Normalizar**: remover marcado editorial (checkboxes, viñetas, numeración,
|
|
29
|
+
etiquetas `AC-N`, énfasis, headings) y colapsar todo el whitespace. Objetivo: que
|
|
30
|
+
un cambio *editorial* no cambie el hash.
|
|
31
|
+
3. Hashear el texto normalizado con **SHA-256**, truncado a 8 hex (`7f3a9c2e`).
|
|
32
|
+
4. El **orden** de los criterios es significativo: reordenar cambia el hash (por eso
|
|
33
|
+
el formato de US pide orden estable). No se ordena en la normalización.
|
|
34
|
+
|
|
35
|
+
Existe **una sola** implementación canónica: el comando `dai ac-hash` (CLI, cero
|
|
36
|
+
dependencias). Nadie más calcula el hash: todos lo **invocan**. En particular, una
|
|
37
|
+
skill (un LLM) **nunca** computa el hash por su cuenta — sería no determinista y
|
|
38
|
+
daría distinto al CI (ver ADR-0002: lo mecánico vive en el CLI).
|
|
39
|
+
|
|
40
|
+
### Los tres momentos (y quién es la autoridad)
|
|
41
|
+
|
|
42
|
+
| Momento | Quién | Qué hace con el hash |
|
|
43
|
+
|---|---|---|
|
|
44
|
+
| **Publicar la US** | `grill-user-story` → invoca `dai ac-hash` | *(opcional)* muestra/embebe el hash de nacimiento (v1). **Conveniencia, no verdad.** |
|
|
45
|
+
| **Implementar** | `link-us` → invoca `dai ac-hash` | estampa en `implements.yaml` el hash que el CÓMO **declara** implementar. |
|
|
46
|
+
| **Verificar** | CI / indexador → `dai ac-hash` sobre la US **viva** | re-deriva y **compara** con `implements.yaml`. Distinto → ⚠️ atrasado. |
|
|
47
|
+
|
|
48
|
+
**La única fuente de verdad de la detección es el tercer momento**: el CI re-deriva el
|
|
49
|
+
hash leyendo la US como está *ahora*, no una copia estampada en el pasado. Los otros
|
|
50
|
+
dos son declaraciones/cortesías.
|
|
51
|
+
|
|
52
|
+
### El artefacto-QUÉ (matiz de niveles)
|
|
53
|
+
|
|
54
|
+
La detección exige un **artefacto-QUÉ con identidad estable y criterios testeables**,
|
|
55
|
+
no necesariamente una US publicada en un tracker. En N3/N2 es la US en Jira/ClickUp;
|
|
56
|
+
en N1 es el `proposal.md` de OpenSpec (los niveles de ceremonia N1/N2/N3 — dev solo /
|
|
57
|
+
equipo compacto / organización grande — están en el [glosario](../glosario.md)). El `ac_hash` se calcula igual sobre cualquiera
|
|
58
|
+
de los tres — no forzamos tracker externo donde el Art. 14 dice no adelantar
|
|
59
|
+
complejidad.
|
|
60
|
+
|
|
61
|
+
## Consecuencias
|
|
62
|
+
|
|
63
|
+
- ✅ El versionado deja de ser decorativo: los atrasos se detectan solos.
|
|
64
|
+
- ✅ Cambios editoriales (typos, reformatos) **no** disparan falsos atrasos.
|
|
65
|
+
- ✅ Una edición manual de la US en Jira **sí** se detecta, porque el CI re-deriva del
|
|
66
|
+
vivo — no depende de que alguien vuelva a correr una skill.
|
|
67
|
+
- ⚠️ La **normalización** es crítica: una sola implementación (`dai ac-hash`), y el CI
|
|
68
|
+
debe usar exactamente ese binario/lógica, nunca reimplementarlo. Es lo más testeado.
|
|
69
|
+
- ⚠️ Reordenar criterios **sí** cambia el hash — por eso el formato de US pide orden
|
|
70
|
+
estable. Es una obligación nueva para el PO.
|
|
71
|
+
- ⚠️ El CI necesita **leer la US viva** (API de Jira/ClickUp o el `.md`) para
|
|
72
|
+
re-derivar. Ese es el punto donde el link toca la distribución (ver METODOLOGIA §7).
|
|
73
|
+
|
|
74
|
+
## Alternativas consideradas
|
|
75
|
+
|
|
76
|
+
- **Calcular el hash en `grill-user-story` al publicar (una vez)** — descartado: la US
|
|
77
|
+
muta después, fuera de la skill; el hash estampado quedaría stale y la detección se
|
|
78
|
+
rompería en silencio. La skill puede *invocar* `dai ac-hash` como cortesía, pero no
|
|
79
|
+
es la autoridad.
|
|
80
|
+
- **Que la skill (LLM) compute el hash** — descartado: no determinista, daría distinto
|
|
81
|
+
al CI. Lo mecánico va al CLI (ADR-0002).
|
|
82
|
+
- **Hash del texto crudo (sin normalizar)** — descartado: cualquier typo dispararía un
|
|
83
|
+
falso atraso, y el ruido mataría la confianza en el ⚠️.
|
|
84
|
+
- **Solo `spec_version` manual, sin hash** — descartado: depende de que la persona se
|
|
85
|
+
acuerde de bumpear; el hash detecta aunque se olvide (el número comunica, el hash
|
|
86
|
+
detecta).
|