@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.
Files changed (81) hide show
  1. package/.env.example +30 -0
  2. package/CHANGELOG.md +46 -0
  3. package/CODE_OF_CONDUCT.md +37 -0
  4. package/CONTRIBUTING.md +66 -0
  5. package/LICENSE +674 -0
  6. package/README.md +288 -0
  7. package/SECURITY.md +37 -0
  8. package/VERSION +1 -0
  9. package/cli/dai.mjs +692 -0
  10. package/cli/lib/ac-hash.mjs +74 -0
  11. package/cli/lib/args.mjs +23 -0
  12. package/cli/lib/bootstrap.mjs +74 -0
  13. package/cli/lib/env.mjs +23 -0
  14. package/cli/lib/forge-api.mjs +96 -0
  15. package/cli/lib/forge-url.mjs +61 -0
  16. package/cli/lib/fsutil.mjs +24 -0
  17. package/cli/lib/implements.mjs +94 -0
  18. package/cli/lib/link-us.mjs +59 -0
  19. package/cli/lib/pm-adapter.mjs +59 -0
  20. package/cli/lib/pm-clickup.mjs +54 -0
  21. package/cli/lib/pm-jira.mjs +123 -0
  22. package/cli/lib/pr.mjs +53 -0
  23. package/cli/lib/us.mjs +36 -0
  24. package/docs/EJEMPLO-END-TO-END.md +330 -0
  25. package/docs/MANIFIESTO.md +114 -0
  26. package/docs/METODOLOGIA.md +254 -0
  27. package/docs/PROBAR.md +91 -0
  28. package/docs/SCRUM-CON-IA.md +190 -0
  29. package/docs/adr/0001-contrato-ac-hash.md +86 -0
  30. package/docs/adr/0002-agnostico-del-asistente.md +87 -0
  31. package/docs/adr/0003-deteccion-y-estampado-son-comandos.md +73 -0
  32. package/docs/adr/0004-ubicacion-y-schema-implements.md +94 -0
  33. package/docs/adr/0005-superficie-comandos-y-stamp.md +65 -0
  34. package/docs/adr/0006-distribucion-y-licencia.md +59 -0
  35. package/docs/adr/0007-modelo-de-autenticacion.md +63 -0
  36. package/docs/adr/README.md +19 -0
  37. package/docs/detalle/01-refinamiento.md +33 -0
  38. package/docs/detalle/02-planning.md +27 -0
  39. package/docs/detalle/03-ramas.md +32 -0
  40. package/docs/detalle/04-tdd.md +35 -0
  41. package/docs/detalle/05-smoke.md +32 -0
  42. package/docs/detalle/06-code-review.md +34 -0
  43. package/docs/detalle/07-merge-trazabilidad.md +33 -0
  44. package/docs/detalle/08-daily.md +29 -0
  45. package/docs/detalle/09-review.md +25 -0
  46. package/docs/detalle/10-retro.md +27 -0
  47. package/docs/detalle/README.md +20 -0
  48. package/docs/glosario.md +79 -0
  49. package/docs/guias/dev.md +66 -0
  50. package/docs/guias/lead.md +53 -0
  51. package/docs/guias/po.md +50 -0
  52. package/governance/branch-naming.md +36 -0
  53. package/governance/ci-rules.md +57 -0
  54. package/governance/commit-convention.md +76 -0
  55. package/index.html +479 -0
  56. package/install.sh +19 -0
  57. package/manifest.yaml +76 -0
  58. package/package.json +55 -0
  59. package/skills/dai-review/SKILL.md +78 -0
  60. package/skills/doc-to-backlog/SKILL.md +70 -0
  61. package/skills/doc-to-backlog/templates/backlog-candidato.md +49 -0
  62. package/skills/grill-epic/SKILL.md +76 -0
  63. package/skills/grill-intent/SKILL.md +43 -0
  64. package/skills/grill-intent/templates/intent.md +36 -0
  65. package/skills/grill-user-story/SKILL.md +76 -0
  66. package/skills/grill-user-story/templates/user-story.md +61 -0
  67. package/skills/link-us/SKILL.md +42 -0
  68. package/skills/link-us/templates/implements.yaml +16 -0
  69. package/skills/tdd/SKILL.md +109 -0
  70. package/skills/tdd/deep-modules.md +33 -0
  71. package/skills/tdd/interface-design.md +31 -0
  72. package/skills/tdd/mocking.md +59 -0
  73. package/skills/tdd/refactoring.md +10 -0
  74. package/skills/tdd/tests.md +61 -0
  75. package/templates/adr.md +43 -0
  76. package/templates/commit-msg +48 -0
  77. package/templates/definition-of-done.md +50 -0
  78. package/templates/definition-of-ready.md +51 -0
  79. package/templates/epica.md +62 -0
  80. package/templates/formato-us.md +129 -0
  81. 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).