tawasuyu

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…

censo: un guardián para el propio censo — encontró OCHO filas mintiendo

En un solo día tres filas quedaron contradiciéndose consigo mismas, y las tres
las escribí y las invalidé yo: «escritura del mundo» decía que las únicas
fuentes eran dejavu con las tres Noto ya selladas; «escribir en esos idiomas»
decía «faltan los otros idiomas» con anthy y chinese-addons dentro; y
«contraseñas» decía «nada: la gente guarda sus claves en un .txt» el mismo día
que pass entró en cinco imágenes.

Tres en un día no es descuido: es que el NÚMERO sale del grafo y la
EXPLICACIÓN de la cabeza de alguien, y sólo uno de los dos se actualiza. Y el
daño es justo el que este censo existe para evitar — un «nada» falso manda a
construir algo que ya está, que es como casi rehice un lector de PDF teniendo
zathura sellada.

El guardián es deliberadamente tonto: si la prosa AFIRMA ausencia («nada:»,
«no hay», «ninguno», «las únicas»…) y la cuenta dice que hay piezas, avisa.
No juzga el contenido, sólo detecta la contradicción entre las dos mitades de
la misma fila. Al primer intento encontró CINCO más, tres de ellas invalidadas
por mí esta misma sesión:

  · depurar y medir   «no hay con qué mirar un core»        ← gdb sellado
  · audio de escritorio «nada con qué subir el volumen»     ← pamixer en los 5
  · documentos técnicos «nada que componga un PDF»          ← typst en cli
  · discos y salud    «nada que avise de un disco muriendo» ← smartmontools
  · empaquetadores py «no hay forma de instalar una tool»   ← uv en cli

⚠ Y distingue VIAJA de SÓLO CONSTRUIDO, que no es el mismo aviso. Mi primera
versión los metía en el mismo saco y habría marcado `gdb` como cubierto: está
sellado y en NINGÚN perfil, así que la frase «no hay con qué mirar un core»
sigue siendo VERDAD para quien usa la distro. Ese hueco se cierra declarando,
no construyendo — y el censo ahora lo dice con esas palabras.

Quedan 0 filas contradictorias.

