$ claude -p "Decí exactamente: CLAUDE CORRIENDO EN LA CAJA" CLAUDE CORRIENDO EN LA CAJA Turno real —API, credenciales, respuesta— desde 2.29.29.217. El CLI es un ELF glibc de 360 M y la caja es musl, así que va enjaulado (ADR 0015, el caso de sergioh-api). La instancia declara red, nesting y SEIS directorios: /opt/takana, /work/dev-fs, /store, /root/.claude, /root/.ssh (ro) y el CLI (ro). Es ANCHA y está dicho: un agente que construye, commitea y empuja necesita lo mismo que un humano; lo que la jaula compra es que el alcance esté escrito y acotado. ⚠ El `takana` que construye NO se instala adentro: sale del store, que ya está concedido — es estático musl y corre igual dentro de una imagen glibc. LA CAJA CONSTRUYE: sellados hoy `intel-ucode` (156 signatures) y `sof-firmware` (2 firmware + 8 topologías). Faltaba una pieza que el lab no traía: `.dev-fs/tools` (zig 0.13/0.16 y go, 1 G) — la imagen del lab empaqueta `alpine/` y nada más, y el primer intento murió con «zig no encontrado». 🧱 Y lo que NO anda, con su rodeo: `takana build` dentro de la jaula muere con «bwrap: Can't mount proc on /proc» aunque `nesting = true`. No es el anidamiento —un `bwrap --proc /proc` a mano SÍ funciona adentro— sino el userns anidado del sandbox del build; probado también con `root = false`, que es la sospecha que el propio código documenta, y falla igual. El rodeo que sí anda, escrito en el lanzador: pedirle el build al ANFITRIÓN por ssh a 127.0.0.1:22022. Así se selló sof-firmware desde dentro de la jaula. Manifiesto y lanzador versionados en scripts/servidor/: una instancia que sólo existe en la caja se pierde con la caja. ⚠ Pendiente menor: la memoria del agente está en `-mnt-vvv-takana` y allá el repo vive en /opt/takana ⇒ el índice POR RUTA no coincide y arranca sin memoria del proyecto aunque los 733 ficheros estén en disco. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
73 lines
3.1 KiB
TOML
73 lines
3.1 KiB
TOML
# Manifiesto de la instancia — ESTO es la verdad, `upper/` es caché descartable (ADR 0015 D3).
|
|
#
|
|
# ── POR QUÉ EXISTE ESTA JAULA (2026-09-17) ──────────────────────────────────────────────────────
|
|
# Pedido del usuario: «no borramos gioser hasta tenerte corriendo de aquel lado, con capacidad de
|
|
# compilar tawasuyu y las recetas de takana». El CLI de Claude Code es un **ELF glibc de 360 M**
|
|
# (`interpreter /lib64/ld-linux-x86-64.so.2`, NEEDED libc.so.6) y esta caja es musl: no hay camino
|
|
# nativo. Es el caso del ADR 0015, igual que `sergioh-api`.
|
|
base = "sha256:895661bdf6c64e91b7725874165fd05dd30c438d3ffec661671ab5cfb261ca58"
|
|
distro = "arch"
|
|
|
|
# Lo que hace falta ADENTRO para trabajar el repo: git para commitear y empujar, openssh para
|
|
# llegar al gitea y al worker, y las CA para TLS. El CLI trae su propio node y su propio ripgrep.
|
|
# `bubblewrap`: `takana build` levanta SU PROPIO sandbox adentro. Sin esto la jaula lee recetas y no
|
|
# construye ninguna, que es la mitad del pedido. El `takana` que las construye NO se instala acá:
|
|
# sale del STORE, que ya está concedido — es estático musl y corre igual dentro de una imagen
|
|
# glibc (comprobado: `takana 0.0.1` desde /store dentro de la jaula).
|
|
packages = ["git", "openssh", "ca-certificates", "bubblewrap"]
|
|
|
|
[grants]
|
|
# ⚠ ESTA JAULA ES ANCHA A PROPÓSITO, Y CONVIENE DECIRLO EN VEZ DE DISIMULARLO. Un agente que
|
|
# construye recetas, commitea y empuja necesita exactamente lo que un humano haciendo ese trabajo:
|
|
# el repo, el store, el lab y las llaves. Lo que la jaula sigue comprando es que ese alcance esté
|
|
# ESCRITO y acotado a estos directorios — no que sea pequeño.
|
|
network = true
|
|
# `nesting`: `takana build` levanta su sandbox con bwrap ADENTRO. Sin esto, la jaula puede leer las
|
|
# recetas y no puede construir ninguna, que es justo la mitad del pedido.
|
|
nesting = true
|
|
root = true
|
|
wayland_raw = false
|
|
seal_image = false
|
|
|
|
# El repo: es el trabajo.
|
|
[[grants.dirs]]
|
|
host = "/opt/takana"
|
|
inside = "/opt/takana"
|
|
mode = "rw"
|
|
|
|
# El lab y el toolchain (zig, go). `.dev-fs` del repo es un symlink acá, así que se concede el
|
|
# destino real o el build no encuentra nada.
|
|
[[grants.dirs]]
|
|
host = "/work/dev-fs"
|
|
inside = "/work/dev-fs"
|
|
mode = "rw"
|
|
|
|
# El store: sin esto no hay cache-hit, ni sellado, ni hash comparable.
|
|
[[grants.dirs]]
|
|
host = "/store"
|
|
inside = "/store"
|
|
mode = "rw"
|
|
|
|
# La memoria del agente y sus credenciales. 733 ficheros de memoria y un `.credentials.json` de
|
|
# 509 B: sin lo primero el agente arranca sin saber nada del proyecto; sin lo segundo, no arranca.
|
|
[[grants.dirs]]
|
|
host = "/root/.claude"
|
|
inside = "/root/.claude"
|
|
mode = "rw"
|
|
|
|
# Las llaves: el gitea (push), el worker de la granja y el Storage Box. Sólo lectura.
|
|
[[grants.dirs]]
|
|
host = "/root/.ssh"
|
|
inside = "/root/.ssh"
|
|
mode = "ro"
|
|
|
|
# El propio CLI, que vive fuera de la imagen a propósito: la imagen es ajena y pineada, y el CLI se
|
|
# actualiza solo. Mezclarlos haría que `recreate` borrara el binario o que la imagen dejara de ser
|
|
# la que dice ser.
|
|
[[grants.dirs]]
|
|
host = "/work/claude-cli"
|
|
inside = "/work/claude-cli"
|
|
mode = "ro"
|
|
|
|
[export]
|