diff --git a/docs/28-servidor-de-produccion.md b/docs/28-servidor-de-produccion.md index 14a7b8a5..33cb855f 100644 --- a/docs/28-servidor-de-produccion.md +++ b/docs/28-servidor-de-produccion.md @@ -2481,6 +2481,68 @@ Está escrito en `work/mudanza/volver-atras-tejido.txt`: apagar los dos de la ca de gioser con las líneas exactas que se leyeron de `/proc//environ` y `cmdline`. **Nunca las dos a la vez**: es la misma identidad. +### 6.42 ❌ El latido NO se puede mudar todavía — y el motivo redefine qué es un «hub» *(2026-09-17)* + +Se intentó el último intercambio: apagar el cron de la cosecha en gioser y encenderlo en la caja. +**Salió mal, se vio en el primer ciclo, y se volvió atrás en minutos.** Queda escrito porque el +motivo no era ninguno de los que se habían previsto. + +#### Lo que sí funcionó + +La caja tiene todo lo del latido y el ciclo corrió de punta a punta: sembró el repo al worker, leyó +su manifiesto, regeneró los ocho ficheros de estado, pasó los vigías, **se puso al día por +fast-forward y commiteó+empujó**. El `git config` de identidad y el `pull --ff-only` nuevo hicieron +su parte. + +#### 🕳️ Lo que publicó, que es el problema + +``` + totals que publicó la CAJA : {recipes: 1112, nodes: 1115, unhashable: 1112, ajeno: 3} + totals de gioser : {recipes: 1112, nodes: 1115, sealed: 1105, never: 5, debt: 2} +``` + +**`unhashable: 1112`** — no es «no está sellado»: es que **no se pudo CALCULAR el hash de ninguna +receta**. Y la causa es la misma que el §5.2 documenta desde el otro lado: **el lab entra en el +ArtifactHash**, así que una máquina sin el rootfs del lab no puede hashear nada. La caja de +producción no lo tiene — a propósito, no es un olvido. + +El daño era real y silencioso: el commit `45b5685a` dejó en `main` un `build-state*.json` que dice +que **el corpus entero no existe**. Cualquiera que lo lea —o cualquier vigía que lo compare— vería +1112 recetas en cero. + +#### La lección, que vale más que el intento + +**Un hub no es «la máquina que tiene el repo y la llave»: es la que tiene el LAB.** El latido parece +tarea de cron —siembra, cosecha, commitea— pero su tercer paso es *pensar sobre el corpus*, y eso +exige el toolchain. Por eso la puerta 4 **no** era una línea de crontab, aunque todas las piezas que +se miraron (git, python3, rsync, ssh, takana, flock, `.fleet`, la llave) estuvieran. + +⇒ Las salidas son tres, y ninguna es «poner el cron»: +1. **darle el lab a la caja** (`/.dev-fs/…`) — deja de ser sólo servidor y pasa a ser también hub; +2. **partir el latido**: siembra+cosecha en la caja, regeneración del grafo donde haya lab; +3. **que el hub sea otra máquina** (el LXC prestado ya tiene lab y muele 24/7). + +Es decisión del usuario, y es **lo único que queda entre esto y borrar gioser**. + +#### Vuelta atrás, en minutos + +Cron de la caja borrado, cron de gioser reactivado (estaba comentado, no borrado). El propio latido +de gioser **repara el daño solo** en su siguiente ciclo: regenera el grafo desde SU store —que sí +tiene el lab— y vuelve a publicar los números buenos. + +#### 🧰 Y de paso, tres cosas que el ciclo destapó en la caja + +- **`poda-fuentes.sh` no corre en takana**: `/dev/fd/63: No such file or directory` y + `viejos: unbound variable`. Es **sustitución de procesos** (`<(...)`), que busybox `ash` no tiene — + el cuarto tropiezo del día con la misma forma. El podador de `work/sources` es justo lo que un hub + necesita para no llenarse. +- Los vigías corrieron y hablaron: **1 ofensor nuevo de raíces (`bzip2`)**, **3 herramientas + selladas que no se pueden invocar**, y `servicios.txt` con 7 errores y 30 avisos. Son hallazgos del + corpus, no de la mudanza, y quedan anotados donde el humano los mira. +- `arjectl status | head -2` **hace paniquear a arjectl** (`failed printing to stdout: Broken pipe`). + No rompe nada, pero un `EPIPE` sin manejar en una herramienta de operación aparece justo cuando + alguien la encadena. + ## 7. Reusar los scripts que ya existen, y no escribir de nuevo Pedido explícito del usuario. El inventario de lo que ya hace el trabajo: