fuentes: dejavu al corpus (arregla un `wanted` que dejé), KDE con fuente, y la nerd de monospace
TRES COSAS, y la primera es un bug mío de hace un rato.
1. dejavu-fonts PROMOVIDA AL CORPUS — arregla un nodo `wanted` que introduje.
Al añadirla de raíz a escritorio-gnome quedó como `wanted`: la receta existía en
incoming-{kde,wlr,cosmic} y NO en incoming-gnome ni en el corpus, y una receta no
alcanza una cola hermana. O sea que la raíz no resolvía a nada y GNOME seguía sin
fuentes. `wanted` NO es `debt`, así que drenaje.json seguía diciendo deuda=0 y el
hueco no salía por ninguna métrica — se vio mirando el nodo en build-state-gnome.json.
Promoción gratis: las tres copias sellaban el mismo hash (b3:5b3a5df3) y sus deps
están vacías. Las tres se jubilan. Ahora los cuatro perfiles resuelven a corpus y los
cinco grafos quedan con CERO nodos `wanted`.
2. dejavu-fonts en escritorio-kde, como se pidió. Tenía UNA fuente y de rebote, dentro
de qtbase — apoyarse en un detalle de empaquetado de Qt deja sin nada a todo lo que
no es Qt.
3. dejavu-fonts-nerd 3.5.1 en los CUATRO perfiles: DejaVu Sans Mono parcheada con Nerd
Fonts. Lo que se midió antes de escribirla, porque cambia la forma de hacerla:
- SE AÑADE, NO REEMPLAZA, y no es prudencia: la licencia de Bitstream Vera exige que
una fuente modificada se RENOMBRE. Por eso upstream la llama «DejaVuSansM Nerd Font
Mono» — leído del name de la TTF, no supuesto. Una fuente nerdeada NO puede
responder al nombre de la original; sustituirla rompería a todo lo que pide «DejaVu
Sans Mono», empezando por foot, que ya murió una vez así.
- SÓLO LA MONOESPACIADA: upstream no publica DejaVu Sans ni Serif parcheadas, y en una
fuente de interfaz proporcional esos glifos no los pide nadie. «Todas nerdeadas» no
se puede cumplir al pie de la letra.
- SÓLO UNA DE LAS TRES VARIANTES: NerdFont / NerdFontMono / NerdFontPropo son los
mismos glifos con distinto avance. Las doce pesan 32 MB; las cuatro de Mono, 11 MB.
Se quedan las Mono, que son las correctas para una rejilla de terminal. Referencia:
la familia DejaVu ENTERA son 9,8 MB.
⚠ EL NÚMERO DEL .conf ESTÁ MEDIDO, NO ELEGIDO. fontconfig carga conf.d en orden
alfabético y el <prefer> que llega antes gana. Con 60-nerd-monospace.conf —que ordena
después de 60-latin.conf, que ya prefiere Noto/DejaVu/Inconsolata— `fc-match
monospace` seguía dando DejaVu Sans Mono: la conf estaba INSTALADA Y ERA INERTE, el
mismo modo de fallar que el plugin ALSA de PipeWire. A 59- gana. 45-latin.conf también
menciona monospace pero usa <default>, no <prefer>, así que no compite.
⚠ Y strip_components = 0, que tampoco es cosmético: el tarball de nerd-fonts es PLANO
y con el default de 1 el árbol de fuentes queda VACÍO — el build no se detiene ahí,
sigue y falla más tarde en el cp, con un mensaje que no menciona la extracción.
⚠ LA LICENCIA NECESITA UNA PASADA HUMANA antes de `hammer pack`: el LICENSE.txt del
tarball cubre sólo DejaVu/Bitstream Vera y no menciona los ~10 conjuntos de iconos
importados, que tienen licencias propias (Font Awesome CC-BY-4.0, Octicons MIT,
Material OFL, Powerline MIT…). El campo dice lo DOCUMENTADO, no el conjunto real; no
se inventa una cadena SPDX. Anotado en la receta.
EVIDENCIA, contra el conf.d REAL del artefacto de fontconfig:
monospace -> DejaVuSansM Nerd Font Mono (los iconos llegan)
"DejaVu Sans Mono" -> DejaVu Sans Mono (intacta)
sans-serif -> DejaVu Sans (sin tocar)
serif -> DejaVu Serif (sin tocar)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XB2iEmxeLZgzqNfhWChrLo
Semantic delta
No definition changed: this change is text, documentation or data.
11 files · +380 −127
- docs/state/build-state-cosmic.json +34 −11
- docs/state/build-state-gnome.json +45 −23
- docs/state/build-state-kde.json +37 −12
- docs/state/build-state-wlr.json +33 −10
- docs/state/build-state.json +45 −5
- docs/state/targets.toml +40 −0
- recipes/dejavu-fonts-nerd.toml +111 −0
- recipes/dejavu-fonts.toml +35 −0
- recipes/incoming-cosmic/dejavu-fonts.toml +0 −22
- recipes/incoming-kde/dejavu-fonts.toml +0 −22
- recipes/incoming-wlr/dejavu-fonts.toml +0 −22
diff --git a/docs/state/build-state-cosmic.json b/docs/state/build-state-cosmic.json
index f20808c9..e3dd542e 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": 854,
- "nodes": 855,
- "sealed": 854,
+ "recipes": 855,
+ "nodes": 856,
+ "sealed": 855,
"ajeno": 1
},
"by_class": {
"ajeno": 1,
- "c": 201,
+ "c": 202,
"go": 362,
"gui": 35,
"kernel": 6,
@@ -17,11 +17,11 @@
"debt_by_class": {},
"by_queue": {
"corpus": {
- "sealed": 815,
+ "sealed": 817,
"ajeno": 1
},
"incoming-cosmic": {
- "sealed": 39
+ "sealed": 38
}
},
"by_profile": {
@@ -36,9 +36,9 @@
"sealed": 75
},
"escritorio-cosmic": {
- "raices": 37,
- "clausura": 131,
- "sealed": 131
+ "raices": 38,
+ "clausura": 132,
+ "sealed": 132
},
"escritorio-mirada": {
"raices": 14,
@@ -3263,13 +3263,36 @@
"compiler": "zig-cc",
"deps": [],
"cls": "c",
- "queue": "incoming-cosmic",
+ "queue": "corpus",
"hash": "b3:5b3a5df3d75586315f4371f05be021a58ee31d5f664b4253957a35a6c7b95d71",
"state": "sealed",
"blocked_by": [],
"unblocks": 0,
"perfiles": [
- "escritorio-cosmic"
+ "escritorio-cosmic",
+ "escritorio-gnome",
+ "escritorio-kde",
+ "escritorio-sway"
+ ],
+ "dependientes_total": 0
+ },
+ "dejavu-fonts-nerd": {
+ "iname": "dejavu-fonts-nerd",
+ "version": "3.5.1",
+ "link": "dynamic",
+ "compiler": "zig-cc",
+ "deps": [],
+ "cls": "c",
+ "queue": "corpus",
+ "hash": "b3:387cf391f09cec628088845dadd94a5268e61acbd1c04dcc12c1a035c4d4d591",
+ "state": "sealed",
+ "blocked_by": [],
+ "unblocks": 0,
+ "perfiles": [
+ "escritorio-cosmic",
+ "escritorio-gnome",
+ "escritorio-kde",
+ "escritorio-sway"
],
"dependientes_total": 0
},
diff --git a/docs/state/build-state-gnome.json b/docs/state/build-state-gnome.json
index be070a81..604e0686 100644
--- a/docs/state/build-state-gnome.json
+++ b/docs/state/build-state-gnome.json
@@ -1,30 +1,27 @@
{
"schema": "hammer-build-state/1",
"totals": {
- "recipes": 880,
- "nodes": 882,
- "sealed": 880,
- "ajeno": 1,
- "wanted": 1
+ "recipes": 882,
+ "nodes": 883,
+ "sealed": 882,
+ "ajeno": 1
},
"by_class": {
"ajeno": 1,
- "c": 240,
+ "c": 242,
"go": 362,
"gui": 42,
"kernel": 6,
- "rust": 230,
- "wanted": 1
+ "rust": 230
},
"debt_by_class": {},
"by_queue": {
"corpus": {
- "sealed": 806,
+ "sealed": 808,
"ajeno": 1
},
"incoming-gnome": {
- "sealed": 74,
- "wanted": 1
+ "sealed": 74
}
},
"by_profile": {
@@ -39,9 +36,9 @@
"sealed": 74
},
"escritorio-gnome": {
- "raices": 14,
- "clausura": 148,
- "sealed": 148
+ "raices": 15,
+ "clausura": 150,
+ "sealed": 150
},
"escritorio-mirada": {
"raices": 14,
@@ -49,7 +46,7 @@
"sealed": 33
}
},
- "sin_perfil": 662,
+ "sin_perfil": 661,
"orphan_deps": [],
"topo_ok": true,
"nodes": {
@@ -2968,17 +2965,42 @@
},
"dejavu-fonts": {
"iname": "dejavu-fonts",
- "version": null,
- "link": null,
- "compiler": null,
+ "version": "2.37",
+ "link": "dynamic",
+ "compiler": "zig-cc",
"deps": [],
- "cls": "wanted",
- "queue": "incoming-gnome",
- "hash": null,
- "state": "wanted",
+ "cls": "c",
+ "queue": "corpus",
+ "hash": "b3:5b3a5df3d75586315f4371f05be021a58ee31d5f664b4253957a35a6c7b95d71",
+ "state": "sealed",
"blocked_by": [],
"unblocks": 0,
- "perfiles": [],
+ "perfiles": [
+ "escritorio-cosmic",
+ "escritorio-gnome",
+ "escritorio-kde",
+ "escritorio-sway"
+ ],
+ "dependientes_total": 0
+ },
+ "dejavu-fonts-nerd": {
+ "iname": "dejavu-fonts-nerd",
+ "version": "3.5.1",
+ "link": "dynamic",
+ "compiler": "zig-cc",
+ "deps": [],
+ "cls": "c",
+ "queue": "corpus",
+ "hash": "b3:387cf391f09cec628088845dadd94a5268e61acbd1c04dcc12c1a035c4d4d591",
+ "state": "sealed",
+ "blocked_by": [],
+ "unblocks": 0,
+ "perfiles": [
+ "escritorio-cosmic",
+ "escritorio-gnome",
+ "escritorio-kde",
+ "escritorio-sway"
+ ],
"dependientes_total": 0
},
"delta": {
diff --git a/docs/state/build-state-kde.json b/docs/state/build-state-kde.json
index a4f471a1..006ba4d6 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": 997,
- "nodes": 998,
- "sealed": 997,
+ "recipes": 998,
+ "nodes": 999,
+ "sealed": 998,
"ajeno": 1
},
"by_class": {
"ajeno": 1,
- "c": 362,
+ "c": 363,
"go": 362,
"gui": 38,
"kernel": 6,
@@ -17,10 +17,10 @@
"debt_by_class": {},
"by_queue": {
"corpus": {
- "sealed": 799
+ "sealed": 801
},
"incoming-kde": {
- "sealed": 198,
+ "sealed": 197,
"ajeno": 1
}
},
@@ -36,9 +36,9 @@
"sealed": 70
},
"escritorio-kde": {
- "raices": 16,
- "clausura": 197,
- "sealed": 196,
+ "raices": 18,
+ "clausura": 199,
+ "sealed": 198,
"ajeno": 1
},
"escritorio-mirada": {
@@ -47,7 +47,7 @@
"sealed": 29
}
},
- "sin_perfil": 706,
+ "sin_perfil": 705,
"orphan_deps": [],
"topo_ok": true,
"nodes": {
@@ -3030,12 +3030,37 @@
"compiler": "zig-cc",
"deps": [],
"cls": "c",
- "queue": "incoming-kde",
+ "queue": "corpus",
"hash": "b3:5b3a5df3d75586315f4371f05be021a58ee31d5f664b4253957a35a6c7b95d71",
"state": "sealed",
"blocked_by": [],
"unblocks": 0,
- "perfiles": [],
+ "perfiles": [
+ "escritorio-cosmic",
+ "escritorio-gnome",
+ "escritorio-kde",
+ "escritorio-sway"
+ ],
+ "dependientes_total": 0
+ },
+ "dejavu-fonts-nerd": {
+ "iname": "dejavu-fonts-nerd",
+ "version": "3.5.1",
+ "link": "dynamic",
+ "compiler": "zig-cc",
+ "deps": [],
+ "cls": "c",
+ "queue": "corpus",
+ "hash": "b3:387cf391f09cec628088845dadd94a5268e61acbd1c04dcc12c1a035c4d4d591",
+ "state": "sealed",
+ "blocked_by": [],
+ "unblocks": 0,
+ "perfiles": [
+ "escritorio-cosmic",
+ "escritorio-gnome",
+ "escritorio-kde",
+ "escritorio-sway"
+ ],
"dependientes_total": 0
},
"delta": {
diff --git a/docs/state/build-state-wlr.json b/docs/state/build-state-wlr.json
index 4505b452..90736838 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": 831,
- "nodes": 832,
- "sealed": 831,
+ "recipes": 832,
+ "nodes": 833,
+ "sealed": 832,
"ajeno": 1
},
"by_class": {
"ajeno": 1,
- "c": 199,
+ "c": 200,
"go": 362,
"gui": 35,
"kernel": 6,
@@ -17,11 +17,11 @@
"debt_by_class": {},
"by_queue": {
"corpus": {
- "sealed": 816,
+ "sealed": 818,
"ajeno": 1
},
"incoming-wlr": {
- "sealed": 15
+ "sealed": 14
}
},
"by_profile": {
@@ -41,9 +41,9 @@
"sealed": 33
},
"escritorio-sway": {
- "raices": 67,
- "clausura": 170,
- "sealed": 170
+ "raices": 68,
+ "clausura": 171,
+ "sealed": 171
}
},
"sin_perfil": 645,
@@ -2797,12 +2797,35 @@
"compiler": "zig-cc",
"deps": [],
"cls": "c",
- "queue": "incoming-wlr",
+ "queue": "corpus",
"hash": "b3:5b3a5df3d75586315f4371f05be021a58ee31d5f664b4253957a35a6c7b95d71",
"state": "sealed",
"blocked_by": [],
"unblocks": 0,
"perfiles": [
+ "escritorio-cosmic",
+ "escritorio-gnome",
+ "escritorio-kde",
+ "escritorio-sway"
+ ],
+ "dependientes_total": 0
+ },
+ "dejavu-fonts-nerd": {
+ "iname": "dejavu-fonts-nerd",
+ "version": "3.5.1",
+ "link": "dynamic",
+ "compiler": "zig-cc",
+ "deps": [],
+ "cls": "c",
+ "queue": "corpus",
+ "hash": "b3:387cf391f09cec628088845dadd94a5268e61acbd1c04dcc12c1a035c4d4d591",
+ "state": "sealed",
+ "blocked_by": [],
+ "unblocks": 0,
+ "perfiles": [
+ "escritorio-cosmic",
+ "escritorio-gnome",
+ "escritorio-kde",
"escritorio-sway"
],
"dependientes_total": 0
diff --git a/docs/state/build-state.json b/docs/state/build-state.json
index 2f717eb5..77dfee0e 100644
--- a/docs/state/build-state.json
+++ b/docs/state/build-state.json
@@ -1,14 +1,14 @@
{
"schema": "hammer-build-state/1",
"totals": {
- "recipes": 817,
- "nodes": 818,
- "sealed": 817,
+ "recipes": 819,
+ "nodes": 820,
+ "sealed": 819,
"ajeno": 1
},
"by_class": {
"ajeno": 1,
- "c": 185,
+ "c": 187,
"go": 362,
"gui": 35,
"kernel": 6,
@@ -17,7 +17,7 @@
"debt_by_class": {},
"by_queue": {
"corpus": {
- "sealed": 817,
+ "sealed": 819,
"ajeno": 1
}
},
@@ -2782,6 +2782,46 @@
"perfiles": [],
"dependientes_total": 0
},
+ "dejavu-fonts": {
+ "iname": "dejavu-fonts",
+ "version": "2.37",
+ "link": "dynamic",
+ "compiler": "zig-cc",
+ "deps": [],
+ "cls": "c",
+ "queue": "corpus",
+ "hash": "b3:5b3a5df3d75586315f4371f05be021a58ee31d5f664b4253957a35a6c7b95d71",
+ "state": "sealed",
+ "blocked_by": [],
+ "unblocks": 0,
+ "perfiles": [
+ "escritorio-cosmic",
+ "escritorio-gnome",
+ "escritorio-kde",
+ "escritorio-sway"
+ ],
+ "dependientes_total": 0
+ },
+ "dejavu-fonts-nerd": {
+ "iname": "dejavu-fonts-nerd",
+ "version": "3.5.1",
+ "link": "dynamic",
+ "compiler": "zig-cc",
+ "deps": [],
+ "cls": "c",
+ "queue": "corpus",
+ "hash": "b3:387cf391f09cec628088845dadd94a5268e61acbd1c04dcc12c1a035c4d4d591",
+ "state": "sealed",
+ "blocked_by": [],
+ "unblocks": 0,
+ "perfiles": [
+ "escritorio-cosmic",
+ "escritorio-gnome",
+ "escritorio-kde",
+ "escritorio-sway"
+ ],
+ "dependientes_total": 0
+ },
"delta": {
"iname": "delta",
"version": "0.19.2",
diff --git a/docs/state/targets.toml b/docs/state/targets.toml
index 80f4c427..4a5340db 100644
--- a/docs/state/targets.toml
+++ b/docs/state/targets.toml
@@ -63,6 +63,22 @@ paquetes = [
# roto: sin tipos de fichero, sin apps X11, sin diálogos de autorización y con los controles QML
# en un estilo genérico. Ver docs/state/frontera-triaje.toml para el porqué de cada uno.
"shared-mime-info", "xwayland", "polkit-qt-1", "qqc2-breeze-style",
+ # ── FUENTES ──────────────────────────────────────────────────────────────────────────────────
+ # Añadida el 2026-09-03 por el mismo recuento que destapó el hueco de GNOME: contando
+ # `.ttf/.otf/.ttc/.pfb` sobre los artefactos del cierre, este perfil tenía **UNA sola**, y de
+ # rebote — viene dentro de `qtbase`, no porque nadie la haya pedido. `fontconfig` estaba, pero
+ # fontconfig es el MOTOR que busca fuentes, no una fuente.
+ # Depender de la que trae qtbase es apoyarse en un detalle de empaquetado de Qt que puede
+ # desaparecer en cualquier versión, y encima deja a todo lo que NO es Qt sin nada.
+ "dejavu-fonts",
+ # `dejavu-fonts-nerd` es la MISMA DejaVu Sans Mono parcheada con Nerd Fonts (~10.000 glifos de
+ # iconos: Powerline, Font Awesome, Devicons…) que usan starship, lsd, eza, neovim y las
+ # statuslines; sin ellos dibujan cuadraditos. Se AÑADE, no reemplaza: la licencia de Bitstream
+ # Vera obliga a renombrar una fuente modificada, así que la parcheada se llama
+ # «DejaVuSansM Nerd Font Mono» y NO puede responder a «DejaVu Sans Mono» — sustituirla rompería
+ # a todo lo que la pide por nombre, empezando por foot. Se enchufa por fontconfig: su
+ # `59-nerd-monospace.conf` hace que el alias `monospace` la prefiera. Ver su receta.
+ "dejavu-fonts-nerd",
# ⚠ `xwayland` sigue acá como RAÍZ pero su receta NO se va a escribir: lo provee una imagen ajena
# enjaulada, declarado en ../state/qorpa-ajenos.toml (ADR 0015 D5 capa 3, qorpa). El Xwayland vive
# DENTRO de la imagen —Arch y Fedora ya lo traen y se cuelga de kwin por el socket— así que el
@@ -196,6 +212,14 @@ paquetes = [
# de rebote, dentro de qtbase) es un hallazgo aparte y NO se toca acá: ese perfil no lleva zathura
# y su árbol lo está trabajando otro frente.
"dejavu-fonts",
+ # `dejavu-fonts-nerd` es la MISMA DejaVu Sans Mono parcheada con Nerd Fonts (~10.000 glifos de
+ # iconos: Powerline, Font Awesome, Devicons…) que usan starship, lsd, eza, neovim y las
+ # statuslines; sin ellos dibujan cuadraditos. Se AÑADE, no reemplaza: la licencia de Bitstream
+ # Vera obliga a renombrar una fuente modificada, así que la parcheada se llama
+ # «DejaVuSansM Nerd Font Mono» y NO puede responder a «DejaVu Sans Mono» — sustituirla rompería
+ # a todo lo que la pide por nombre, empezando por foot. Se enchufa por fontconfig: su
+ # `59-nerd-monospace.conf` hace que el alias `monospace` la prefiera. Ver su receta.
+ "dejavu-fonts-nerd",
"expat-shared", "libffi-shared", "bzip2-shared",
]
@@ -266,6 +290,14 @@ paquetes = [
# tipografía. Ninguno es dep de build de nadie y sin ellos el escritorio arranca roto — sin puntero,
# sin teclado o con tofu.
"cosmic-icons", "hicolor-icon-theme", "xkeyboard-config", "dejavu-fonts",
+ # `dejavu-fonts-nerd` es la MISMA DejaVu Sans Mono parcheada con Nerd Fonts (~10.000 glifos de
+ # iconos: Powerline, Font Awesome, Devicons…) que usan starship, lsd, eza, neovim y las
+ # statuslines; sin ellos dibujan cuadraditos. Se AÑADE, no reemplaza: la licencia de Bitstream
+ # Vera obliga a renombrar una fuente modificada, así que la parcheada se llama
+ # «DejaVuSansM Nerd Font Mono» y NO puede responder a «DejaVu Sans Mono» — sustituirla rompería
+ # a todo lo que la pide por nombre, empezando por foot. Se enchufa por fontconfig: su
+ # `59-nerd-monospace.conf` hace que el alias `monospace` la prefiera. Ver su receta.
+ "dejavu-fonts-nerd",
# Lo que `start-cosmic` ejecuta y ningún `[deps]` pide: bash de verdad y el bus de sesión.
"bash", "dbus",
# ── LA PRIMERA APP DE USUARIO FINAL QUE COMPARTEN LOS CUATRO ESCRITORIOS ──────────────────────
@@ -351,6 +383,14 @@ paquetes = [
# Ninguna receta depende de una fuente ni de un mapa de teclado para COMPILAR, de modo que la
# clausura no puede alcanzarlos por más aristas que siga. Si no están acá, no están.
"dejavu-fonts", # sin UNA fuente, foot muere con «monospace::size=8: failed to match font»
+ # `dejavu-fonts-nerd` es la MISMA DejaVu Sans Mono parcheada con Nerd Fonts (~10.000 glifos de
+ # iconos: Powerline, Font Awesome, Devicons…) que usan starship, lsd, eza, neovim y las
+ # statuslines; sin ellos dibujan cuadraditos. Se AÑADE, no reemplaza: la licencia de Bitstream
+ # Vera obliga a renombrar una fuente modificada, así que la parcheada se llama
+ # «DejaVuSansM Nerd Font Mono» y NO puede responder a «DejaVu Sans Mono» — sustituirla rompería
+ # a todo lo que la pide por nombre, empezando por foot. Se enchufa por fontconfig: su
+ # `59-nerd-monospace.conf` hace que el alias `monospace` la prefiera. Ver su receta.
+ "dejavu-fonts-nerd",
"xkeyboard-config", # sin datos XKB: «xkbcommon: ERROR: failed to add default include path
# /usr/share/X11/xkb», y sway no completa el seat
# ── LAS TRES `.so` QUE sway PIDE Y EL CORPUS SÓLO PRODUCE COMO `.a` ─────────────────────────
diff --git a/recipes/dejavu-fonts-nerd.toml b/recipes/dejavu-fonts-nerd.toml
new file mode 100644
index 00000000..e8579987
--- /dev/null
+++ b/recipes/dejavu-fonts-nerd.toml
@@ -0,0 +1,111 @@
+# dejavu-fonts-nerd 3.5.1 — DejaVu Sans Mono parcheada con Nerd Fonts: ~10.000 glifos de iconos
+# (Powerline, Font Awesome, Devicons, Material, Octicons, Weather…) que usan starship, lsd, eza,
+# neovim, las statuslines y media herramienta moderna de terminal. Sin ellos esas apps dibujan
+# cuadraditos.
+#
+# ══ SE AÑADE, NO REEMPLAZA — Y NO ES PRUDENCIA, ES LA LICENCIA ═════════════════════════════════
+# La tentación es «cambiemos DejaVu por la nerdeada y listo». No se puede, y el motivo está en el
+# `LICENSE.txt` del propio tarball: la licencia de Bitstream Vera dice que una fuente modificada
+# **sólo puede distribuirse SI SE LA RENOMBRA**. Por eso upstream la llama `DejaVuSansM Nerd Font`
+# y no `DejaVu Sans Mono` — leído en el `name` de la TTF, no supuesto:
+#
+# familia(1) = DejaVuSansM Nerd Font Mono postscript(6) = DejaVuSansMNFM
+#
+# ⇒ **una fuente nerdeada NO puede responder al nombre de la original.** Si se sustituyera, todo lo
+# que pide «DejaVu Sans Mono» por nombre dejaría de encontrarla, empezando por `foot`, que ya murió
+# una vez con `monospace::size=8: failed to match font` (ver el perfil `escritorio-sway`).
+# Por eso conviven: `dejavu-fonts` sigue siendo la familia con su nombre de siempre, y ésta se
+# enchufa por fontconfig, que es el mecanismo que existe justamente para esto.
+#
+# ══ SÓLO LA MONOESPACIADA, Y SÓLO UNA DE LAS TRES VARIANTES ════════════════════════════════════
+# «Que todas las fuentes estén nerdeadas» no se puede cumplir al pie de la letra y conviene saber
+# por qué: **upstream sólo publica parcheada la MONOESPACIADA**. No existe una DejaVu Sans ni una
+# DejaVu Serif con iconos, y tampoco tendría sentido — los glifos de Nerd Fonts son para terminal,
+# editor y statusline; en una fuente de interfaz proporcional no los pide nadie.
+#
+# Y de la mono, el tarball trae TRES variantes que son los mismos glifos con distinto ancho de
+# avance de los iconos: `NerdFont` (doble ancho), `NerdFontMono` (ancho simple) y `NerdFontPropo`
+# (proporcional). Instalar las doce cuesta **32 MB**; instalar sólo las cuatro de `NerdFontMono`
+# cuesta **11 MB**. Se quedan las `Mono`, que son las correctas para una rejilla de terminal —
+# un icono de doble ancho descuadra la cuadrícula. Para comparar: la familia DejaVu ENTERA
+# (Sans + Serif + Mono, 22 ficheros) son 9,8 MB.
+#
+# ══ ⚠ LA LICENCIA NECESITA UNA PASADA HUMANA ANTES DE `hammer pack` ════════════════════════════
+# El `LICENSE.txt` que viene en el tarball cubre **sólo DejaVu/Bitstream Vera** y no dice ni una
+# palabra de los ~10 conjuntos de iconos IMPORTADOS, que tienen licencias propias y distintas
+# (Font Awesome es CC-BY-4.0, Octicons MIT, Material Design Icons OFL, Powerline MIT…). O sea que
+# el artefacto es un derivado multi-licencia y el fichero que lo acompaña lo subrepresenta.
+# El campo de abajo dice lo que está DOCUMENTADO en la fuente, no el conjunto real, y por eso se
+# deja anotado acá en vez de inventar una cadena SPDX: el campo `license` NO SE ADIVINA (y está
+# fuera de `hash_inputs`, así que corregirlo después no re-hashea nada).
+#
+# ══ CÓMO SE ENCHUFA: fontconfig, no renombrado ═════════════════════════════════════════════════
+# Se instala un `/etc/fonts/conf.d/59-nerd-monospace.conf` que hace que el alias `monospace`
+# PREFIERA la nerd. `fonts.conf` incluye `conf.d` (leído del artefacto de fontconfig, no supuesto).
+# Efecto: las terminales y todo lo que pide «monospace» —que es lo normal— se llevan los iconos,
+# y quien pida «DejaVu Sans Mono» por nombre sigue recibiendo la original, intacta.
+#
+# ⚠ **EL NÚMERO 59 ESTÁ MEDIDO, NO ELEGIDO.** fontconfig carga `conf.d` en orden alfabético y un
+# `<prefer>` que llega ANTES gana la cabeza de la lista. El fontconfig de esta distro trae
+# `60-latin.conf`, que ya prefiere `Noto Sans Mono, DejaVu Sans Mono, Inconsolata…` para
+# `monospace`. Con el fichero en `60-nerd-monospace.conf` —que ordena DESPUÉS de `60-latin.conf`—
+# `fc-match monospace` seguía devolviendo `DejaVu Sans Mono`: la conf estaba instalada y era
+# INERTE. Comprobado montando el `conf.d` real del artefacto de fontconfig y corriendo `fc-match`:
+#
+# 60-nerd-monospace.conf → DejaVu Sans Mono (pierde)
+# 59-nerd-monospace.conf → DejaVuSansM Nerd Font Mono (gana)
+#
+# `45-latin.conf` también menciona monospace pero usa `<default>`, no `<prefer>`, así que no compite.
+# Es el mismo modo de fallar que el plugin de PipeWire para ALSA: instalado y sin que lo use nadie.
+name = "dejavu-fonts-nerd"
+version = "3.5.1"
+# Sólo lo documentado en el LICENSE.txt del tarball. Ver el ⚠ de arriba: el conjunto real incluye
+# las licencias de los iconos importados, que upstream no enumera.
+license = "Bitstream-Vera"
+
+[source]
+tarball = "https://github.com/ryanoasis/nerd-fonts/releases/download/v3.5.1/DejaVuSansMono.tar.xz"
+sha256 = "9d3f2d60faa790b101903c2984b89c11397fc63b9ce43f2dcd25ffed4fb44e5f"
+# ⚠ `strip_components = 0` NO ES COSMÉTICO. El default de hammer es 1, pensado para el tarball
+# normal que extrae a `<nombre>-<version>/`. **Éste es PLANO**: los `.ttf` están en la raíz del
+# archivo, sin directorio contenedor. Con el default, `tar --strip-components 1` se come el único
+# nivel que hay y **el árbol de fuentes queda VACÍO** — y el build no se detiene ahí: sigue a las
+# fases y falla más tarde, en el `cp`, con un mensaje que no menciona la extracción. Es la misma
+# figura de siempre: el vacío se lee como presencia hasta que algo tropieza con él.
+strip_components = 0
+
+[build]
+compiler = "zig-cc"
+target = "x86_64-linux-musl"
+link = "dynamic"
+
+[build.phases]
+configure = "true"
+compile = "true"
+install = '''
+set -e
+mkdir -p /out/usr/share/fonts/dejavu-nerd /out/etc/fonts/conf.d
+# Sólo la variante Mono: ver la cabecera (las otras dos son los mismos glifos con otro avance).
+cp DejaVuSansMNerdFontMono-*.ttf /out/usr/share/fonts/dejavu-nerd/
+cp LICENSE.txt /out/usr/share/fonts/dejavu-nerd/
+cat > /out/etc/fonts/conf.d/59-nerd-monospace.conf <<'CONF'
+<?xml version="1.0"?>
+<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
+<!-- Hace que `monospace` prefiera la DejaVu parcheada con Nerd Fonts, para que las terminales y
+ las apps de TUI tengan los glifos de iconos. NO renombra ni sustituye: quien pida
+ «DejaVu Sans Mono» por nombre sigue recibiendo la original. Ver recipes/dejavu-fonts-nerd.toml -->
+<fontconfig>
+ <alias>
+ <family>monospace</family>
+ <prefer><family>DejaVuSansM Nerd Font Mono</family></prefer>
+ </alias>
+</fontconfig>
+CONF
+# Un `cp` que no copia nada sale 0 si el glob no casa y el artefacto queda VACÍO: se comprueba.
+test "$(ls /out/usr/share/fonts/dejavu-nerd/*.ttf | wc -l)" = "4" || {
+ echo "ERROR: se esperaban 4 TTF de la variante Mono" >&2; ls -l /out/usr/share/fonts/dejavu-nerd >&2; exit 1
+}
+'''
+
+[deps]
+build = []
diff --git a/recipes/dejavu-fonts.toml b/recipes/dejavu-fonts.toml
new file mode 100644
index 00000000..7dfd0b71
--- /dev/null
+++ b/recipes/dejavu-fonts.toml
@@ -0,0 +1,35 @@
+# dejavu-fonts 2.37 — PROMOVIDA AL CORPUS el 2026-09-03. Antes existían TRES copias idénticas
+# (incoming-kde, incoming-wlr, incoming-cosmic) y ninguna en el corpus.
+#
+# ══ POR QUÉ SUBE, Y EL BUG QUE LO OBLIGÓ ═══════════════════════════════════════════════════════
+# Al descubrir que `escritorio-gnome` no traía NI UN fichero de fuente se la añadió de raíz a ese
+# perfil… y quedó como nodo **`wanted`**: `incoming-gnome` no tiene esta receta y el corpus tampoco,
+# y una receta no alcanza una cola hermana. O sea que la raíz no resolvía a nada y la imagen seguía
+# sin fuentes. **`wanted` no es `debt`**, así que `drenaje.json` seguía diciendo deuda=0 — el hueco
+# no salía por ninguna métrica. Se vio mirando el nodo en `build-state-gnome.json`.
+#
+# La promoción es GRATIS: las tres copias sellaban el MISMO ArtifactHash (b3:5b3a5df3) y sus
+# `[deps]` están vacías, así que resuelve igual desde cualquier lado. Las tres copias de cola se
+# jubilan en el mismo movimiento: con `[deps] = []` no hay nada que pueda cambiar de resolución.
+#
+# Data-only: copia los .ttf a /usr/share/fonts. 22 ficheros, 9,8 MB — Sans, Serif y Sans Mono.
+name = "dejavu-fonts"
+version = "2.37"
+license = "MIT"
+
+[source]
+tarball = "https://github.com/dejavu-fonts/dejavu-fonts/releases/download/version_2_37/dejavu-fonts-ttf-2.37.tar.bz2"
+sha256 = "fa9ca4d13871dd122f61258a80d01751d603b4d3ee14095d65453b4e846e17d7"
+
+[build]
+compiler = "zig-cc"
+target = "x86_64-linux-musl"
+link = "dynamic"
+
+[build.phases]
+configure = "true"
+compile = "true"
+install = "mkdir -p /out/usr/share/fonts/dejavu && cp ttf/*.ttf /out/usr/share/fonts/dejavu/"
+
+[deps]
+build = []
diff --git a/recipes/incoming-cosmic/dejavu-fonts.toml b/recipes/incoming-cosmic/dejavu-fonts.toml
deleted file mode 100644
index 4522df39..00000000
--- a/recipes/incoming-cosmic/dejavu-fonts.toml
+++ /dev/null
@@ -1,22 +0,0 @@
-# dejavu-fonts 2.37 — fuentes TTF. Qt ya no trae fuentes ("QFontDatabase: Cannot find font directory");
-# sin ellas el escritorio renderiza sin texto legible. Data-only: copia los .ttf a /usr/share/fonts.
-name = "dejavu-fonts"
-version = "2.37"
-license = "MIT"
-
-[source]
-tarball = "https://github.com/dejavu-fonts/dejavu-fonts/releases/download/version_2_37/dejavu-fonts-ttf-2.37.tar.bz2"
-sha256 = "fa9ca4d13871dd122f61258a80d01751d603b4d3ee14095d65453b4e846e17d7"
-
-[build]
-compiler = "zig-cc"
-target = "x86_64-linux-musl"
-link = "dynamic"
-
-[build.phases]
-configure = "true"
-compile = "true"
-install = "mkdir -p /out/usr/share/fonts/dejavu && cp ttf/*.ttf /out/usr/share/fonts/dejavu/"
-
-[deps]
-build = []
diff --git a/recipes/incoming-kde/dejavu-fonts.toml b/recipes/incoming-kde/dejavu-fonts.toml
deleted file mode 100644
index 4522df39..00000000
--- a/recipes/incoming-kde/dejavu-fonts.toml
+++ /dev/null
@@ -1,22 +0,0 @@
-# dejavu-fonts 2.37 — fuentes TTF. Qt ya no trae fuentes ("QFontDatabase: Cannot find font directory");
-# sin ellas el escritorio renderiza sin texto legible. Data-only: copia los .ttf a /usr/share/fonts.
-name = "dejavu-fonts"
-version = "2.37"
-license = "MIT"
-
-[source]
-tarball = "https://github.com/dejavu-fonts/dejavu-fonts/releases/download/version_2_37/dejavu-fonts-ttf-2.37.tar.bz2"
-sha256 = "fa9ca4d13871dd122f61258a80d01751d603b4d3ee14095d65453b4e846e17d7"
-
-[build]
-compiler = "zig-cc"
-target = "x86_64-linux-musl"
-link = "dynamic"
-
-[build.phases]
-configure = "true"
-compile = "true"
-install = "mkdir -p /out/usr/share/fonts/dejavu && cp ttf/*.ttf /out/usr/share/fonts/dejavu/"
-
-[deps]
-build = []
diff --git a/recipes/incoming-wlr/dejavu-fonts.toml b/recipes/incoming-wlr/dejavu-fonts.toml
deleted file mode 100644
index 4522df39..00000000
--- a/recipes/incoming-wlr/dejavu-fonts.toml
+++ /dev/null
@@ -1,22 +0,0 @@
-# dejavu-fonts 2.37 — fuentes TTF. Qt ya no trae fuentes ("QFontDatabase: Cannot find font directory");
-# sin ellas el escritorio renderiza sin texto legible. Data-only: copia los .ttf a /usr/share/fonts.
-name = "dejavu-fonts"
-version = "2.37"
-license = "MIT"
-
-[source]
-tarball = "https://github.com/dejavu-fonts/dejavu-fonts/releases/download/version_2_37/dejavu-fonts-ttf-2.37.tar.bz2"
-sha256 = "fa9ca4d13871dd122f61258a80d01751d603b4d3ee14095d65453b4e846e17d7"
-
-[build]
-compiler = "zig-cc"
-target = "x86_64-linux-musl"
-link = "dynamic"
-
-[build.phases]
-configure = "true"
-compile = "true"
-install = "mkdir -p /out/usr/share/fonts/dejavu && cp ttf/*.ttf /out/usr/share/fonts/dejavu/"
-
-[deps]
-build = []