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 1471Shell 173Rust 105Markdown 943545 Sutichaykuna

desktop-file-utils: cerrar el «abrir con»

update-desktop-database construye la caché MIME→APLICACIÓN (mimeinfo.cache). Comprobado antes
de escribir la receta: NINGÚN artefacto del store lo traía, así que esa caché no se construía
nunca. Con shared-mime-info (cerrado ayer) el escritorio sabe QUÉ TIPO es un fichero; sin ésta
seguía sin saber CON QUÉ abrirlo — el menú «abrir con» vacío y sin aplicación por defecto.

Misma familia que aquel hueco: falla en RUNTIME, no en build. gnome-shell, libadwaita y mutter
lo piden en nixpkgs y acá construyen tan contentos sin él, así que ninguna métrica de deuda
puede verlo.

Prueba del consumidor con 14 .desktop REALES de okular/dolphin/kate/konsole/spectacle:
  mimeinfo.cache de 2.368 bytes · 47 asociaciones
  application/pdf=okularApplication_pdf.desktop
  text/plain=okularApplication_txt.desktop;org.kde.kate.desktop;org.kde.kwrite.desktop
Los 4 binarios estáticos con 0 NEEDED (--prefer-static desde el principio, no tras el error).
REPRODUCE bit a bit · tarball en el mirror.

Va como RAÍZ en los CUATRO escritorios y no en , y la razón importa: escritorio-kde y
escritorio-gnome comparten CERO raíces con base y bash NO está en su clausura. escritorio-mirada
documenta que no hereda «a propósito, es slim»; esos dos no dicen nada, y sway sí hereda cli.
Declararla en los cuatro funciona con cualquiera de las dos lecturas. La asimetría en sí queda
para decidir aparte: hoy «KDE 302/302» significa «la capa de escritorio está completa», no «la
imagen está completa».

Triaje: huecos 2 → 1 (queda ). Clausuras 303/182/160/205, todas selladas.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014QPJteswQvP1L7zSBrQQe2

248fa8e991fc0b3b70c4d65ccd4af6ba7bde82ed · ruwaq Sergio · (1 killa ñawpaq) · tayta d6a43465c · kay commitpi sach'ata qhaway

Semántico sayk'uy

Mana ima sutichaypas t'ikrakurqanchu: qillqalla, yachachiylla utaq willaylla t'ikrakurqan.

9 qillqakuna · +293 −78

