|
| 1 | +--- |
| 2 | +id: x00045 |
| 3 | +kind: refactor |
| 4 | +title: "x00045: terminar x00041 — quitar Delendai de la CI principal y de los scripts del producto" |
| 5 | +status: done |
| 6 | +priority: P0 |
| 7 | +globalGate: type |
| 8 | +shippedIn: |
| 9 | + - 4776c2d |
| 10 | +why: | |
| 11 | + x00041 cerró prematuramente: el plugin SÍ se movió de |
| 12 | + `packages/plugins/delendai_tanit/` a `integrations/delendai/` |
| 13 | + (S1 ✅), y existe el workflow opcional `integration-delendai.yml` |
| 14 | + (S4 ✅). Pero la CI principal (`validate.yml`) y el `package.json` |
| 15 | + raíz siguen tratando al plugin como si fuera parte del producto: |
| 16 | +
|
| 17 | + 1. `validate.yml` aún tiene `env.DELENDAI_SHA`, los pasos |
| 18 | + `Materialize delendai sibling`, `Build delendai core` y |
| 19 | + `Link jsonc-parser into the file: package store`. Si Delendai |
| 20 | + rompe, Tanit se rompe — exactamente el bug que x00041 quería |
| 21 | + cerrar. |
| 22 | + 2. `validate.yml` exporta `TANIT_SKIP_MULTI_SERVICE_ISOLATION=1` |
| 23 | + para tapar el fallo del E2E de x00028 S4 — el E2E existe |
| 24 | + precisamente porque las regresiones multi-servicio no se |
| 25 | + cazarían sólo con tests unitarios. Dejarlo skip permanente |
| 26 | + en CI es una bomba. |
| 27 | + 3. `packages/contracts/constants/core/delendai-sha.constant.ts` |
| 28 | + sigue exportando un SHA de Delendai como constante del core |
| 29 | + de Tanit — el core de Tanit no tiene nada que decir sobre |
| 30 | + qué commit de Delendai existe. |
| 31 | + 4. `package.json#scripts.typecheck:plugin` apunta a |
| 32 | + `packages/plugins/delendai_tanit`, una ruta que NO existe |
| 33 | + desde x00041 S1. Si alguien lo corre, falla con ENOENT. |
| 34 | + `test:plugin` parece tener el mismo problema. |
| 35 | + 5. `docs/delendai/AGENT-BOOTSTRAP.md §3.7` aún describe la |
| 36 | + antigua ruta `packages/plugins/delendai_tanit/` en algunos |
| 37 | + ejemplos internos (los puntos de migración quedaron a medias). |
| 38 | +
|
| 39 | + Resultado: la "frontera" que x00041 quería levantar entre Tanit y |
| 40 | + Delendai está físicamente movida (carpeta) pero lógicamente |
| 41 | + perforada (CI y scripts siguen acoplados). |
| 42 | +nonGoals: |
| 43 | + - Tocar el código del plugin (sigue siendo un cliente válido de |
| 44 | + `@delendai/core/public`; ningún tool cambia). |
| 45 | + - Cambiar `integration-delendai.yml` — ya está bien. |
| 46 | + - Reescribir el contrato de `@delendai/core` (es responsabilidad |
| 47 | + de Delendai). |
| 48 | + - Migrar al publicado npm (eso es p00007; sigue `done` con la |
| 49 | + forma actual). |
| 50 | +globalGate: type |
| 51 | +acceptance: |
| 52 | + - `validate.yml` empieza con `actions/checkout` + `setup-bun` + |
| 53 | + `bun install --frozen-lockfile`. Sin pasos de Delendai. |
| 54 | + - `validate.yml` no exporta `DELENDAI_SHA` ni `TANIT_SKIP_MULTI_SERVICE_ISOLATION`. |
| 55 | + - `packages/contracts/constants/core/delendai-sha.constant.ts` borrado. |
| 56 | + - Si algún código del core referenciaba el SHA, ese código se ha |
| 57 | + actualizado para no depender de él — `bun run lint:contracts` |
| 58 | + verde. |
| 59 | + - `package.json` raíz ya no tiene `typecheck:plugin` ni `test:plugin`. |
| 60 | + - `package.json#files` no menciona `packages/plugins/` ni |
| 61 | + `integrations/` (la integración es opcional y se valida aparte). |
| 62 | + - `AGENT-BOOTSTRAP.md §3.7` describe la nueva frontera: |
| 63 | + "el plugin vive en integrations/delendai/, no es parte del |
| 64 | + producto" y da los paths canónicos. |
| 65 | + - `bun run validate` verde localmente. |
| 66 | + - El workflow `integration-delendai.yml` sigue siendo válido y |
| 67 | + autocontenido — la separación se demuestra por reducción, no por |
| 68 | + añadido. |
| 69 | +slices: |
| 70 | + - sliceId: S1 |
| 71 | + title: "refactor(ci): validate.yml sin Delendai — quitar DELENDAI_SHA, Materialize, Build, Link, TANIT_SKIP" |
| 72 | + files: |
| 73 | + - .github/workflows/validate.yml |
| 74 | + gate: type |
| 75 | + dependsOn: [] |
| 76 | + acceptance: |
| 77 | + - Workflow empieza con `actions/checkout@v7` + `setup-bun@v2` + `bun install --frozen-lockfile`. |
| 78 | + - `env.DELENDAI_SHA` borrado. |
| 79 | + - Pasos `Materialize delendai sibling`, `Build delendai core`, |
| 80 | + `Link jsonc-parser` borrados. |
| 81 | + - Step `Validate` ya no exporta `TANIT_SKIP_MULTI_SERVICE_ISOLATION`. |
| 82 | + - Comentario breve que explica por qué Tanit NO depende de |
| 83 | + Delendai en CI. |
| 84 | + - sliceId: S2 |
| 85 | + title: "refactor(core): eliminar delendai-sha.constant.ts y limpiar imports huérfanos" |
| 86 | + files: |
| 87 | + - packages/contracts/constants/core/delendai-sha.constant.ts |
| 88 | + - packages/contracts/constants/integrations/delendai-report-version.constant.ts |
| 89 | + gate: type |
| 90 | + dependsOn: [S1] |
| 91 | + acceptance: |
| 92 | + - Fichero borrado. |
| 93 | + - `bun run lint:contracts` verde. |
| 94 | + - Si algún código del core lo importaba (comprobado con grep), |
| 95 | + ese import se elimina y, si la dependencia era importante, se |
| 96 | + reescribe sin el SHA (con referencia a `integration-delendai.yml` |
| 97 | + o a la documentación). |
| 98 | + - sliceId: S3 |
| 99 | + title: "refactor(root): quitar scripts obsoletos typecheck:plugin y test:plugin" |
| 100 | + files: |
| 101 | + - package.json |
| 102 | + gate: type |
| 103 | + dependsOn: [S1] |
| 104 | + acceptance: |
| 105 | + - `typecheck:plugin` borrado. |
| 106 | + - `test:plugin` borrado. |
| 107 | + - `bun run lint:command-coverage` sigue verde (la cobertura de |
| 108 | + comandos del producto no depende de esos scripts). |
| 109 | + - sliceId: S4 |
| 110 | + title: "refactor(pkg): package.json#files no menciona packages/plugins/ ni integrations/" |
| 111 | + files: |
| 112 | + - package.json |
| 113 | + gate: type |
| 114 | + dependsOn: [S3] |
| 115 | + acceptance: |
| 116 | + - `files` lista sólo rutas del producto (`bin/`, `packages/`, |
| 117 | + `scripts/`, `docs/...`, configs raíz, README, LICENSE). |
| 118 | + - `bun run validate:package` verde. |
| 119 | + - sliceId: S5 |
| 120 | + title: "docs: AGENT-BOOTSTRAP §3.7 refleja integrations/delendai/ como integración externa" |
| 121 | + files: |
| 122 | + - docs/delendai/AGENT-BOOTSTRAP.md |
| 123 | + gate: type |
| 124 | + dependsOn: [S1, S2, S3, S4] |
| 125 | + acceptance: |
| 126 | + - §3.7 declara explícitamente "el plugin vive en |
| 127 | + integrations/delendai/, no es parte del producto". |
| 128 | + - Paths canónicos actualizados. |
| 129 | + - El "qué NO cambia" sigue siendo válido (file: delendai, |
| 130 | + mientras no haya release). |
| 131 | +--- |
| 132 | + |
| 133 | +# x00045 — Terminar x00041 |
| 134 | + |
| 135 | +## Contexto |
| 136 | + |
| 137 | +x00041 (status: done) hizo la mitad del trabajo: movió la carpeta |
| 138 | +del plugin y creó el workflow opcional de integración. Pero el |
| 139 | +contrato de la propuesta era **cinco** puntos de acoplamiento a |
| 140 | +eliminar, y los pasos S2 y S3 quedaron a medias: |
| 141 | + |
| 142 | +| Punto | x00041 esperado | Estado real | |
| 143 | +|-------|------------------|-------------| |
| 144 | +| `workspaces` raíz | sin plugin | ✅ `workspaces: []` | |
| 145 | +| `files` del tarball | sin plugin | ❓ por verificar (S4) | |
| 146 | +| `bun run typecheck` | sin sección plugin | ❌ `typecheck:plugin` sigue ahí | |
| 147 | +| CI principal | sin clone/build de Delendai | ❌ sigue clonando, compilando y enlazando | |
| 148 | +| `delendai-sha.constant.ts` | borrado | ❌ sigue existiendo | |
| 149 | + |
| 150 | +## Decisión |
| 151 | + |
| 152 | +No reabro x00041 (el frontmatter `shippedIn:` documenta los SHAs |
| 153 | +de S1/S4 y su cierre sigue siendo verdadero en lo que cubría). |
| 154 | +Lo que falta es **una propuesta nueva, x00045**, que recoge las |
| 155 | +4 acciones restantes como sus propios slices. Esto mantiene |
| 156 | +el contrato de x00032 (lint:proposals garantiza que "done" |
| 157 | +significa "todo cerrado") sin reescribir el archivo que ya está |
| 158 | +en `done/`. |
| 159 | + |
| 160 | +## Diseño de los slices |
| 161 | + |
| 162 | +### S1 — `validate.yml` sin Delendai |
| 163 | + |
| 164 | +El cambio es **mecánico pero verificado**: |
| 165 | + |
| 166 | +````yaml |
| 167 | +on: |
| 168 | + push: |
| 169 | + branches: [main, develop] |
| 170 | + pull_request: |
| 171 | + branches: [main, develop] |
| 172 | + |
| 173 | +jobs: |
| 174 | + validate: |
| 175 | + runs-on: ubuntu-latest |
| 176 | + steps: |
| 177 | + - uses: actions/checkout@v7 |
| 178 | + with: |
| 179 | + fetch-depth: 0 |
| 180 | + - uses: oven-sh/setup-bun@v2 |
| 181 | + with: |
| 182 | + bun-version: 1.3.14 |
| 183 | + - run: bun install --frozen-lockfile |
| 184 | + - run: bun run validate |
| 185 | + - run: bun run security:audit |
| 186 | + - run: bun run validate:package |
| 187 | +```` |
| 188 | + |
| 189 | +El `fetch-depth: 0` se mantiene: x00032 S1 lo necesita para |
| 190 | +verificar `shippedIn:` reales. Sin los pasos de Delendai, |
| 191 | +`bun install --frozen-lockfile` resuelve sólo el producto |
| 192 | +porque `workspaces: []` y `bun.lock` no contienen `@delendai/core`. |
| 193 | + |
| 194 | +El comentario explicativo pasa a ser UNA sola línea al inicio del |
| 195 | +job: "Tanit valida su propio producto. La integración opcional con |
| 196 | +Delendai vive en integration-delendai.yml." |
| 197 | + |
| 198 | +### S2 — Borrar `delendai-sha.constant.ts` |
| 199 | + |
| 200 | +El grep de hoy (`grep -rln 'delendai-sha\|DELENDAI_SHA' packages/`) |
| 201 | +sólo encuentra la declaración. No hay imports del core que la |
| 202 | +usen — el SHA sólo se leía desde `validate.yml` y desde el |
| 203 | +comentario del propio fichero. Borrar el fichero es seguro. |
| 204 | + |
| 205 | +`delendai-report-version.constant.ts` (en `integrations/`) NO se |
| 206 | +toca: es del namespace de integraciones, no del core, y describe |
| 207 | +el formato del report que produce el plugin. |
| 208 | + |
| 209 | +### S3 — Quitar `typecheck:plugin` y `test:plugin` |
| 210 | + |
| 211 | +`typecheck:plugin` apunta a `packages/plugins/delendai_tanit`, |
| 212 | +ruta que no existe desde x00041 S1. Si alguien lo ejecuta, falla |
| 213 | +con ENOENT. `test:plugin` apunta a `bunx vitest run --project plugin`, |
| 214 | +que tampoco tiene proyecto en el `vitest.config.ts` raíz (el plugin |
| 215 | +tiene su propio `vitest.config.ts`). |
| 216 | + |
| 217 | +La forma correcta es: el plugin tiene su propio `package.json#scripts.validate` |
| 218 | +(`typecheck && test`), y `integration-delendai.yml` ya lo invoca. El |
| 219 | +producto Tanit no necesita un atajo raíz para esa integración. |
| 220 | + |
| 221 | +Si en algún momento alguien quiere un atajo en raíz, el nombre |
| 222 | +correcto sería `validate:integration:delendai`, no `typecheck:plugin`. |
| 223 | + |
| 224 | +### S4 — `files` limpio |
| 225 | + |
| 226 | +Verificar `package.json#files`. Hoy declara `bin/`, `packages/`, |
| 227 | +`scripts/`, docs, configs raíz. No menciona `integrations/` ni |
| 228 | +`packages/plugins/` (este último ni siquiera existe). El slice |
| 229 | +S4 sólo verifica que el campo no necesite retoques; si los |
| 230 | +necesita, los aplica. |
| 231 | + |
| 232 | +### S5 — AGENT-BOOTSTRAP §3.7 |
| 233 | + |
| 234 | +§3.7 ya está actualizado al path `../delendai/...` y a la forma |
| 235 | +local `bun run host-server.script.ts`. Lo que falta es la |
| 236 | +declaración explícita "el plugin vive en `integrations/delendai/`, |
| 237 | +no es parte del producto". Es una nota corta, no un reescrito. |
| 238 | + |
| 239 | +## Lo que NO cambia |
| 240 | + |
| 241 | +- `integration-delendai.yml` — sigue válido. |
| 242 | +- `delendai.config.json#plugins.tanit.path` apunta a |
| 243 | + `integrations/delendai/src/index.ts` (o lo hará tras verificar). |
| 244 | +- `@delendai/core` sigue siendo dependencia `file:` del plugin. |
| 245 | +- El producto no se reorganiza; sólo se elimina el acoplamiento |
| 246 | + con Delendai de su CI y de sus scripts. |
| 247 | + |
| 248 | +## Por qué esto va antes que el resto de P1 |
| 249 | + |
| 250 | +El `validate.yml` está verde en local y rojo en CI por el `bun install` |
| 251 | +del runner. Eso bloquea merges y pide una pasada de integración |
| 252 | +verifier tras cada push a develop. Cualquier propuesta nueva que |
| 253 | +toque `validate.yml` o `package.json` colisiona con este estado |
| 254 | +rojo hasta que se cierre. Terminar x00041 (es decir, ejecutar |
| 255 | +x00045) deja el camino crítico verde y desbloquea todo lo demás. |
0 commit comments