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…

TOML 1407Shell 141Markdown 84Rust 802745 Sutichaykuna

⎇ 57cd6aab98d5f9f11cf797cc62cd0beb87f487eb docs/state/distro-huecos.json JSON · 1385 siq'ikuna · 27.7 KB Ñawpa willay ch'uya

medición: fcitx5 no falta por la receta — falta una decisión de arquitectura del corpus 57cd6aab9 · Sergio ·

1{
2 "categorias": [
3  {
4   "categoria": "escritura del mundo",
5   "faltan": [
6    "noto-fonts-extra"
7   ],
8   "items": [
9    {
10     "estado": "tiene-y-viaja",
11     "nombre": "noto-fonts-cjk",
12     "parientes": []
13    },
14    {
15     "estado": "tiene-y-viaja",
16     "nombre": "noto-fonts-emoji",
17     "parientes": []
18    },
19    {
20     "estado": "tiene-y-viaja",
21     "nombre": "noto-fonts",
22     "parientes": []
23    },
24    {
25     "estado": "falta",
26     "nombre": "noto-fonts-extra",
27     "parientes": [
28      "noto-fonts",
29      "noto-fonts-cjk",
30      "noto-fonts-emoji"
31     ],
32     "pista": "nombre parecido en el catálogo (verificar, NO es equivalencia)"
33    }
34   ],
35   "porque": "las únicas fuentes del corpus son dejavu y su nerd: sin estas, la distro muestra cuadraditos en chino, japonés, coreano, árabe, hindi, tailandés y emoji"
36  },
37  {
38   "categoria": "escribir en esos idiomas",
39   "faltan": [
40    "anthy",
41    "libpinyin",
42    "hangul",
43    "rime"
44   ],
45   "items": [
46    {
47     "estado": "tiene-sin-viajar",
48     "muro": "corpus-estatico-sin-pic",
49     "muro_porque": "MEDIDO el 2026-10-19 construyéndolo cinco veces. La receta está escrita, el configure pasa limpio y el compilador termina: muere al ENLAZAR, con **7365** errores `relocation … recompile with -fPIC`. fcitx5 produce OCHO bibliotecas compartidas (libFcitx5Utils/Core/Config + los addons classicui, clipboard, dbus, dbusfrontend, emoji) porque sus métodos de entrada se cargan con dlopen; y este corpus es ESTÁTICO-PRIMERO Y SIN PIC, así que un `.a` del catálogo no entra en un `.so`. Dos se resolvieron en el camino —`libuv` PIC-ificado (radio 1) y `ENABLE_LIBUUID=Off` por el fallback del kernel (util-linux es radio 79)— y el tercero no se puede esquivar: `libpng16.a` + `libfreetype.a` + `libfontconfig.a` los pide `libclassicui.so`, que ES la barra de candidatos, o sea la interfaz del IME. ⇒ NO falta una receta: falta decidir si el trío de fuentes se publica con `--with-pic`. Coste medido: **40 recetas en la unión de sus dependientes transitivos** (no 133: se solapan) y las CINCO imágenes de escritorio rearman. Es la misma decisión que el operador tomó en NEGATIVO para `libpng` el 2026-08-21 —«es estático por diseño; eso es arquitectura del corpus»—, pero el contexto cambió: allá era para salvar UN `.so` que no se quería; acá desbloquea una capacidad entera y a cualquier app futura que necesite enlazar desde un `.so`.",
50     "nombre": "fcitx5",
51     "parientes": []
52    },
53    {
54     "estado": "tiene-y-viaja",
55     "nombre": "ibus",
56     "parientes": []
57    },
58    {
59     "estado": "falta",
60     "nombre": "anthy",
61     "parientes": []
62    },
63    {
64     "estado": "falta",
65     "nombre": "libpinyin",
66     "parientes": []
67    },
68    {
69     "estado": "falta",
70     "nombre": "hangul",
71     "parientes": []
72    },
73    {
74     "estado": "falta",
75     "nombre": "rime",
76     "parientes": []
77    }
78   ],
79   "porque": "una fuente deja LEER; para ESCRIBIR hace falta un método de entrada"
80  },
81  {
82   "categoria": "accesibilidad",
83   "faltan": [
84    "orca",
85    "speech-dispatcher",
86    "espeak-ng",
87    "brltty"
88   ],
89   "items": [
90    {
91     "estado": "falta",
92     "nombre": "orca",
93     "parientes": []
94    },
95    {
96     "estado": "falta",
97     "nombre": "speech-dispatcher",
98     "parientes": []
99    },
100    {
101     "estado": "falta",
102     "nombre": "espeak-ng",
103     "parientes": []
104    },
105    {
106     "estado": "falta",
107     "nombre": "brltty",
108     "parientes": []
109    }
110   ],
111   "porque": "sin lector de pantalla ni voz la distro es inusable para quien no ve"
112  },
113  {
114   "categoria": "terminales populares",
115   "faltan": [
116    "kitty",
117    "alacritty",
118    "wezterm",
119    "ghostty",
120    "xterm"
121   ],
122   "items": [
123    {
124     "estado": "falta",
125     "muro": "sin-opengl-de-escritorio",
126     "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.",
127     "nombre": "kitty",
128     "parientes": []
129    },
130    {
131     "estado": "falta",
132     "nombre": "alacritty",
133     "parientes": []
134    },
135    {
136     "estado": "falta",
137     "nombre": "wezterm",
138     "parientes": []
139    },
140    {
141     "estado": "falta",
142     "nombre": "ghostty",
143     "parientes": []
144    },
145    {
146     "estado": "falta",
147     "nombre": "xterm",
148     "parientes": []
149    }
150   ],
151   "porque": "`foot` está y alcanza; pero quien llega de otra distro busca el suyo por nombre, y el doc 20 §II.2 ya los listaba como «barato». kitty: 13 de sus 14 deps ya están en el catálogo (falta librsync, opcional)"
152  },
153  {
154   "categoria": "editores",
155   "faltan": [
156    "neovim",
157    "emacs"
158   ],
159   "items": [
160    {
161     "estado": "falta",
162     "nombre": "neovim",
163     "parientes": [
164      "vim"
165     ],
166     "pista": "nombre parecido en el catálogo (verificar, NO es equivalencia)"
167    },
168    {
169     "estado": "falta",
170     "nombre": "emacs",
171     "parientes": []
172    },
173    {
174     "estado": "tiene-y-viaja",
175     "nombre": "micro",
176     "parientes": []
177    },
178    {
179     "estado": "tiene-sin-viajar",
180     "nombre": "kakoune",
181     "parientes": []
182    },
183    {
184     "estado": "tiene-y-viaja",
185     "nombre": "nano",
186     "parientes": []
187    }
188   ],
189   "porque": "`vim` y `helix` están. ⚠ Existe `bob-nvim` —el GESTOR DE VERSIONES de neovim— y no existe neovim: el conductor sin el motor, como `crun` sin podman"
190  },
191  {
192   "categoria": "shells",
193   "faltan": [
194    "fish"
195   ],
196   "items": [
197    {
198     "estado": "falta",
199     "nombre": "fish",
200     "parientes": []
201    },
202    {
203     "estado": "tiene-y-viaja",
204     "nombre": "elvish",
205     "parientes": []
206    }
207   ],
208   "porque": "bash, zsh y nushell están"
209  },
210  {
211   "categoria": "lanzador, notificaciones y bloqueo",
212   "faltan": [
213    "rofi",
214    "wofi",
215    "bemenu",
216    "tofi",
217    "swaync",
218    "gtklock",
219    "waylock"
220   ],
221   "items": [
222    {
223     "estado": "falta",
224     "nombre": "rofi",
225     "parientes": []
226    },
227    {
228     "estado": "falta",
229     "nombre": "wofi",
230     "parientes": []
231    },
232    {
233     "estado": "tiene-y-viaja",
234     "nombre": "fuzzel",
235     "parientes": []
236    },
237    {
238     "estado": "falta",
239     "nombre": "bemenu",
240     "parientes": []
241    },
242    {
243     "estado": "falta",
244     "nombre": "tofi",
245     "parientes": []
246    },
247    {
248     "estado": "tiene-sin-viajar",
249     "nombre": "mako",
250     "parientes": []
251    },
252    {
253     "estado": "tiene-y-viaja",
254     "nombre": "dunst",
255     "parientes": []
256    },
257    {
258     "estado": "falta",
259     "nombre": "swaync",
260     "parientes": [
261      "sway"
262     ],
263     "pista": "nombre parecido en el catálogo (verificar, NO es equivalencia)"
264    },
265    {
266     "estado": "tiene-y-viaja",
267     "nombre": "swaylock",
268     "parientes": []
269    },
270    {
271     "estado": "falta",
272     "nombre": "gtklock",
273     "parientes": []
274    },
275    {
276     "estado": "falta",
277     "nombre": "waylock",
278     "parientes": []
279    }
280   ],
281   "porque": "el esqueleto de un escritorio Wayland que no sea GNOME/KDE: sin lanzador no se abre nada"
282  },
283  {
284   "categoria": "audio de escritorio",
285   "faltan": [
286    "pavucontrol",
287    "pamixer",
288    "playerctl",
289    "easyeffects",
290    "wiremix"
291   ],
292   "items": [
293    {
294     "estado": "falta",
295     "nombre": "pavucontrol",
296     "parientes": []
297    },
298    {
299     "estado": "falta",
300     "nombre": "pamixer",
301     "parientes": []
302    },
303    {
304     "estado": "falta",
305     "nombre": "playerctl",
306     "parientes": []
307    },
308    {
309     "estado": "falta",
310     "nombre": "easyeffects",
311     "parientes": []
312    },
313    {
314     "estado": "falta",
315     "nombre": "wiremix",
316     "parientes": [
317      "wire"
318     ],
319     "pista": "nombre parecido en el catálogo (verificar, NO es equivalencia)"
320    }
321   ],
322   "porque": "PipeWire suena y no hay con qué subirle el volumen desde una ventana"
323  },
324  {
325   "categoria": "capturas y portapapeles",
326   "faltan": [
327    "satty",
328    "swappy",
329    "flameshot",
330    "kanshi"
331   ],
332   "items": [
333    {
334     "estado": "falta",
335     "nombre": "satty",
336     "parientes": []
337    },
338    {
339     "estado": "falta",
340     "nombre": "swappy",
341     "parientes": []
342    },
343    {
344     "estado": "falta",
345     "nombre": "flameshot",
346     "parientes": []
347    },
348    {
349     "estado": "tiene-y-viaja",
350     "nombre": "wtype",
351     "parientes": []
352    },
353    {
354     "estado": "falta",
355     "nombre": "kanshi",
356     "parientes": []
357    }
358   ],
359   "porque": "grim, slurp, wl-clipboard y cliphist ya están"
360  },
361  {
362   "categoria": "visores de imagen",
363   "faltan": [
364    "imv",
365    "nsxiv",
366    "feh",
367    "loupe",
368    "eog"
369   ],
370   "items": [
371    {
372     "estado": "falta",
373     "nombre": "imv",
374     "parientes": []
375    },
376    {
377     "estado": "falta",
378     "nombre": "nsxiv",
379     "parientes": []
380    },
381    {
382     "estado": "falta",
383     "nombre": "feh",
384     "parientes": []
385    },
386    {
387     "estado": "falta",
388     "nombre": "loupe",
389     "parientes": []
390    },
391    {
392     "estado": "falta",
393     "nombre": "eog",
394     "parientes": []
395    }
396   ],
397   "porque": "ninguno: una foto no se abre"
398  },
399  {
400   "categoria": "archivos comprimidos ajenos",
401   "faltan": [
402    "unzip",
403    "zip",
404    "p7zip",
405    "7zip",
406    "unrar"
407   ],
408   "items": [
409    {
410     "cubierto_por": "libarchive",
411     "cubierto_porque": "bsdunzip -o x.zip extrae y conserva el árbol — probado con un zip deflate con subdirectorio el 2026-10-19",
412     "estado": "falta",
413     "nombre": "unzip",
414     "parientes": []
415    },
416    {
417     "cubierto_por": "libarchive",
418     "cubierto_porque": "bsdtar -a -cf x.zip … crea un zip que python zipfile lee y verifica — probado el 2026-10-19",
419     "estado": "falta",
420     "nombre": "zip",
421     "parientes": []
422    },
423    {
424     "estado": "falta",
425     "nombre": "p7zip",
426     "parientes": []
427    },
428    {
429     "estado": "falta",
430     "nombre": "7zip",
431     "parientes": []
432    },
433    {
434     "estado": "falta",
435     "nombre": "unrar",
436     "parientes": []
437    }
438   ],
439   "porque": "⚠ EL ARGUMENTO DE ESTA FILA ERA FALSO Y LO MEDÍ DESPUÉS: decía «no se puede abrir un .zip» porque `libzip` es una biblioteca y no el comando. Cierto para libzip — y falso como conclusión: `libarchive` estaba SELLADO y trae `bsdunzip`/`bsdtar`, verificados con un zip real en lectura Y escritura. Se declaró en `cli` el 2026-10-19. Lo que falta son los ALIAS (`unzip`, `zip`) para que un script ajeno que los invoque no falle, y 7z/rar sin medir"
440  },
441  {
442   "categoria": "imprimir de verdad",
443   "faltan": [
444    "cups-filters",
445    "ghostscript",
446    "gutenprint",
447    "hplip"
448   ],
449   "items": [
450    {
451     "estado": "tiene-y-viaja",
452     "nombre": "cups",
453     "parientes": []
454    },
455    {
456     "estado": "falta",
457     "nombre": "cups-filters",
458     "parientes": [
459      "cups"
460     ],
461     "pista": "nombre parecido en el catálogo (verificar, NO es equivalencia)"
462    },
463    {
464     "estado": "falta",
465     "nombre": "ghostscript",
466     "parientes": []
467    },
468    {
469     "estado": "falta",
470     "nombre": "gutenprint",
471     "parientes": []
472    },
473    {
474     "estado": "falta",
475     "nombre": "hplip",
476     "parientes": []
477    }
478   ],
479   "porque": "cups solo no imprime: los filtros y los drivers son otro paquete"
480  },
481  {
482   "categoria": "escanear",
483   "faltan": [
484    "sane-backends",
485    "simple-scan"
486   ],
487   "items": [
488    {
489     "estado": "falta",
490     "nombre": "sane-backends",
491     "parientes": []
492    },
493    {
494     "estado": "falta",
495     "nombre": "simple-scan",
496     "parientes": [
497      "simple-http-server"
498     ],
499     "pista": "nombre parecido en el catálogo (verificar, NO es equivalencia)"
500    }
501   ],
502   "porque": "ningún camino hoy"
503  },
504  {
505   "categoria": "documentos técnicos",
506   "faltan": [
507    "texlive",
508    "pandoc",
509    "groff"
510   ],
511   "items": [
512    {
513     "estado": "falta",
514     "nombre": "texlive",
515     "parientes": []
516    },
517    {
518     "estado": "falta",
519     "nombre": "pandoc",
520     "parientes": []
521    },
522    {
523     "estado": "tiene-y-viaja",
524     "nombre": "typst",
525     "parientes": []
526    },
527    {
528     "estado": "falta",
529     "nombre": "groff",
530     "parientes": []
531    }
532   ],
533   "porque": "nada que componga un PDF desde texto marcado"
534  },
535  {
536   "categoria": "páginas de manual",
537   "faltan": [
538    "man-pages",
539    "texinfo"
540   ],
541   "items": [
542    {
543     "estado": "falta",
544     "nombre": "man-pages",
545     "parientes": [
546      "mandoc",
547      "mandown",
548      "mani"
549     ],
550     "pista": "nombre parecido en el catálogo (verificar, NO es equivalencia)"
551    },
552    {
553     "estado": "falta",
554     "nombre": "texinfo",
555     "parientes": []
556    }
557   ],
558   "porque": "`mandoc` LEE man; falta el CONTENIDO y el formateador de info"
559  },
560  {
561   "categoria": "virtualización",
562   "faltan": [
563    "qemu",
564    "libvirt",
565    "virt-manager"
566   ],
567   "items": [
568    {
569     "estado": "falta",
570     "nombre": "qemu",
571     "parientes": []
572    },
573    {
574     "estado": "falta",
575     "nombre": "libvirt",
576     "parientes": []
577    },
578    {
579     "estado": "falta",
580     "nombre": "virt-manager",
581     "parientes": []
582    }
583   ],
584   "porque": "ni invitado ni anfitrión: no se puede probar la propia ISO sin salir"
585  },
586  {
587   "categoria": "contenedores",
588   "faltan": [
589    "podman",
590    "docker",
591    "buildah",
592    "flatpak",
593    "distrobox"
594   ],
595   "items": [
596    {
597     "estado": "falta",
598     "nombre": "podman",
599     "parientes": []
600    },
601    {
602     "estado": "falta",
603     "nombre": "docker",
604     "parientes": []
605    },
606    {
607     "estado": "falta",
608     "nombre": "buildah",
609     "parientes": []
610    },
611    {
612     "estado": "falta",
613     "nombre": "flatpak",
614     "parientes": []
615    },
616    {
617     "estado": "falta",
618     "nombre": "distrobox",
619     "parientes": []
620    }
621   ],
622   "porque": "`crun` está (el motor); falta quien lo conduzca"
623  },
624  {
625   "categoria": "java",
626   "faltan": [
627    "openjdk",
628    "jdk",
629    "temurin"
630   ],
631   "items": [
632    {
633     "estado": "falta",
634     "nombre": "openjdk",
635     "parientes": []
636    },
637    {
638     "estado": "falta",
639     "nombre": "jdk",
640     "parientes": []
641    },
642    {
643     "estado": "falta",
644     "nombre": "temurin",
645     "parientes": []
646    }
647   ],
648   "porque": "un ecosistema entero queda fuera sin una JVM"
649  },
650  {
651   "categoria": "bases de datos de servidor",
652   "faltan": [
653    "postgresql",
654    "mariadb",
655    "redis"
656   ],
657   "items": [
658    {
659     "estado": "falta",
660     "nombre": "postgresql",
661     "parientes": []
662    },
663    {
664     "estado": "falta",
665     "nombre": "mariadb",
666     "parientes": []
667    },
668    {
669     "estado": "falta",
670     "nombre": "redis",
671     "parientes": []
672    },
673    {
674     "estado": "tiene-y-viaja",
675     "nombre": "valkey",
676     "parientes": []
677    }
678   ],
679   "porque": "sqlite está; un servicio con varios clientes no"
680  },
681  {
682   "categoria": "depurar y medir",
683   "faltan": [
684    "gdb",
685    "lldb",
686    "valgrind",
687    "ltrace",
688    "perf",
689    "patchelf"
690   ],
691   "items": [
692    {
693     "estado": "falta",
694     "nombre": "gdb",
695     "parientes": []
696    },
697    {
698     "estado": "falta",
699     "nombre": "lldb",
700     "parientes": []
701    },
702    {
703     "estado": "falta",
704     "nombre": "valgrind",
705     "parientes": []
706    },
707    {
708     "estado": "falta",
709     "nombre": "ltrace",
710     "parientes": []
711    },
712    {
713     "estado": "falta",
714     "nombre": "perf",
715     "parientes": []
716    },
717    {
718     "estado": "falta",
719     "nombre": "patchelf",
720     "parientes": [
721      "patch"
722     ],
723     "pista": "nombre parecido en el catálogo (verificar, NO es equivalencia)"
724    }
725   ],
726   "porque": "se construye la distro entera y no hay con qué mirar un core"
727  },
728  {
729   "categoria": "discos y salud del equipo",
730   "faltan": [
731    "smartmontools",
732    "nvme-cli",
733    "hdparm",
734    "gparted"
735   ],
736   "items": [
737    {
738     "estado": "falta",
739     "nombre": "smartmontools",
740     "parientes": []
741    },
742    {
743     "estado": "falta",
744     "nombre": "nvme-cli",
745     "parientes": []
746    },
747    {
748     "estado": "falta",
749     "nombre": "hdparm",
750     "parientes": []
751    },
752    {
753     "estado": "falta",
754     "nombre": "gparted",
755     "parientes": [
756      "parted"
757     ],
758     "pista": "nombre parecido en el catálogo (verificar, NO es equivalencia)"
759    }
760   ],
761   "porque": "nada que avise de un disco muriéndose"
762  },
763  {
764   "categoria": "otros lenguajes",
765   "faltan": [
766    "deno",
767    "bun",
768    "ruby",
769    "php",
770    "julia",
771    "ghc",
772    "ocaml",
773    "elixir",
774    "erlang"
775   ],
776   "items": [
777    {
778     "estado": "tiene-sin-viajar",
779     "nombre": "nodejs",
780     "parientes": []
781    },
782    {
783     "estado": "falta",
784     "nombre": "deno",
785     "parientes": []
786    },
787    {
788     "estado": "falta",
789     "nombre": "bun",
790     "parientes": []
791    },
792    {
793     "estado": "falta",
794     "nombre": "ruby",
795     "parientes": []
796    },
797    {
798     "estado": "falta",
799     "nombre": "php",
800     "parientes": []
801    },
802    {
803     "estado": "falta",
804     "nombre": "julia",
805     "parientes": []
806    },
807    {
808     "estado": "falta",
809     "nombre": "ghc",
810     "parientes": []
811    },
812    {
813     "estado": "falta",
814     "nombre": "ocaml",
815     "parientes": []
816    },
817    {
818     "estado": "falta",
819     "nombre": "elixir",
820     "parientes": []
821    },
822    {
823     "estado": "falta",
824     "nombre": "erlang",
825     "parientes": []
826    }
827   ],
828   "porque": "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"
829  },
830  {
831   "categoria": "empaquetadores de python",
832   "faltan": [
833    "pipx",
834    "poetry"
835   ],
836   "items": [
837    {
838     "estado": "falta",
839     "nombre": "pipx",
840     "parientes": []
841    },
842    {
843     "estado": "tiene-y-viaja",
844     "nombre": "uv",
845     "parientes": []
846    },
847    {
848     "estado": "falta",
849     "nombre": "poetry",
850     "parientes": []
851    }
852   ],
853   "porque": "pip no viaja y no hay forma de instalar una herramienta python"
854  },
855  {
856   "categoria": "construcción C clásica",
857   "faltan": [
858    "autoconf",
859    "automake",
860    "ninja"
861   ],
862   "items": [
863    {
864     "estado": "falta",
865     "nombre": "autoconf",
866     "parientes": []
867    },
868    {
869     "estado": "falta",
870     "nombre": "automake",
871     "parientes": [
872      "make"
873     ],
874     "pista": "nombre parecido en el catálogo (verificar, NO es equivalencia)"
875    },
876    {
877     "cubierto_por": "samurai",
878     "cubierto_porque": "MEDIDO: un artefacto vigente instala un binario con ese nombre exacto. Falta la receta propia, no la capacidad",
879     "estado": "falta",
880     "nombre": "ninja",
881     "parientes": []
882    }
883   ],
884   "porque": "⚠ ESTA FILA ES LA MÁS DUDOSA DEL CHECKLIST y conviene que lo diga: cmake, meson, make y samurai existen y NO viajan en ninguna imagen — probablemente a propósito, porque una imagen de producto no se construye a sí misma. La receta de `nodejs` ya tomó esa decisión por escrito para su caso («acá Node es un compilador más, no software que la distro publique»). ⇒ lo que falta acá puede no ser un hueco sino un PERFIL de desarrollo que no existe. Se deja medido y sin declarar. `ninja` además lo instala `samurai` con ese nombre exacto (1.9.0, medido). Y `gcc` está RETENIDO a propósito (sólo `gcc-libs`), `clang` es `clang18`: eso no es hueco, es decisión"
885  },
886  {
887   "categoria": "vpn y red gestionada",
888   "faltan": [
889    "openvpn",
890    "iwd",
891    "nmtui",
892    "impala",
893    "mosh",
894    "sshfs"
895   ],
896   "items": [
897    {
898     "estado": "falta",
899     "nombre": "openvpn",
900     "parientes": []
901    },
902    {
903     "estado": "falta",
904     "nombre": "iwd",
905     "parientes": []
906    },
907    {
908     "estado": "falta",
909     "nombre": "nmtui",
910     "parientes": []
911    },
912    {
913     "estado": "falta",
914     "nombre": "impala",
915     "parientes": []
916    },
917    {
918     "estado": "falta",
919     "nombre": "mosh",
920     "parientes": []
921    },
922    {
923     "estado": "falta",
924     "nombre": "sshfs",
925     "parientes": []
926    }
927   ],
928   "porque": "networkmanager, wireguard-tools y wpa_supplicant están"
929  },
930  {
931   "categoria": "bluetooth usable",
932   "faltan": [
933    "blueman",
934    "bluetuith"
935   ],
936   "items": [
937    {
938     "estado": "falta",
939     "nombre": "blueman",
940     "parientes": []
941    },
942    {
943     "estado": "falta",
944     "nombre": "bluetuith",
945     "parientes": []
946    }
947   ],
948   "porque": "`bluez` viaja; falta con qué emparejar un auricular"
949  },
950  {
951   "categoria": "contraseñas",
952   "faltan": [
953    "keepassxc",
954    "pass"
955   ],
956   "items": [
957    {
958     "estado": "falta",
959     "nombre": "keepassxc",
960     "parientes": []
961    },
962    {
963     "estado": "falta",
964     "nombre": "pass",
965     "parientes": []
966    },
967    {
968     "estado": "tiene-y-viaja",
969     "nombre": "gopass",
970     "parientes": []
971    }
972   ],
973   "porque": "nada: la gente guarda sus claves en un .txt o no usa la distro"
974  },
975  {
976   "categoria": "respaldos",
977   "faltan": [
978    "borgbackup",
979    "rsnapshot"
980   ],
981   "items": [
982    {
983     "estado": "falta",
984     "nombre": "borgbackup",
985     "parientes": []
986    },
987    {
988     "estado": "falta",
989     "nombre": "rsnapshot",
990     "parientes": []
991    }
992   ],
993   "porque": "restic y rclone están"
994  },
995  {
996   "categoria": "descargas y torrent",
997   "faltan": [
998    "aria2",
999    "transmission",
1000    "qbittorrent"
1001   ],
1002   "items": [
1003    {
1004     "estado": "falta",
1005     "nombre": "aria2",
1006     "parientes": []
1007    },
1008    {
1009     "estado": "falta",
1010     "nombre": "transmission",
1011     "parientes": []
1012    },
1013    {
1014     "estado": "falta",
1015     "nombre": "qbittorrent",
1016     "parientes": []
1017    }
1018   ],
1019   "porque": "curl y wget están"
1020  },
1021  {
1022   "categoria": "navegadores",
1023   "faltan": [
1024    "chromium",
1025    "qutebrowser",
1026    "librewolf",
1027    "brave"
1028   ],
1029   "items": [
1030    {
1031     "estado": "falta",
1032     "nombre": "chromium",
1033     "parientes": []
1034    },
1035    {
1036     "estado": "falta",
1037     "nombre": "qutebrowser",
1038     "parientes": []
1039    },
1040    {
1041     "estado": "falta",
1042     "nombre": "librewolf",
1043     "parientes": []
1044    },
1045    {
1046     "estado": "falta",
1047     "nombre": "brave",
1048     "parientes": []
1049    }
1050   ],
1051   "porque": "firefox y atuq están; el motor Blink no tiene ningún camino"
1052  },
1053  {
1054   "categoria": "mensajería",
1055   "faltan": [
1056    "dino",
1057    "gajim",
1058    "element-desktop",
1059    "telegram-desktop",
1060    "signal-desktop"
1061   ],
1062   "items": [
1063    {
1064     "estado": "falta",
1065     "nombre": "dino",
1066     "parientes": []
1067    },
1068    {
1069     "estado": "falta",
1070     "nombre": "gajim",
1071     "parientes": []
1072    },
1073    {
1074     "estado": "falta",
1075     "nombre": "element-desktop",
1076     "parientes": []
1077    },
1078    {
1079     "estado": "falta",
1080     "nombre": "telegram-desktop",
1081     "parientes": []
1082    },
1083    {
1084     "estado": "falta",
1085     "nombre": "signal-desktop",
1086     "parientes": []
1087    }
1088   ],
1089   "porque": "ningún cliente de chat: ni XMPP, ni Matrix, ni los propietarios"
1090  },
1091  {
1092   "categoria": "música",
1093   "faltan": [
1094    "mpd",
1095    "ncmpcpp",
1096    "rhythmbox",
1097    "audacious"
1098   ],
1099   "items": [
1100    {
1101     "estado": "falta",
1102     "nombre": "mpd",
1103     "parientes": []
1104    },
1105    {
1106     "estado": "falta",
1107     "nombre": "ncmpcpp",
1108     "parientes": []
1109    },
1110    {
1111     "estado": "falta",
1112     "nombre": "rhythmbox",
1113     "parientes": []
1114    },
1115    {
1116     "estado": "falta",
1117     "nombre": "audacious",
1118     "parientes": []
1119    }
1120   ],
1121   "porque": "mpv y cmus están para reproducir un fichero; falta biblioteca y daemon"
1122  },
1123  {
1124   "categoria": "video",
1125   "faltan": [
1126    "vlc",
1127    "celluloid",
1128    "totem"
1129   ],
1130   "items": [
1131    {
1132     "estado": "falta",
1133     "nombre": "vlc",
1134     "parientes": []
1135    },
1136    {
1137     "estado": "falta",
1138     "nombre": "celluloid",
1139     "parientes": []
1140    },
1141    {
1142     "estado": "falta",
1143     "nombre": "totem",
1144     "parientes": []
1145    }
1146   ],
1147   "porque": "mpv está"
1148  },
1149  {
1150   "categoria": "imagen y diseño",
1151   "faltan": [
1152    "gimp",
1153    "inkscape",
1154    "krita",
1155    "darktable"
1156   ],
1157   "items": [
1158    {
1159     "estado": "falta",
1160     "nombre": "gimp",
1161     "parientes": []
1162    },
1163    {
1164     "estado": "falta",
1165     "nombre": "inkscape",
1166     "parientes": []
1167    },
1168    {
1169     "estado": "falta",
1170     "nombre": "krita",
1171     "parientes": []
1172    },
1173    {
1174     "estado": "falta",
1175     "nombre": "darktable",
1176     "parientes": []
1177    }
1178   ],
1179   "porque": "⚠ la suite ArtCraft propia cubre esto con 12 apps (photocraft, vectorcraft, …): estos renglones son los nombres AJENOS que alguien busca, no un hueco de capacidad"
1180  },
1181  {
1182   "categoria": "gestores de archivos",
1183   "faltan": [
1184    "thunar",
1185    "ranger"
1186   ],
1187   "items": [
1188    {
1189     "estado": "falta",
1190     "nombre": "thunar",
1191     "parientes": []
1192    },
1193    {
1194     "estado": "falta",
1195     "nombre": "ranger",
1196     "parientes": []
1197    }
1198   ],
1199   "porque": "yazi, nnn, lf, broot y dolphin/nautilus están"
1200  },
1201  {
1202   "categoria": "lectores de PDF",
1203   "faltan": [
1204    "mupdf",
1205    "sioyek",
1206    "evince"
1207   ],
1208   "items": [
1209    {
1210     "estado": "falta",
1211     "nombre": "mupdf",
1212     "parientes": []
1213    },
1214    {
1215     "estado": "falta",
1216     "nombre": "sioyek",
1217     "parientes": []
1218    },
1219    {
1220     "estado": "falta",
1221     "nombre": "evince",
1222     "parientes": []
1223    }
1224   ],
1225   "porque": "zathura y okular están"
1226  },
1227  {
1228   "categoria": "notas",
1229   "faltan": [
1230    "obsidian",
1231    "logseq",
1232    "joplin",
1233    "zettlr"
1234   ],
1235   "items": [
1236    {
1237     "estado": "falta",
1238     "nombre": "obsidian",
1239     "parientes": []
1240    },
1241    {
1242     "estado": "falta",
1243     "nombre": "logseq",
1244     "parientes": []
1245    },
1246    {
1247     "estado": "falta",
1248     "nombre": "joplin",
1249     "parientes": []
1250    },
1251    {
1252     "estado": "falta",
1253     "nombre": "zettlr",
1254     "parientes": []
1255    }
1256   ],
1257   "porque": "ninguno"
1258  },
1259  {
1260   "categoria": "otros compositores Wayland",
1261   "faltan": [
1262    "hyprland",
1263    "river",
1264    "niri",
1265    "labwc",
1266    "wayfire"
1267   ],
1268   "items": [
1269    {
1270     "estado": "falta",
1271     "nombre": "hyprland",
1272     "parientes": []
1273    },
1274    {
1275     "estado": "falta",
1276     "nombre": "river",
1277     "parientes": []
1278    },
1279    {
1280     "estado": "falta",
1281     "nombre": "niri",
1282     "parientes": []
1283    },
1284    {
1285     "estado": "falta",
1286     "nombre": "labwc",
1287     "parientes": [
1288      "lab"
1289     ],
1290     "pista": "nombre parecido en el catálogo (verificar, NO es equivalencia)"
1291    },
1292    {
1293     "estado": "falta",
1294     "nombre": "wayfire",
1295     "parientes": []
1296    }
1297   ],
1298   "porque": "hay cinco escritorios (mirada, sway, cosmic, gnome, kde); éstos son los que la gente nombra y no están. Decisión de alcance, no olvido"
1299  },
1300  {
1301   "categoria": "juegos",
1302   "faltan": [
1303    "wine",
1304    "steam",
1305    "gamescope",
1306    "lutris",
1307    "mangohud"
1308   ],
1309   "items": [
1310    {
1311     "estado": "falta",
1312     "nombre": "wine",
1313     "parientes": []
1314    },
1315    {
1316     "estado": "falta",
1317     "nombre": "steam",
1318     "parientes": [
1319      "steam-runtime-sniper",
1320      "steampipe"
1321     ],
1322     "pista": "nombre parecido en el catálogo (verificar, NO es equivalencia)"
1323    },
1324    {
1325     "estado": "falta",
1326     "nombre": "gamescope",
1327     "parientes": []
1328    },
1329    {
1330     "estado": "falta",
1331     "nombre": "lutris",
1332     "parientes": []
1333    },
1334    {
1335     "estado": "falta",
1336     "nombre": "mangohud",
1337     "parientes": []
1338    }
1339   ],
1340   "porque": "decisión abierta: arrastra Vulkan, que la distro hoy no publica"
1341  },
1342  {
1343   "categoria": "infra ajena",
1344   "faltan": [
1345    "terraform",
1346    "ansible"
1347   ],
1348   "items": [
1349    {
1350     "estado": "tiene-y-viaja",
1351     "nombre": "kubectl",
1352     "parientes": []
1353    },
1354    {
1355     "estado": "tiene-y-viaja",
1356     "nombre": "helm",
1357     "parientes": []
1358    },
1359    {
1360     "estado": "falta",
1361     "nombre": "terraform",
1362     "parientes": [
1363      "terraform-docs",
1364      "terraform-ls"
1365     ],
1366     "pista": "nombre parecido en el catálogo (verificar, NO es equivalencia)"
1367    },
1368    {
1369     "estado": "falta",
1370     "nombre": "ansible",
1371     "parientes": []
1372    }
1373   ],
1374   "porque": "decisión abierta: son herramientas de operar OTRA cosa"
1375  }
1376 ],
1377 "en_alguna_imagen": 604,
1378 "recetas_alcanzables": 1379,
1379 "resumen": {
1380  "falta": 148,
1381  "tiene-sin-viajar": 4,
1382  "tiene-y-viaja": 18
1383 },
1384 "schema": "takana-censo-distro/1"
1385}