diff --git a/docs/28-servidor-de-produccion.md b/docs/28-servidor-de-produccion.md index f1f024cc..c05ff491 100644 --- a/docs/28-servidor-de-produccion.md +++ b/docs/28-servidor-de-produccion.md @@ -3309,6 +3309,42 @@ ahí. - **`scripts/farm/.fleet` ausente NO es un defecto** —el propio informe lo retiró—: `flota-permanente` está versionado y `cosecha-cron` lo repone. +### 6.55 🔓 «Una sola sesión» es del KERNEL; «un solo Claude» era nuestro *(2026-09-18)* + +El usuario chocó con `Resource busy` al abrir un segundo agente y lo llamó por su nombre: *«no quiero +restricciones arbitrarias»*. Tiene razón en la queja y conviene separar qué es qué, porque las tres +cosas se sienten igual desde afuera y son muy distintas: + +**1. Lo que impone el kernel.** Dos overlays sobre el **mismo `upper`** los niega `overlayfs`, no +nosotros: la capa mutable se corrompería. `qorpa` reintenta seis veces y después explica la causa en +vez de dejar el error crudo de bwrap. **Eso no se toca.** + +**2. Lo que era empaquetado nuestro** — y sí se toca: *una instancia por persona*. De ahí salía «un +solo Claude». Instancias distintas tienen `upper` distintos y conviven sin problema. Medido: crear la +segunda cuesta **0 s y 16 K**, porque la imagen se comparte de sólo lectura. + +**3. Lo que era un accidente**, y se arregló al encontrarlo: + +| | estaba | ahora | +|---|---|---| +| `/var/lib/hammer/qorpa/instances` | `root:root 755` ⇒ una persona **no podía crear su propia instancia** | `root:sergio 2775` (setgid) | +| `~/.ssh` en la jaula | `ro` ⇒ `ssh` no escribe `known_hosts` | `rw` | +| `/store` en la jaula | `ro` ⇒ el agente lee y **no puede sellar** | `rw` | +| `claude` | abría `/opt/takana` siempre | abre `$PWD` | +| `/usr/bin/claude` | **copia** congelada del guion | enlace al del repo | + +⚠ **Y queda un defecto de verdad, que hoy bloquea el punto 2**: aprovisionar una instancia nueva +muere con `bwrap: Can't mkdir parents for /run/user/0: Permission denied`. La causa está medida: +**esta caja no tiene `/run/user`** —no hay logind— y `qorpa.rs:1542` arma la ruta del runtime dir +como `/run/user/` sin alternativa. `XDG_RUNTIME_DIR` no alcanza: lo honra otra rama del código +(`1244`/`1549`), no ésta. Es arreglo en el crate, no en un manifiesto. + +> **Lo que conviene no confundir.** La jaula restringe al **agente**, no a la persona: `sergio` tiene +> `sudo`, entra por ssh y manda en la caja entera. Y dentro de la jaula el alcance es **declarativo** +> (D7): lo que no está en `grants` no se ve, pero agregarlo es editar un fichero, no pedir permiso. +> Lo indefendible no es que haya límites — es que un límite **accidental** parezca de diseño, que es +> exactamente lo que pasó con los cinco de la tabla. + ### 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