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
Delta semántico
Ninguna definición cambió: el cambio es de texto, documentación o datos.
9 archivos · +293 −78
- docs/state/build-state-cosmic.json +46 −16
- docs/state/build-state-gnome.json +45 −15
- docs/state/build-state-kde.json +46 −16
- docs/state/build-state-wlr.json +46 −16
- docs/state/build-state.json +39 −14
- docs/state/frontera-triaje.toml +2 −1
- docs/state/repro-verificado.tsv +1 −0
- docs/state/targets.toml +28 −0
- recipes/desktop-file-utils.toml +40 −0
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"]