7aa1e14f26e71e1c3ba99019812c1c2b44be0895 · ruwaq Sergio · (1 p'unchaw ñawpaq) · tayta af4413bc7 · kay commitpi sach'ata qhaway

Semántico sayk'uy · 1

scripts/censo-distro.py

  • ukhunpi t'ikrakurqan fn main

1 qillqakuna · +62 −6

diff --git a/scripts/censo-distro.py b/scripts/censo-distro.py
index e87832d9..624ed928 100755
--- a/scripts/censo-distro.py
+++ b/scripts/censo-distro.py
@@ -92,7 +92,9 @@ CHECKLIST = {
         ['rofi', 'wofi', 'fuzzel', 'bemenu', 'tofi', 'mako', 'dunst', 'swaync', 'swaylock',
          'gtklock', 'waylock']),
     'audio de escritorio': (
-        'PipeWire suena y no hay con qué subirle el volumen desde una ventana',
+        '✅ CUBIERTO 2026-10-21: `pamixer` viaja en los CINCO escritorios (mirada, kde, gnome, cosmic, '
+        'sway) ⇒ ya se le puede subir el volumen. Lo que falta son los nombres ajenos que alguien '
+        'busca (`pavucontrol`) y el control de reproducción (`playerctl`), que es otra capacidad',
         ['pavucontrol', 'pamixer', 'playerctl', 'easyeffects', 'wiremix']),
     'capturas y portapapeles': ('grim, slurp, wl-clipboard y cliphist ya están',
                                 ['satty', 'swappy', 'flameshot', 'wtype', 'kanshi']),
@@ -115,7 +117,10 @@ CHECKLIST = {
     'imprimir de verdad': ('cups solo no imprime: los filtros y los drivers son otro paquete',
                            ['cups', 'cups-filters', 'ghostscript', 'gutenprint', 'hplip']),
     'escanear': ('ningún camino hoy', ['sane-backends', 'simple-scan']),
-    'documentos técnicos': ('nada que componga un PDF desde texto marcado',
+    'documentos técnicos': ('✅ CUBIERTO: `typst` viaja en `cli` y compone PDF desde texto marcado — que era exactamente lo '
+        'que esta fila decía que no existía. Lo que falta son los ecosistemas AJENOS: `texlive` '
+        '(que es gigante) y `pandoc` (conversor entre formatos, otra capacidad). `groff` es el '
+        'formateador de las páginas man, que es el renglón de arriba',
                             ['texlive', 'pandoc', 'typst', 'groff']),
     'páginas de manual': ('`mandoc` LEE man; falta el CONTENIDO y el formateador de info',
                           ['man-pages', 'texinfo']),
@@ -126,9 +131,14 @@ CHECKLIST = {
     'java': ('un ecosistema entero queda fuera sin una JVM', ['openjdk', 'jdk', 'temurin']),
     'bases de datos de servidor': ('sqlite está; un servicio con varios clientes no',
                                    ['postgresql', 'mariadb', 'redis', 'valkey']),
-    'depurar y medir': ('se construye la distro entera y no hay con qué mirar un core',
+    'depurar y medir': ('⚠ MATIZADO 2026-10-21: `gdb` 16.3 está SELLADO (PIE, cero R_X86_64_COPY, probado abriendo un '
+        'core y resolviendo símbolos) pero NO viaja en ninguna imagen ⇒ para quien usa la distro '
+        'la frase sigue siendo cierta. El hueco se cierra DECLARÁNDOLO en un perfil, no '
+        'construyendo nada. Lo que falta de verdad es el resto: perf, valgrind, lldb, ltrace',
                         ['gdb', 'lldb', 'valgrind', 'ltrace', 'perf', 'patchelf']),
-    'discos y salud del equipo': ('nada que avise de un disco muriéndose',
+    'discos y salud del equipo': ('✅ CUBIERTO 2026-10-21: `smartmontools` viaja en `base`, o sea en TODAS las imágenes, con su '
+        'drivedb de 792 entradas anclada ⇒ un disco muriéndose ya avisa. Faltan `nvme-cli` '
+        '(gestión NVMe, no diagnóstico SMART), `hdparm` y `gparted`',
                                   ['smartmontools', 'nvme-cli', 'hdparm', 'gparted']),
 
     # ── LENGUAJES Y HERRAMIENTAS DE CONSTRUCCIÓN ────────────────────────────────────────────────
@@ -136,7 +146,9 @@ CHECKLIST = {
         'python3, lua, go, rust y perl están. ⚠ `zig` NO es receta: vive como artefacto '
         '`seed-zig` fuera del catálogo, y es el compilador de TODO el corpus',
         ['nodejs', 'deno', 'bun', 'ruby', 'php', 'julia', 'ghc', 'ocaml', 'elixir', 'erlang']),
-    'empaquetadores de python': ('pip no viaja y no hay forma de instalar una herramienta python',
+    'empaquetadores de python': ('✅ CUBIERTO en lo esencial: `uv` viaja en `cli` e instala herramientas de Python (`uv tool '
+        'install`), que era lo que esta fila decía imposible. Y `py3-pip` entró el 2026-10-20. '
+        'Lo que falta, `pipx` y `poetry`, son los nombres que alguien trae de otra distro',
                                  ['pipx', 'uv', 'poetry']),
     'construcción C clásica': (
         '⚠ ESTA FILA ES LA MÁS DUDOSA DEL CHECKLIST y conviene que lo diga: cmake, meson, make y '
@@ -154,7 +166,15 @@ CHECKLIST = {
                              ['openvpn', 'iwd', 'nmtui', 'impala', 'mosh', 'sshfs']),
     'bluetooth usable': ('`bluez` viaja; falta con qué emparejar un auricular',
                          ['blueman', 'bluetuith']),
-    'contraseñas': ('nada: la gente guarda sus claves en un .txt o no usa la distro',
+    'contraseñas': ('✅ CUBIERTO el 2026-10-21: `pass` entró en `perfil.cli`, que por herencia lo pone en '
+        'CINCO imágenes (cli, kde, gnome, cosmic, sway) más servidor. Guarda y devuelve '
+        'secretos de verdad — el guardián de la receta hace el ciclo init+insert+show y '
+        'compara. Costó ~400 KB porque `gnupg` (40 MB), `git`, `pinentry` y `util-linux` ya '
+        'viajaban en `base`. ⚠ Este texto decía «nada: la gente guarda sus claves en un .txt '
+        'o no usa la distro» y era cierto hasta ese día: la cuenta se actualiza sola y la '
+        'prosa no (ya pasó dos veces hoy con fuentes y métodos de entrada). Lo que queda, '
+        '`keepassxc`, es la variante GRÁFICA con su base de datos propia — otra capacidad, '
+        'no la misma; `gopass` es un reimplementación en Go del mismo formato, redundante',
                     ['keepassxc', 'pass', 'gopass']),
     'respaldos': ('restic y rclone están', ['borgbackup', 'rsnapshot']),
     'descargas y torrent': ('curl y wget están', ['aria2', 'transmission', 'qbittorrent']),
@@ -380,6 +400,42 @@ def main():
         # trabajo que debía evitar.
         if f['faltan'] and f['porque']:
             print('        ↳ ya cubierto / contexto: %s' % f['porque'])
+            # ⚠ GUARDIÁN DEL PROPIO CENSO (2026-10-21) — la cuenta se recalcula, la prosa NO.
+            #
+            # En UN SOLO DÍA tres filas quedaron contradiciéndose consigo mismas: «escritura del
+            # mundo» decía que las únicas fuentes eran dejavu con las tres Noto ya selladas;
+            # «escribir en esos idiomas» decía «faltan los otros idiomas» con anthy y
+            # chinese-addons dentro; y «contraseñas» decía «nada: la gente guarda sus claves en un
+            # .txt» el mismo día que `pass` entró en cinco imágenes.
+            #
+            # Las tres las escribí yo y las tres las invalidé yo. Tres en un día no es descuido:
+            # es que el número sale del grafo y la explicación de la cabeza de alguien, y sólo uno
+            # de los dos se actualiza. Y el daño es el que este censo existe para evitar — un
+            # «nada» falso manda a construir algo que ya está.
+            #
+            # Heurística deliberadamente tonta y por eso útil: si la prosa AFIRMA ausencia y la
+            # cuenta dice que hay piezas presentes, se avisa. No juzga el contenido; sólo detecta
+            # la contradicción entre las dos mitades de la misma fila.
+            niega = ('nada:', 'nada que', 'ninguno', 'ninguna cola', 'ningún cliente',
+                     'ningún camino', 'cero ', 'no hay ', 'las únicas', 'es lo único',
+                     'faltan los otros')
+            # ⚠ Y distingue VIAJA de SÓLO CONSTRUIDO, porque no es el mismo aviso: si la
+            # pieza está sellada y en ninguna imagen, la prosa que dice «no hay» sigue siendo
+            # VERDAD para quien usa la distro — el hueco es real y se cierra con una declaración,
+            # no con un build. Meter las dos cosas en el mismo saco fue mi primera versión, y
+            # habría empujado a marcar `gdb` como cubierto cuando no viaja a ningún sitio.
+            viajan = [i['nombre'] for i in f['items'] if i['estado'] == 'tiene-y-viaja']
+            solo   = [i['nombre'] for i in f['items'] if i['estado'] == 'tiene-sin-viajar']
+            bajo = f['porque'].lower()
+            if any(w in bajo for w in niega) and '✅' not in f['porque']:
+                if viajan:
+                    print('        ⚠ PROSA SOSPECHOSA: el texto afirma ausencia y hay %d que SÍ'
+                          ' viaja(n) en una imagen (%s). Revisá la explicación antes de creerle.'
+                          % (len(viajan), ', '.join(viajan[:4])))
+                elif solo:
+                    print('        ↳ matiz: %s está(n) SELLADA(S) pero en ninguna imagen — el hueco'
+                          ' es real para quien usa la distro, y se cierra DECLARANDO, no'
+                          ' construyendo.' % ', '.join(solo[:4]))
     rev = [(i['nombre'], i['parientes']) for f in filas for i in f['items']
            if i['estado'] == 'falta' and i['parientes']]
     if rev: