From c7c233755906f41d36c319886430edc8459185ee Mon Sep 17 00:00:00 2001 From: Sergio Date: Fri, 18 Sep 2026 16:06:58 +0000 Subject: [PATCH] el informe del agente de adentro: los cinco defectos y las tres trampas MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Primer informe hecho DESDE la jaula, y vale más que cualquier inspección desde el anfitrión porque son las cosas con las que se choca al usarla. Queda registrado qué se arregló y —lo importante— DÓNDE vive cada arreglo: 1 y 2 en el upper, que es caché descartable, y por eso hay un guion que los repone tras cada recreate; 3 y 5 en el manifiesto; 4 en el worker. Del 4: se autorizó la clave de la caja, no la de root — credencial distinta y revocable. Del 5: takana NO se compila adentro; el binario es el musl del store, y lo que fallaba es que el target/release del anfitrión enlaza a /usr/bin/takana, que adentro es el de Arch. Y las tres trampas de orientación que el agente reportó: el store real es /store y los runbooks dicen ./store porque están escritos para el hub; hay dos checkouts y no son intercambiables; y el .fleet ausente no es defecto, lo repone la cosecha. Co-Authored-By: Claude Opus 5 (1M context) --- docs/28-servidor-de-produccion.md | 41 +++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/docs/28-servidor-de-produccion.md b/docs/28-servidor-de-produccion.md index 30e0a053..f1f024cc 100644 --- a/docs/28-servidor-de-produccion.md +++ b/docs/28-servidor-de-produccion.md @@ -3268,6 +3268,47 @@ y `groups` apuntan a `../../bin/busybox`— y se comprobó con `id` de root, de > que abre al agente. Es la misma familia que el `/etc/shadow` del §6.51: **la caja no avisa cuando > le falta algo esencial — se entera el que lo usa**. +### 6.54 🧭 Trabajar DESDE la jaula: lo que el agente de adentro reportó *(2026-09-18)* + +El agente enjaulado pasó un informe de defectos —el primero hecho **desde adentro**— y vale más que +cualquier inspección desde el anfitrión, porque son las cosas con las que se choca al usarla. + +#### Lo que se arregló, y dónde vive cada arreglo + +| # | defecto | dónde queda el arreglo | +|---|---|---| +| 1 | sin entrada en `/etc/passwd` para el uid de adentro ⇒ `ssh`/`git` mueren con *No user exists for uid 1001* | `jaula-preparar.sh` (upper) | +| 2 | `/etc/ssh/ssh_config.d` es de la capa inferior, dueño fuera del mapa ⇒ `ssh` **aborta**, no degrada | `jaula-preparar.sh` (upper) | +| 3 | `~/.ssh` en `ro` ⇒ `ssh` no puede escribir `known_hosts` | **manifiesto**: pasa a `rw` + semilla desde el anfitrión | +| 4 | sin clave para el worker ⇒ `Permission denied (publickey)`, cero granja | clave **propia** de la caja autorizada en el worker | +| 5 | sin `rsync`/`python`/`jq`/`b3sum`, y sin `takana` ejecutable | **manifiesto**: `packages`; y un `takana` que sale del store | + +El **1 y el 2 viven en el `upper`**, que por el D3 es caché descartable: al primer `recreate` se +pierden. Por eso existe `scripts/servidor/jaula-preparar.sh`, que los repone —escribiendo como la +persona, no como root, para no dejarle ficheros que después no puede tocar—. + +Sobre el **4**: se autorizó en el worker la clave **de la caja** (`sergio@caja`), no la de root. Es +una credencial distinta y revocable: quitarla del `authorized_keys` del worker corta ese acceso sin +tocar ningún otro. Comprobado: `ssh root@dev.gioser.net hostname` desde la caja contesta `PruebasIA`. + +Sobre el **5**: `takana` **no se compila adentro**. El binario es el musl estático del store y corre +igual dentro de una imagen glibc; lo que fallaba es que +`/opt/takana/target/release/takana` del anfitrión es un enlace a `/usr/bin/takana`, y **adentro +`/usr/bin` es el de Arch**. Queda `/work/sergio/bin/takana`, que elige el más reciente del store —no +un hash cableado, para que sobreviva a un re-sellado— y el `target/release/takana` del clon apunta +ahí. + +#### Las tres trampas de orientación, que no son defectos pero cuestan una hora + +- **El store real es `/store`**, 61 G y 1333 artefactos. Los runbooks y el `CLAUDE.md` dicen + `takana build --store ./store` porque están escritos para el HUB; copiado literal en la caja, eso + apunta a un store vacío dentro del clon. Desde la caja va `--store /store`. +- **Hay dos checkouts y no son intercambiables**: `/work/sergio/takana` es el de trabajo —suyo, con + push propio—, y `/opt/takana` es el del sistema: el que usan el cron, la granja y los servicios. + Editar el segundo por costumbre es pisarle el árbol al latido. +- **`scripts/farm/.fleet` ausente NO es un defecto** —el propio informe lo retiró—: `flota-permanente` + está versionado y `cosecha-cron` lo repone. + ### 6.51 🔥 Me dejé afuera de la caja — 20 minutos caída, y tres causas encadenadas *(2026-09-17)* Crear una cuenta de usuario tiró el servidor de producción. Queda escrito entero porque **ninguna de