From 644be2645ba6a5b92842d97ed8ba869fdbe9aee8 Mon Sep 17 00:00:00 2001 From: Sergio Date: Thu, 17 Sep 2026 14:56:38 +0000 Subject: [PATCH] =?UTF-8?q?el=20latido=20NO=20se=20puede=20mudar=20todav?= =?UTF-8?q?=C3=ADa:=20un=20hub=20no=20es=20el=20que=20tiene=20el=20repo,?= =?UTF-8?q?=20es=20el=20que=20tiene=20el=20LAB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Se intentó el último intercambio —cron de cosecha de gioser a la caja— y salió mal en el primer ciclo. Vuelta atrás hecha en minutos; queda escrito porque el motivo no era ninguno de los previstos. Funcionó todo lo mecánico: la caja sembró 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ó. Lo que publicó es el problema: caja : {recipes: 1112, nodes: 1115, unhashable: 1112, ajeno: 3} gioser: {recipes: 1112, nodes: 1115, sealed: 1105, never: 5, debt: 2} `unhashable: 1112` no es «sin sellar»: es que NO SE PUDO CALCULAR el hash de ninguna receta, porque EL LAB ENTRA EN EL ArtifactHash y una caja de producción no lo tiene — a propósito. El commit 45b5685a dejó en main un build-state que dice que el corpus entero no existe. ⇒ 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. Un hub es la máquina que tiene el LAB: el tercer paso del latido no es copiar, es PENSAR sobre el corpus. Tres salidas, y ninguna es «poner el cron»: darle el lab a la caja · partir el latido (siembra/cosecha allá, grafo donde haya lab) · que el hub sea otra máquina (el LXC ya tiene lab y muele 24/7). Es decisión del usuario, y es lo único que queda entre esto y borrar gioser. El latido de gioser, reactivado, repara el daño solo en su siguiente ciclo. Y el ciclo destapó tres cosas en la caja: `poda-fuentes.sh` NO corre en takana (usa sustitución de procesos, que busybox ash no tiene — cuarto tropiezo del día con la misma forma); los vigías reportaron 1 ofensor nuevo de raíces (bzip2), 3 herramientas selladas no invocables y 7 errores en servicios.txt; y `arjectl status | head -2` hace paniquear a arjectl con un EPIPE sin manejar. Co-Authored-By: Claude Opus 5 (1M context) --- docs/28-servidor-de-produccion.md | 62 +++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) 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: