«una sola sesión» es del kernel; «un solo Claude» era empaquetado nuestro

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) <noreply@anthropic.com>
This commit is contained in:
Sergio
2026-09-18 17:11:36 +00:00
co-authored by Claude Opus 5
parent d90dda284f
commit 2bbfd80d93
+36
View File
@@ -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/<uid>` 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