diff --git a/docs/state/build-state-cosmic.json b/docs/state/build-state-cosmic.json
index 44eeffc1..ae383340 100644
--- a/docs/state/build-state-cosmic.json
+++ b/docs/state/build-state-cosmic.json
@@ -1,14 +1,14 @@
 {
  "schema": "hammer-build-state/1",
  "totals": {
-  "recipes": 893,
-  "nodes": 895,
-  "sealed": 893,
+  "recipes": 894,
+  "nodes": 896,
+  "sealed": 894,
   "ajeno": 2
  },
  "by_class": {
   "ajeno": 2,
-  "c": 231,
+  "c": 232,
   "go": 362,
   "gui": 41,
   "kernel": 6,
@@ -17,7 +17,7 @@
  "debt_by_class": {},
  "by_queue": {
   "corpus": {
-   "sealed": 865,
+   "sealed": 866,
    "ajeno": 2
   },
   "incoming-cosmic": {
@@ -36,9 +36,9 @@
    "sealed": 81
   },
   "escritorio-cosmic": {
-   "raices": 42,
-   "clausura": 159,
-   "sealed": 159
+   "raices": 43,
+   "clausura": 160,
+   "sealed": 160
   },
   "escritorio-mirada": {
    "raices": 17,
@@ -3698,6 +3698,36 @@
    "perfiles": [],
    "dependientes_total": 0
   },
+  "desktop-file-utils": {
+   "iname": "desktop-file-utils",
+   "version": "0.28",
+   "link": "static",
+   "compiler": "zig-cc",
+   "deps": [
+    "glib",
+    "libffi",
+    "meson",
+    "pcre2",
+    "pkgconf",
+    "python3",
+    "samurai",
+    "zlib"
+   ],
+   "cls": "c",
+   "queue": "corpus",
+   "foreign": false,
+   "hash": "b3:590be503bc92262cee563d97c675022979e6c98fd205f2344129102c5cae43ec",
+   "state": "sealed",
+   "blocked_by": [],
+   "unblocks": 0,
+   "perfiles": [
+    "escritorio-cosmic",
+    "escritorio-gnome",
+    "escritorio-kde",
+    "escritorio-sway"
+   ],
+   "dependientes_total": 0
+  },
   "devspace": {
    "iname": "devspace",
    "version": "6.3.21",
@@ -6044,7 +6074,7 @@
     "escritorio-kde",
     "escritorio-sway"
    ],
-   "dependientes_total": 32
+   "dependientes_total": 33
   },
   "glib-shared": {
    "iname": "glib-shared",
@@ -9753,7 +9783,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 108
+   "dependientes_total": 109
   },
   "libffi-shared": {
    "iname": "libffi-shared",
@@ -11369,7 +11399,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 123
+   "dependientes_total": 124
   },
   "micro": {
    "iname": "micro",
@@ -12965,7 +12995,7 @@
     "escritorio-kde",
     "escritorio-sway"
    ],
-   "dependientes_total": 80
+   "dependientes_total": 81
   },
   "pcre2-shared": {
    "iname": "pcre2-shared",
@@ -13227,7 +13257,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 394
+   "dependientes_total": 395
   },
   "plow": {
    "iname": "plow",
@@ -13696,7 +13726,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 313
+   "dependientes_total": 314
   },
   "qrcp": {
    "iname": "qrcp",
@@ -14311,7 +14341,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 265
+   "dependientes_total": 266
   },
   "sassc": {
    "iname": "sassc",
@@ -17899,7 +17929,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 112
+   "dependientes_total": 113
   },
   "zlib-ng": {
    "iname": "zlib-ng",
diff --git a/docs/state/build-state-gnome.json b/docs/state/build-state-gnome.json
index f842cc2e..3dd98227 100644
--- a/docs/state/build-state-gnome.json
+++ b/docs/state/build-state-gnome.json
@@ -1,14 +1,14 @@
 {
  "schema": "hammer-build-state/1",
  "totals": {
-  "recipes": 919,
-  "nodes": 921,
-  "sealed": 919,
+  "recipes": 920,
+  "nodes": 922,
+  "sealed": 920,
   "ajeno": 2
  },
  "by_class": {
   "ajeno": 2,
-  "c": 271,
+  "c": 272,
   "go": 362,
   "gui": 47,
   "kernel": 6,
@@ -17,7 +17,7 @@
  "debt_by_class": {},
  "by_queue": {
   "corpus": {
-   "sealed": 856,
+   "sealed": 857,
    "ajeno": 2
   },
   "incoming-gnome": {
@@ -36,9 +36,9 @@
    "sealed": 80
   },
   "escritorio-gnome": {
-   "raices": 23,
-   "clausura": 181,
-   "sealed": 181
+   "raices": 24,
+   "clausura": 182,
+   "sealed": 182
   },
   "escritorio-mirada": {
    "raices": 17,
@@ -3363,6 +3363,36 @@
    "perfiles": [],
    "dependientes_total": 0
   },
+  "desktop-file-utils": {
+   "iname": "desktop-file-utils",
+   "version": "0.28",
+   "link": "static",
+   "compiler": "zig-cc",
+   "deps": [
+    "glib",
+    "libffi",
+    "meson",
+    "pcre2",
+    "pkgconf",
+    "python3",
+    "samurai",
+    "zlib"
+   ],
+   "cls": "c",
+   "queue": "corpus",
+   "foreign": false,
+   "hash": "b3:590be503bc92262cee563d97c675022979e6c98fd205f2344129102c5cae43ec",
+   "state": "sealed",
+   "blocked_by": [],
+   "unblocks": 0,
+   "perfiles": [
+    "escritorio-cosmic",
+    "escritorio-gnome",
+    "escritorio-kde",
+    "escritorio-sway"
+   ],
+   "dependientes_total": 0
+  },
   "devspace": {
    "iname": "devspace",
    "version": "6.3.21",
@@ -10035,7 +10065,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 108
+   "dependientes_total": 109
   },
   "libffi-shared": {
    "iname": "libffi-shared",
@@ -12029,7 +12059,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 123
+   "dependientes_total": 124
   },
   "micro": {
    "iname": "micro",
@@ -13794,7 +13824,7 @@
     "escritorio-kde",
     "escritorio-sway"
    ],
-   "dependientes_total": 80
+   "dependientes_total": 81
   },
   "pcre2-shared": {
    "iname": "pcre2-shared",
@@ -14056,7 +14086,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 394
+   "dependientes_total": 395
   },
   "plow": {
    "iname": "plow",
@@ -14600,7 +14630,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 313
+   "dependientes_total": 314
   },
   "qrcp": {
    "iname": "qrcp",
@@ -15215,7 +15245,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 265
+   "dependientes_total": 266
   },
   "sassc": {
    "iname": "sassc",
@@ -18937,7 +18967,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 112
+   "dependientes_total": 113
   },
   "zlib-ng": {
    "iname": "zlib-ng",
diff --git a/docs/state/build-state-kde.json b/docs/state/build-state-kde.json
index c914f151..3c6f4afa 100644
--- a/docs/state/build-state-kde.json
+++ b/docs/state/build-state-kde.json
@@ -1,14 +1,14 @@
 {
  "schema": "hammer-build-state/1",
  "totals": {
-  "recipes": 1044,
-  "nodes": 1045,
-  "sealed": 1044,
+  "recipes": 1045,
+  "nodes": 1046,
+  "sealed": 1045,
   "ajeno": 1
  },
  "by_class": {
   "ajeno": 1,
-  "c": 398,
+  "c": 399,
   "go": 362,
   "gui": 45,
   "kernel": 6,
@@ -17,7 +17,7 @@
  "debt_by_class": {},
  "by_queue": {
   "corpus": {
-   "sealed": 851,
+   "sealed": 852,
    "ajeno": 1
   },
   "incoming-kde": {
@@ -36,9 +36,9 @@
    "sealed": 76
   },
   "escritorio-kde": {
-   "raices": 47,
-   "clausura": 302,
-   "sealed": 302
+   "raices": 48,
+   "clausura": 303,
+   "sealed": 303
   },
   "escritorio-mirada": {
    "raices": 17,
@@ -3479,6 +3479,36 @@
    "perfiles": [],
    "dependientes_total": 0
   },
+  "desktop-file-utils": {
+   "iname": "desktop-file-utils",
+   "version": "0.28",
+   "link": "static",
+   "compiler": "zig-cc",
+   "deps": [
+    "glib",
+    "libffi",
+    "meson",
+    "pcre2",
+    "pkgconf",
+    "python3",
+    "samurai",
+    "zlib"
+   ],
+   "cls": "c",
+   "queue": "corpus",
+   "foreign": false,
+   "hash": "b3:590be503bc92262cee563d97c675022979e6c98fd205f2344129102c5cae43ec",
+   "state": "sealed",
+   "blocked_by": [],
+   "unblocks": 0,
+   "perfiles": [
+    "escritorio-cosmic",
+    "escritorio-gnome",
+    "escritorio-kde",
+    "escritorio-sway"
+   ],
+   "dependientes_total": 0
+  },
   "devspace": {
    "iname": "devspace",
    "version": "6.3.21",
@@ -6097,7 +6127,7 @@
     "escritorio-kde",
     "escritorio-sway"
    ],
-   "dependientes_total": 32
+   "dependientes_total": 33
   },
   "glib-shared": {
    "iname": "glib-shared",
@@ -13690,7 +13720,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 108
+   "dependientes_total": 109
   },
   "libffi-shared": {
    "iname": "libffi-shared",
@@ -15820,7 +15850,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 123
+   "dependientes_total": 124
   },
   "micro": {
    "iname": "micro",
@@ -17731,7 +17761,7 @@
     "escritorio-kde",
     "escritorio-sway"
    ],
-   "dependientes_total": 80
+   "dependientes_total": 81
   },
   "pcre2-shared": {
    "iname": "pcre2-shared",
@@ -18061,7 +18091,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 394
+   "dependientes_total": 395
   },
   "plasma-activities": {
    "iname": "plasma-activities",
@@ -19542,7 +19572,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 313
+   "dependientes_total": 314
   },
   "qcoro": {
    "iname": "qcoro",
@@ -20767,7 +20797,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 265
+   "dependientes_total": 266
   },
   "sassc": {
    "iname": "sassc",
@@ -24971,7 +25001,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 112
+   "dependientes_total": 113
   },
   "zlib-ng": {
    "iname": "zlib-ng",
diff --git a/docs/state/build-state-wlr.json b/docs/state/build-state-wlr.json
index faf9c48e..bfc5b7fe 100644
--- a/docs/state/build-state-wlr.json
+++ b/docs/state/build-state-wlr.json
@@ -1,14 +1,14 @@
 {
  "schema": "hammer-build-state/1",
  "totals": {
-  "recipes": 878,
-  "nodes": 880,
-  "sealed": 878,
+  "recipes": 879,
+  "nodes": 881,
+  "sealed": 879,
   "ajeno": 2
  },
  "by_class": {
   "ajeno": 2,
-  "c": 236,
+  "c": 237,
   "go": 362,
   "gui": 41,
   "kernel": 6,
@@ -17,7 +17,7 @@
  "debt_by_class": {},
  "by_queue": {
   "corpus": {
-   "sealed": 866,
+   "sealed": 867,
    "ajeno": 2
   },
   "incoming-wlr": {
@@ -41,9 +41,9 @@
    "sealed": 41
   },
   "escritorio-sway": {
-   "raices": 75,
-   "clausura": 204,
-   "sealed": 204
+   "raices": 76,
+   "clausura": 205,
+   "sealed": 205
   }
  },
  "sin_perfil": 648,
@@ -3235,6 +3235,36 @@
    "perfiles": [],
    "dependientes_total": 0
   },
+  "desktop-file-utils": {
+   "iname": "desktop-file-utils",
+   "version": "0.28",
+   "link": "static",
+   "compiler": "zig-cc",
+   "deps": [
+    "glib",
+    "libffi",
+    "meson",
+    "pcre2",
+    "pkgconf",
+    "python3",
+    "samurai",
+    "zlib"
+   ],
+   "cls": "c",
+   "queue": "corpus",
+   "foreign": false,
+   "hash": "b3:590be503bc92262cee563d97c675022979e6c98fd205f2344129102c5cae43ec",
+   "state": "sealed",
+   "blocked_by": [],
+   "unblocks": 0,
+   "perfiles": [
+    "escritorio-cosmic",
+    "escritorio-gnome",
+    "escritorio-kde",
+    "escritorio-sway"
+   ],
+   "dependientes_total": 0
+  },
   "devspace": {
    "iname": "devspace",
    "version": "6.3.21",
@@ -5659,7 +5689,7 @@
     "escritorio-kde",
     "escritorio-sway"
    ],
-   "dependientes_total": 32
+   "dependientes_total": 33
   },
   "glib-shared": {
    "iname": "glib-shared",
@@ -9402,7 +9432,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 108
+   "dependientes_total": 109
   },
   "libffi-shared": {
    "iname": "libffi-shared",
@@ -10992,7 +11022,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 123
+   "dependientes_total": 124
   },
   "micro": {
    "iname": "micro",
@@ -12591,7 +12621,7 @@
     "escritorio-kde",
     "escritorio-sway"
    ],
-   "dependientes_total": 80
+   "dependientes_total": 81
   },
   "pcre2-shared": {
    "iname": "pcre2-shared",
@@ -12853,7 +12883,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 394
+   "dependientes_total": 395
   },
   "plow": {
    "iname": "plow",
@@ -13278,7 +13308,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 313
+   "dependientes_total": 314
   },
   "qrcp": {
    "iname": "qrcp",
@@ -13893,7 +13923,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 265
+   "dependientes_total": 266
   },
   "sassc": {
    "iname": "sassc",
@@ -17698,7 +17728,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 112
+   "dependientes_total": 113
   },
   "zlib-ng": {
    "iname": "zlib-ng",
diff --git a/docs/state/build-state.json b/docs/state/build-state.json
index 6f3f5042..aeee0c98 100644
--- a/docs/state/build-state.json
+++ b/docs/state/build-state.json
@@ -1,14 +1,14 @@
 {
  "schema": "hammer-build-state/1",
  "totals": {
-  "recipes": 867,
-  "nodes": 869,
-  "sealed": 867,
+  "recipes": 868,
+  "nodes": 870,
+  "sealed": 868,
   "ajeno": 2
  },
  "by_class": {
   "ajeno": 2,
-  "c": 225,
+  "c": 226,
   "go": 362,
   "gui": 41,
   "kernel": 6,
@@ -17,7 +17,7 @@
  "debt_by_class": {},
  "by_queue": {
   "corpus": {
-   "sealed": 867,
+   "sealed": 868,
    "ajeno": 2
   }
  },
@@ -38,7 +38,7 @@
    "sealed": 41
   }
  },
- "sin_perfil": 648,
+ "sin_perfil": 649,
  "orphan_deps": [],
  "topo_ok": true,
  "nodes": {
@@ -3227,6 +3227,31 @@
    "perfiles": [],
    "dependientes_total": 0
   },
+  "desktop-file-utils": {
+   "iname": "desktop-file-utils",
+   "version": "0.28",
+   "link": "static",
+   "compiler": "zig-cc",
+   "deps": [
+    "glib",
+    "libffi",
+    "meson",
+    "pcre2",
+    "pkgconf",
+    "python3",
+    "samurai",
+    "zlib"
+   ],
+   "cls": "c",
+   "queue": "corpus",
+   "foreign": false,
+   "hash": "b3:590be503bc92262cee563d97c675022979e6c98fd205f2344129102c5cae43ec",
+   "state": "sealed",
+   "blocked_by": [],
+   "unblocks": 0,
+   "perfiles": [],
+   "dependientes_total": 0
+  },
   "devspace": {
    "iname": "devspace",
    "version": "6.3.21",
@@ -5573,7 +5598,7 @@
     "escritorio-kde",
     "escritorio-sway"
    ],
-   "dependientes_total": 32
+   "dependientes_total": 33
   },
   "glib-shared": {
    "iname": "glib-shared",
@@ -9285,7 +9310,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 108
+   "dependientes_total": 109
   },
   "libffi-shared": {
    "iname": "libffi-shared",
@@ -10875,7 +10900,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 123
+   "dependientes_total": 124
   },
   "micro": {
    "iname": "micro",
@@ -12474,7 +12499,7 @@
     "escritorio-kde",
     "escritorio-sway"
    ],
-   "dependientes_total": 80
+   "dependientes_total": 81
   },
   "pcre2-shared": {
    "iname": "pcre2-shared",
@@ -12736,7 +12761,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 394
+   "dependientes_total": 395
   },
   "plow": {
    "iname": "plow",
@@ -13161,7 +13186,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 313
+   "dependientes_total": 314
   },
   "qrcp": {
    "iname": "qrcp",
@@ -13776,7 +13801,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 265
+   "dependientes_total": 266
   },
   "sassc": {
    "iname": "sassc",
@@ -17267,7 +17292,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 112
+   "dependientes_total": 113
   },
   "zlib-ng": {
    "iname": "zlib-ng",
diff --git a/docs/state/frontera-triaje.toml b/docs/state/frontera-triaje.toml
index 29f0c3b9..958c9554 100644
--- a/docs/state/frontera-triaje.toml
+++ b/docs/state/frontera-triaje.toml
@@ -289,7 +289,8 @@ perfiles = ["escritorio-cosmic", "escritorio-gnome", "escritorio-kde", "escritor
 piden = ["libffi"]
 
 [candidato."desktop-file-utils"]
-veredicto = "hueco"
+veredicto = "provisto"
+provee = "desktop-file-utils"
 porque = "lo piden 3 recetas"
 perfiles = ["escritorio-gnome"]
 piden = ["gnome-shell", "libadwaita", "mutter"]
diff --git a/docs/state/repro-verificado.tsv b/docs/state/repro-verificado.tsv
index ef646c09..8da33220 100644
--- a/docs/state/repro-verificado.tsv
+++ b/docs/state/repro-verificado.tsv
@@ -68,3 +68,4 @@ libXfont2	297f66a9b864360a53e1495199c3f53c04c78db2616df8da6e37c5dbef87eb32	2026-
 xkbcomp	ae4a27e7b8b6672ba0ffd2ddba8127f4b5f84b50358b0c3337d0bf0281873225	2026-09-08	reproduce
 xwayland	d43f7ba02a1f9f4b2cf01e1d03610020779991fb13adbd804f5dd3007244bf3d	2026-09-08	reproduce
 bash-completion	86e9716873c35d1e8a4bc1b6317d3f37d5bc7b3d7c12132ae3a3ee7a24bcebaf	2026-09-09	reproduce
+desktop-file-utils	590be503bc92262cee563d97c675022979e6c98fd205f2344129102c5cae43ec	2026-09-09	reproduce
diff --git a/docs/state/targets.toml b/docs/state/targets.toml
index 700d730d..0aebd8e5 100644
--- a/docs/state/targets.toml
+++ b/docs/state/targets.toml
@@ -77,6 +77,13 @@ cola = "incoming-kde"
 # Raíces del rootfs de metal (docs/HANDOFF-noche-kde-2026-07-14.md:135). El resto del escritorio
 # —137 artefactos hidratados— es CLAUSURA de estas 7, no lista a mano.
 paquetes = [
+  # `desktop-file-utils` (2026-09-09): `update-desktop-database` construye la caché
+  # MIME→APLICACIÓN. Con `shared-mime-info` el escritorio ya sabe QUÉ TIPO es un fichero; sin
+  # ésta sigue sin saber CON QUÉ abrirlo — el menú «abrir con» sale vacío y no hay aplicación
+  # por defecto para ningún tipo. Va como RAÍZ en los CUATRO escritorios y no en `base`,
+  # porque kde/gnome/cosmic NO heredan base: declararla acá funciona con cualquiera de las dos
+  # lecturas del modelo de composición.
+  "desktop-file-utils",
   "plasma-workspace", "kwin", "kscreenlocker", "breeze", "frameworkintegration",
   "qqc2-desktop-style", "plasma-integration",
   # Huecos de RUNTIME confirmados por el triaje de la frontera (2026-07-22). Ninguno bloquea un
@@ -269,6 +276,13 @@ cola = "incoming-gnome"
 # Dos documentos del repo diciendo cosas opuestas, y el que se mira primero es el grafo.
 # Si algún día se autora GTK3, se vuelven a añadir acá y el objetivo reaparece solo.
 paquetes = [
+  # `desktop-file-utils` (2026-09-09): `update-desktop-database` construye la caché
+  # MIME→APLICACIÓN. Con `shared-mime-info` el escritorio ya sabe QUÉ TIPO es un fichero; sin
+  # ésta sigue sin saber CON QUÉ abrirlo — el menú «abrir con» sale vacío y no hay aplicación
+  # por defecto para ningún tipo. Va como RAÍZ en los CUATRO escritorios y no en `base`,
+  # porque kde/gnome/cosmic NO heredan base: declararla acá funciona con cualquiera de las dos
+  # lecturas del modelo de composición.
+  "desktop-file-utils",
   "mutter", "gnome-shell", "gjs",
   "gsettings-desktop-schemas", "gnome-desktop", "xdg-desktop-portal-gnome",
   # ── LA PRIMERA APP DE USUARIO FINAL QUE COMPARTEN LOS CUATRO ESCRITORIOS ──────────────────────
@@ -433,6 +447,13 @@ cola = "incoming-cosmic"
 # el binario `cosmic-workspaces`, y el AppID tampoco lleva el sufijo. Se lista por el nombre de la
 # RECETA, que es el del repo.
 paquetes = [
+  # `desktop-file-utils` (2026-09-09): `update-desktop-database` construye la caché
+  # MIME→APLICACIÓN. Con `shared-mime-info` el escritorio ya sabe QUÉ TIPO es un fichero; sin
+  # ésta sigue sin saber CON QUÉ abrirlo — el menú «abrir con» sale vacío y no hay aplicación
+  # por defecto para ningún tipo. Va como RAÍZ en los CUATRO escritorios y no en `base`,
+  # porque kde/gnome/cosmic NO heredan base: declararla acá funciona con cualquiera de las dos
+  # lecturas del modelo de composición.
+  "desktop-file-utils",
   "cosmic-comp", "cosmic-session", "cosmic-settings-daemon",
   "cosmic-panel", "cosmic-launcher", "cosmic-app-library", "cosmic-workspaces-epoch",
   "cosmic-notifications", "cosmic-osd", "cosmic-bg", "cosmic-idle",
@@ -596,6 +617,13 @@ hereda = ["cli"]
 # el grafo siguiendo las aristas de deps. Escribirla a mano sería justo lo que targets.toml existe
 # para no hacer.
 paquetes = [
+  # `desktop-file-utils` (2026-09-09): `update-desktop-database` construye la caché
+  # MIME→APLICACIÓN. Con `shared-mime-info` el escritorio ya sabe QUÉ TIPO es un fichero; sin
+  # ésta sigue sin saber CON QUÉ abrirlo — el menú «abrir con» sale vacío y no hay aplicación
+  # por defecto para ningún tipo. Va como RAÍZ en los CUATRO escritorios y no en `base`,
+  # porque kde/gnome/cosmic NO heredan base: declararla acá funciona con cualquiera de las dos
+  # lecturas del modelo de composición.
+  "desktop-file-utils",
   # el compositor y sus utilidades propias
   "sway",
   # lo que hace que se USE y no sólo arranque
diff --git a/recipes/desktop-file-utils.toml b/recipes/desktop-file-utils.toml
new file mode 100644
index 00000000..6c8d7917
--- /dev/null
+++ b/recipes/desktop-file-utils.toml
@@ -0,0 +1,40 @@
+# desktop-file-utils 0.28 — las tres herramientas de freedesktop sobre ficheros `.desktop`:
+#   update-desktop-database  construye `mimeinfo.cache`, la caché MIME→APLICACIÓN
+#   desktop-file-validate    valida un .desktop contra la especificación
+#   desktop-file-install     instala uno, normalizándolo
+#
+# POR QUÉ ERA UN HUECO, y por qué es el compañero de `shared-mime-info`. Aquella receta (cerrada el
+# 2026-09-08) le dio al escritorio la base de datos que dice QUÉ TIPO es un fichero. Ésta le da la
+# que dice CON QUÉ ABRIRLO: sin `mimeinfo.cache` el menú «abrir con» sale vacío y no hay aplicación
+# por defecto para ningún tipo. Comprobado antes de escribir la receta: NINGÚN artefacto del store
+# traía `update-desktop-database`, así que esa caché no se construía nunca.
+#
+# Como el otro, falla en RUNTIME y no en build — gnome-shell, libadwaita y mutter lo piden en nixpkgs
+# y acá construyen tan contentos sin él. Ninguna métrica de deuda puede ver un hueco así; salió del
+# triaje de la frontera (2026-09-09).
+#
+# Va al CORPUS porque lo necesitan las cuatro imágenes de escritorio, no una cola.
+name    = "desktop-file-utils"
+version = "0.28"
+license = "GPL-2.0-or-later"
+
+[source]
+tarball = "https://www.freedesktop.org/software/desktop-file-utils/releases/desktop-file-utils-0.28.tar.xz"
+sha256  = "4401d4e231d842c2de8242395a74a395ca468cd96f5f610d822df33594898a70"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "static"
+
+[build.phases]
+# `--prefer-static` además de link=static: gobierna con qué se enlazan los EJECUTABLES, que acá son
+# todo el paquete. Es la lección de json-glib, aplicada antes del error y no después.
+configure = "PKG_CONFIG_PATH=/usr/lib/pkgconfig meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload --prefer-static"
+compile   = "ninja -C output"
+install   = "DESTDIR=/out meson install -C output --no-rebuild"
+
+[deps]
+# `libffi`/`pcre2`/`zlib` son la clausura de pkg-config que declara el `.pc` de glib en
+# Requires.private; las deps de hammer NO son transitivas.
+build = ["meson", "samurai", "python3", "pkgconf", "glib", "libffi", "pcre2", "zlib"]