# 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]