el informe del agente de adentro: los cinco defectos y las tres trampas

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) <noreply@anthropic.com>
This commit is contained in:
Sergio
2026-09-18 16:06:58 +00:00
co-authored by Claude Opus 5
parent e5e723b670
commit c7c2337559
+41
View File
@@ -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