From 2bbfd80d9342bf7a530bfe0983e350959f7aa123 Mon Sep 17 00:00:00 2001 From: Sergio Date: Fri, 18 Sep 2026 17:11:36 +0000 Subject: [PATCH] =?UTF-8?q?=C2=ABuna=20sola=20sesi=C3=B3n=C2=BB=20es=20del?= =?UTF-8?q?=20kernel;=20=C2=ABun=20solo=20Claude=C2=BB=20era=20empaquetado?= =?UTF-8?q?=20nuestro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El usuario chocó con Resource busy al abrir un segundo agente y lo llamó por su nombre: «no quiero restricciones arbitrarias». Conviene separar las tres cosas, porque desde afuera se sienten igual. Del kernel: dos overlays sobre el mismo upper los niega overlayfs, no nosotros. Eso no se toca. Nuestro: una instancia por persona, de ahí «un solo Claude» — y instancias distintas conviven; crear la segunda cuesta 0 s y 16 K porque la imagen se comparte de sólo lectura. Accidentes, ya corregidos: el directorio de instancias era root-only (una persona no podía crear la suya), ~/.ssh iba ro, /store iba ro (el agente no podía sellar), claude abría /opt/takana siempre y /usr/bin/claude era una copia congelada. Y queda un defecto real que hoy bloquea la segunda instancia: aprovisionarla muere con «Can't mkdir parents for /run/user/0». Medido: esta caja no tiene /run/user —no hay logind— y qorpa arma esa ruta sin alternativa; XDG_RUNTIME_DIR no alcanza porque lo honra otra rama. Es arreglo en el crate. La distinción que importa: la jaula restringe al agente, no a la persona —sergio tiene sudo y manda en la caja—, y dentro de la jaula el alcance es declarativo. Lo indefendible no es que haya límites: es que un límite accidental parezca de diseño. Co-Authored-By: Claude Opus 5 (1M context) --- docs/28-servidor-de-produccion.md | 36 +++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) 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