gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 815Rust 56Shell 37Markdown 291229 Sutichaykuna

⎇ f48a7e8aa03a2a6eacdff402e8abd32d61e25cd9 scripts/servidor/qorpa-claude.instance.toml TOML · 83 siq'ikuna · 3.9 KB Ñawpa willay ch'uya

feat(qorpa): concesion host_pids — sin ella el «restaurar» de shuma devolvia un shell mudo f48a7e8aa · Sergio ·

1# Manifiesto de la instancia — ESTO es la verdad, `upper/` es caché descartable (ADR 0015 D3).
2#
3# ── POR QUÉ EXISTE ESTA JAULA (2026-09-17) ──────────────────────────────────────────────────────
4# Pedido del usuario: «no borramos gioser hasta tenerte corriendo de aquel lado, con capacidad de
5# compilar tawasuyu y las recetas de takana». El CLI de Claude Code es un **ELF glibc de 360 M**
6# (`interpreter /lib64/ld-linux-x86-64.so.2`, NEEDED libc.so.6) y esta caja es musl: no hay camino
7# nativo. Es el caso del ADR 0015, igual que `sergioh-api`.
8base = "sha256:895661bdf6c64e91b7725874165fd05dd30c438d3ffec661671ab5cfb261ca58"
9distro = "arch"
10
11# Lo que hace falta ADENTRO para trabajar el repo: git para commitear y empujar, openssh para
12# llegar al gitea y al worker, y las CA para TLS. El CLI trae su propio node y su propio ripgrep.
13# `bubblewrap`: `takana build` levanta SU PROPIO sandbox adentro. Sin esto la jaula lee recetas y no
14# construye ninguna, que es la mitad del pedido. El `takana` que las construye NO se instala acá:
15# sale del STORE, que ya está concedido — es estático musl y corre igual dentro de una imagen
16# glibc (comprobado: `takana 0.0.1` desde /store dentro de la jaula).
17packages = ["git", "openssh", "ca-certificates", "bubblewrap"]
18
19[grants]
20# ⚠ ESTA JAULA ES ANCHA A PROPÓSITO, Y CONVIENE DECIRLO EN VEZ DE DISIMULARLO. Un agente que
21# construye recetas, commitea y empuja necesita exactamente lo que un humano haciendo ese trabajo:
22# el repo, el store, el lab y las llaves. Lo que la jaula sigue comprando es que ese alcance esté
23# ESCRITO y acotado a estos directorios — no que sea pequeño.
24network = true
25# `nesting`: `takana build` levanta su sandbox con bwrap ADENTRO. Sin esto, la jaula puede leer las
26# recetas y no puede construir ninguna, que es justo la mitad del pedido.
27nesting = true
28# `host_pids`: comparte el árbol de procesos del host en vez de armar uno propio.
29#
30# Hace falta para que «el restaurar» de shuma devuelva la CONVERSACIÓN y no un shell pelado.
31# Claude Code deja un registro vivo en `~/.claude/sessions/<pid>.json` y shuma lo cruza contra
32# /proc para reabrir la charla con `--resume <uuid>`. Con namespace propio ese pid es el de
33# adentro —**2**, en todas las jaulas a la vez— así que el daemon no puede cruzarlo, y como el
34# $HOME está compartido todas las jaulas escriben el MISMO `2.json` y se pisan (medido el
35# 2026-09-25: los tres registros eran de una sola jaula, ninguno de la sesión viva).
36#
37# ⚠ Es una concesión real: un `ps` de adentro ve los procesos del host. No abre nada más.
38host_pids = true
39root = true
40wayland_raw = false
41seal_image = false
42
43# El repo: es el trabajo.
44[[grants.dirs]]
45host = "/opt/takana"
46inside = "/opt/takana"
47mode = "rw"
48
49# El lab y el toolchain (zig, go). `.dev-fs` del repo es un symlink acá, así que se concede el
50# destino real o el build no encuentra nada.
51[[grants.dirs]]
52host = "/work/dev-fs"
53inside = "/work/dev-fs"
54mode = "rw"
55
56# El store: sin esto no hay cache-hit, ni sellado, ni hash comparable.
57[[grants.dirs]]
58host = "/store"
59inside = "/store"
60mode = "rw"
61
62# La memoria del agente y sus credenciales. 733 ficheros de memoria y un `.credentials.json` de
63# 509 B: sin lo primero el agente arranca sin saber nada del proyecto; sin lo segundo, no arranca.
64[[grants.dirs]]
65host = "/root/.claude"
66inside = "/root/.claude"
67mode = "rw"
68
69# Las llaves: el gitea (push), el worker de la granja y el Storage Box. Sólo lectura.
70[[grants.dirs]]
71host = "/root/.ssh"
72inside = "/root/.ssh"
73mode = "ro"
74
75# El propio CLI, que vive fuera de la imagen a propósito: la imagen es ajena y pineada, y el CLI se
76# actualiza solo. Mezclarlos haría que `recreate` borrara el binario o que la imagen dejara de ser
77# la que dice ser.
78[[grants.dirs]]
79host = "/work/claude-cli"
80inside = "/work/claude-cli"
81mode = "ro"
82
83[export]