> 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…
fix(distro): kitty no falta por falta de receta — falta porque no publicamos OpenGL
Medido bajando kitty v0.49.2 (`b2cb8712`) y leyendo su build, no suponiendo:
setup.py:804 gl_libs = … pkg_config('gl', '--libs')
data-types.h:25 #define OPENGL_REQUIRED_VERSION_MAJOR 3
gl.c:68 aborta: «OpenGL version is X.Y, version >= 3.3 required for kitty»
Y en el store, medido: **nadie publica `gl.pc` ni `libGL.so`.** `mesa` da `egl.pc`, `glesv2.pc`,
`gbm.pc` y `dri.pc`; `libglvnd` da `opengl.pc` con `libOpenGL.so`/`libGLdispatch.so` — y sólo viaja
en `escritorio-kde`. O sea que kitty **no compila** (falla el pkg-config) y, aunque se le forzara,
**abortaría al arrancar**: el chequeo de versión está en runtime. Es el mismo muro que paró a OBS.
⇒ El censo gana una dimensión, porque contar las dos cosas juntas era mentir por omisión: **«falta
la receta» y «la distro no publica eso» tienen presupuestos distintos.** `MUROS` registra sólo los
medidos, con el dato que los prueba; lo demás se queda sin anotar, que es más honesto que adivinar.
Hoy hay uno y es kitty.
Lo que esto cambia para el plan: los otros cuatro terminales de la lista hay que MEDIRLOS antes de
presupuestarlos, no agruparlos con kitty. `alacritty` y `wezterm` pueden tener camino GLES/wgpu;
`xterm` no usa GL pero arrastra X11, que la distro descartó entera (Wayland-only). Ninguna de esas
tres cosas la sé todavía, y por eso no están en `MUROS`.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
diff --git a/docs/state/distro-huecos.json b/docs/state/distro-huecos.json
index cba5692e..39470cd3 100644
--- a/docs/state/distro-huecos.json
+++ b/docs/state/distro-huecos.json
@@ -119,6 +119,8 @@
"items": [
{
"estado": "falta",
+ "muro": "sin-opengl-de-escritorio",
+ "muro_porque": "setup.py:804 hace pkg_config('gl', '--libs') y data-types.h:25 exige OpenGL >= 3.x core. Medido en el store: NADIE publica `gl.pc` ni `libGL.so` — mesa da egl.pc, glesv2.pc, gbm.pc y dri.pc; libglvnd da opengl.pc con libOpenGL.so/libGLdispatch.so y sólo viaja en escritorio-kde. Compilar no basta: gl.c:68 aborta en runtime con «OpenGL version is X.Y, version >= 3.3 required for kitty». Mismo muro que OBS.",
"nombre": "kitty",
"parientes": []
},
diff --git a/scripts/censo-distro.py b/scripts/censo-distro.py
index 13dcd067..35be0906 100755
--- a/scripts/censo-distro.py
+++ b/scripts/censo-distro.py
@@ -156,6 +156,20 @@ CHECKLIST = {
}
+# ── POR QUÉ ESTÁ CADA HUECO: receta ausente ≠ capacidad ausente ─────────────────────────────────
+# «Falta la receta» y «la distro no publica eso» son dos cosas con presupuestos distintos, y el
+# censo mentía por omisión al contarlas juntas. Sólo entran acá los muros MEDIDOS, con el dato que
+# los prueba; lo demás se queda sin anotar, que es más honesto que adivinar.
+MUROS = {
+ 'kitty': ('sin-opengl-de-escritorio',
+ "setup.py:804 hace pkg_config('gl', '--libs') y data-types.h:25 exige OpenGL >= 3.x "
+ "core. Medido en el store: NADIE publica `gl.pc` ni `libGL.so` — mesa da egl.pc, "
+ "glesv2.pc, gbm.pc y dri.pc; libglvnd da opengl.pc con libOpenGL.so/libGLdispatch.so "
+ "y sólo viaja en escritorio-kde. Compilar no basta: gl.c:68 aborta en runtime con "
+ "«OpenGL version is X.Y, version >= 3.3 required for kitty». Mismo muro que OBS."),
+}
+
+
def nombres_conocidos():
"""Toda receta alcanzable: catálogo, colas `incoming-*` y `tandas/`."""
n = set()
@@ -206,6 +220,8 @@ def main():
for i in items:
if i['estado'] == 'falta' and i['parientes']:
i['pista'] = 'nombre parecido en el catálogo (verificar, NO es equivalencia)'
+ if i['nombre'] in MUROS:
+ i['muro'], i['muro_porque'] = MUROS[i['nombre']]
print('== qué le falta a la distro para usarse (checklist de JUICIO, estado MEDIDO) ==')
print(' recetas alcanzables: %d · de ellas en alguna imagen: %d'
@@ -221,6 +237,11 @@ def main():
print(' — PISTAS: falta, pero hay un nombre parecido (verificar; NO es equivalencia):')
for n, p in rev:
print(' %-20s ~ %s' % (n, ', '.join(p)))
+ con_muro = [(i['nombre'], i['muro']) for f in filas for i in f['items'] if i.get('muro')]
+ if con_muro:
+ print(' — MUROS MEDIDOS (no es que falte la receta: la distro no publica eso):')
+ for n, m in con_muro:
+ print(' %-20s %s' % (n, m))
print(' resumen: %s' % json.dumps(resumen, ensure_ascii=False))
if a.json: