fix(qorpa): la jaula le borraba a claude la variable que lo saca de la pantalla alterna
Reporte del operador sobre shuma llimphi remoto: «claude esta abriendo plano» y
«cuando tengo un claude y vuelvo, salen igual solo poquito output, lo ultimo
escrito».
Medido en las tres sesiones vivas de esta caja: el proceso del CLI adentro de la
jaula tiene SIETE variables de entorno, y ninguna es del renderer. El PTY del
agente si las tiene (CLAUDE_CODE_DISABLE_ALTERNATE_SCREEN=1, COLORTERM,
SHUMA_SESSION): las pone shuma_config::agente::vars_del_renderer en cada spawn,
justamente para esto. Las borra el --clearenv del bwrap, que es correcto como
politica y aca no tenia por donde dejar pasar lo declarado.
Sin esa variable el CLI se va a pantalla alterna, y ahi el cliente no puede dos
cosas — las dos que se reportaron:
· el reconocimiento en vuelo del cromo de claude no se dispara ni una vez, y la
pestana queda en la grilla pelada: «me sale plano»;
· la cosecha del historial saltea el alt-screen a proposito (TuiSession::
ingerir, «if screen.alternate_screen() { return }»), asi que al volver solo
esta la pantalla viva: «solo poquito output».
O sea que el arreglo estaba puesto del lado del agente desde el 2026-09-04 y esta
frontera lo anulaba. Van cuatro variables por una lista explicita, como
posicional, porque despues del --clearenv el ambiente no cruza de otra forma.
Certificado con el mecanismo, no con el sintoma: la misma invocacion con `env`
adentro de claude-sergio-9 imprime las cuatro. Los claudes que ya estan abiertos
siguen planos — la variable se lee al arrancar.
⚠ Este fichero estaba modificado SIN COMMITEAR en /opt/takana desde el 25-sep (el
tope de 10 jaulas que se saco), y por eso el pull --ff-only de la cosecha no
puede avanzar ahi. Lo commiteado aca incluye las dos cosas.
Semantic delta
No definition changed: this change is text, documentation or data.
1 files · +31 −2
diff --git a/scripts/servidor/claude-caja.sh b/scripts/servidor/claude-caja.sh
index 7e1ebad2..bf9d722b 100755
--- a/scripts/servidor/claude-caja.sh
+++ b/scripts/servidor/claude-caja.sh
@@ -148,8 +148,35 @@ fi
_proy="${PROY:-$PWD}"
[ -d "$_proy" ] || _proy=/opt/takana
+# ── LO QUE SHUMA DECLARA Y LA JAULA BORRABA ─────────────────────────────────────────────────────
+# `bwrap` entra con `--clearenv` (ADR 0015: el ambiente también es una concesión), así que TODO lo
+# que el agente de shuma puso en el PTY se perdía en la frontera. Medido el 2026-09-28 sobre las
+# tres sesiones vivas: **7 variables adentro**, y ninguna de las del renderer.
+#
+# La que más cuesta es `CLAUDE_CODE_DISABLE_ALTERNATE_SCREEN`, que `shuma_config::agente::
+# vars_del_renderer` pone en CADA PTY del agente justamente para que no pase esto: sin ella el CLI
+# se va a **pantalla alterna**, y ahí el cliente no puede hacer dos cosas —las dos reportadas como
+# defecto el 28-sep—:
+# · el reconocimiento en vuelo del cromo de claude no se dispara ni una vez ⇒ «me sale plano»;
+# · la cosecha del historial **saltea el alt-screen a propósito** (`TuiSession::ingerir`,
+# `if screen.alternate_screen() { return }`) ⇒ al volver a la pestaña sólo está la pantalla
+# viva, «sólo poquito output, lo último escrito».
+# O sea: el arreglo estaba puesto del lado del agente desde el 2026-09-04 y esta línea lo anulaba.
+#
+# `COLORTERM` va por lo mismo (sin él el CLI degrada a 256 colores) y `SHUMA_SESSION` porque es lo
+# que le deja a un hook enlazar a ESTA sesión y no a otra.
+#
+# Viaja como UN posicional con tokens `K=V` separados por espacios, y se expande **sin comillas** a
+# propósito: `env` recibe un argumento por token. Ninguno de estos valores lleva espacios (un `1`,
+# `truecolor`, un ULID); el día que haga falta uno que sí, esto pide otra forma de pasarlo.
+_lleva=
+for _v in CLAUDE_CODE_DISABLE_ALTERNATE_SCREEN CLAUDE_CODE_DISABLE_FEEDBACK_SURVEY COLORTERM SHUMA_SESSION; do
+ eval "_val=\${$_v:-}"
+ [ -n "$_val" ] && _lleva="$_lleva $_v=$_val"
+done
+
exec takana qorpa run "$_inst" -- sh -c \
- 'hogar="$1"; proy="$2"; yo="$3"; shift 3
+ 'hogar="$1"; proy="$2"; yo="$3"; lleva="$4"; shift 4
cd "$proy" 2>/dev/null || { echo "claude: adentro de la jaula no existe \"$proy\" — ¿está concedido ese directorio en la instancia? (ver grants.dirs)" >&2; exit 1; }
# `/work/<usuario>/bin` trae el toolchain del CORPUS (make, python3, rustc, cargo, takana…):
# musl estáticos del store, que corren dentro de la imagen glibc. Lo arma jaula-herramientas.sh.
@@ -157,7 +184,9 @@ exec takana qorpa run "$_inst" -- sh -c \
# el agente de adentro): `takana build` invoca `go` y `zig` por nombre, y en la imagen de la jaula
# no están. Muere con `spawn go mod vendor: No such file or directory`, que no menciona el PATH.
# Viven en el lab, que ya está concedido.
+ # shellcheck disable=SC2086 # `$lleva` se parte en tokens K=V a propósito — ver arriba
exec env HOME="$hogar" TERM="${TERM:-xterm-256color}" \
PATH="/work/$yo/bin:/work/dev-fs/tools/go/bin:/work/dev-fs/tools/zig:$PATH" \
+ $lleva \
/work/claude-cli/2.1.240 "$@"' \
- _ "$_hogar" "$_proy" "$_yo" "$@"
+ _ "$_hogar" "$_proy" "$_yo" "$_lleva" "$@"