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 1572Shell 203Rust 109Markdown 993728 Definiciones

gnome-text-editor: el censo decía 2 recetas y son 7, y la mitad es para que el corrector NO sea decorativo

El seed listaba `editorconfig-core-c` y `libspelling`. Leídas las fuentes, faltaban cinco más, y
cada una por una razón distinta:

· `gtksourceview` (SOMBRA) — la del corpus es del mundo estático (`--prefer-static`,
  `libgtksourceview-5.a`, ni un .so, medido sobre el store) y está enlazada contra el gtk4
  CANÓNICO. Montarla dentro de libspelling.so metería un segundo GTK4 y un segundo GLib en el
  proceso: el SIGSEGV del keystone. Misma explicación y mismo remedio que libadwaita.

· `hunspell` + `hunspell-en` + `enchant` — la cadena del corrector ortográfico, entera y no a
  medias. libspelling construye igual sin enchant: compila `spelling-empty-provider.c` y expone un
  proveedor VACÍO, mientras el editor sigue mostrando su preferencia «spellcheck»
  (editor-preferences-dialog.ui:112) que el usuario puede encender sin efecto. Es la papelera
  dibujada de nautilus otra vez. Y sin diccionarios, el motor tampoco sirve: la lista de idiomas
  sale vacía.

  ⚠ `hunspell-en` descarga 110 MB (el tarball de LibreOffice/dictionaries, ~90 idiomas) para
  instalar ~1 MB (en_US y en_GB). Se eligió igual: el fetcher de takana extrae con tar y no sabe de
  .zip —que es como publica SourceForge los 200 KB del en_US—, el de Debian es de 2007, y el de
  LibreOffice es el upstream canónico, etiquetado por release. Se paga UNA vez y añadir otro idioma
  (el castellano, por ejemplo) es una línea sin descargar nada nuevo.

· `editorconfig-core-c` — el parser de .editorconfig. `src/editorconfig/` del editor no es una copia
  vendorizada del parser, como parece: es sólo el pegamento GObject, y pide `dependency('editorconfig')`.

Lo que queda escrito como hueco: sólo hay diccionarios en inglés.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

0879d2eaf97f670471fddf6453d7167641667117 · por Sergio · (hace 29 d) · padre 563fd0efd · ver el árbol en este commit

Delta semántico

Ninguna definición cambió: el cambio es de texto, documentación o datos.

7 archivos · +345 −0

diff --git a/recipes/incoming-gnome/editorconfig-core-c.toml b/recipes/incoming-gnome/editorconfig-core-c.toml
new file mode 100644
index 00000000..2ed495d1
--- /dev/null
+++ b/recipes/incoming-gnome/editorconfig-core-c.toml
@@ -0,0 +1,37 @@
+# editorconfig-core-c 0.12.11 — el parser de ficheros `.editorconfig`: el estándar con el que un
+# repositorio le dice al editor «acá se indenta con 4 espacios y los ficheros terminan en newline».
+#
+# La pide `gnome-text-editor` a través de su propio pegamento: `src/editorconfig/meson.build:1` hace
+# `dependency('editorconfig')` —la librería de verdad— y encima pone `editorconfig-glib.c`, que la
+# envuelve en GObject. O sea que el subdirectorio `src/editorconfig/` del editor NO es una copia
+# vendorizada del parser, como parece de lejos: es la capa de arriba, y la de abajo es esta receta.
+#
+# ── POR QUÉ IMPORTA MÁS DE LO QUE PARECE ───────────────────────────────────────────────────────
+# Sin esto, el editor abre cualquier fichero del repo con SUS ajustes, no con los del proyecto. En
+# un árbol donde otros agentes y el usuario editan los mismos ficheros —que es exactamente este
+# repo— un editor que no respeta el `.editorconfig` mete diffs de espacios en blanco que nadie pidió.
+#
+# CMake, y el enlace es dinámico: `src/lib/CMakeLists.txt` construye `editorconfig_shared` y
+# `editorconfig_static` por separado; al consumidor lo alcanza la `.so` por el `.pc`.
+# `pcre2` es su única dep real (`target_link_libraries(editorconfig_shared ${PCRE2_LIBRARIES})`),
+# y ya está sellada en el corpus.
+name    = "editorconfig-core-c"
+version = "0.12.11"
+license = "BSD-2-Clause"
+
+[source]
+tarball = "https://github.com/editorconfig/editorconfig-core-c/archive/refs/tags/v0.12.11.tar.gz"
+sha256  = "9d8b420b56a969ea3cf784861c72d26fa0e158fa1494d732df2c8a1480d36a5c"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "dynamic"
+
+[build.phases]
+configure = "PKG_CONFIG_PATH=/usr/lib/pkgconfig cmake -S . -B output -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_INSTALL_LIBDIR=lib -DBUILD_DOCUMENTATION=OFF -DBUILD_TESTING=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON"
+compile   = 'cmake --build output -j"$(nproc)"'
+install   = 'DESTDIR=/out cmake --install output'
+
+[deps]
+build = ["cmake", "make", "pkgconf", "pcre2"]
diff --git a/recipes/incoming-gnome/enchant.toml b/recipes/incoming-gnome/enchant.toml
new file mode 100644
index 00000000..ba6c1758
--- /dev/null
+++ b/recipes/incoming-gnome/enchant.toml
@@ -0,0 +1,46 @@
+# enchant 2.8.2 — el intermediario entre las aplicaciones y los correctores ortográficos. No corrige
+# nada por sí mismo: elige proveedor (hunspell, nuspell, aspell…), encuentra los diccionarios y
+# expone una API única. Es lo que `libspelling` —y con ella `gnome-text-editor`— sabe hablar.
+#
+# ── EL ESLABÓN DEL MEDIO, Y POR QUÉ LOS TRES VAN JUNTOS ────────────────────────────────────────
+#     hunspell      el motor          ← corrige, pero no sabe dónde están los diccionarios de GNOME
+#     hunspell-en   los datos         ← sin esto la lista de idiomas sale VACÍA
+#     enchant       el intermediario  ← lo único que libspelling sabe buscar
+# Falta cualquiera de los tres y el resultado es el mismo: el editor enseña su interruptor de
+# ortografía, el usuario lo enciende, y no pasa nada.
+#
+# ── `--with-hunspell` EXPLÍCITO, y no es adorno ────────────────────────────────────────────────
+# `configure.ac:183-200` declara SEIS proveedores (hunspell, nuspell, aspell, hspell, voikko,
+# zemberek) y todos menos el último con `default=check`, o sea **«enciéndelo si lo encuentras»**.
+# Con eso el artefacto dependería de qué hubiera en el sysroot el día del build — el mismo problema
+# que `-Dunicode_support=auto` en tinysparql. Se pide hunspell y se niegan los otros cinco por
+# nombre, que es la única forma de que dos builds de esta receta produzcan lo mismo.
+#
+# ⚠ `--with-hunspell` es del tipo pkg-config (`ENCHANT_CHECK_PKG_CONFIG_PROVIDER`): busca
+# `hunspell.pc`, y si no lo encuentra **falla el configure** en vez de seguir sin proveedor. Eso es
+# lo que se quiere: un enchant sin proveedores construye igual y no corrige nada.
+#
+# ⚠ ES C++ (su núcleo lo es desde la 2.x) y se construye con `zig c++`, igual que hunspell ⇒ los dos
+# comparten libc++. Ver [[cxx-runtime-debe-coincidir]].
+name    = "enchant"
+version = "2.8.2"
+license = "LGPL-2.1-or-later"
+
+[source]
+tarball = "https://github.com/AbiWord/enchant/releases/download/v2.8.2/enchant-2.8.2.tar.gz"
+sha256  = "8f19535adb5577b83b00e02f330fe9b9eb40dd21f19e2899636fc4d3a7696375"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "dynamic"
+
+[build.phases]
+configure = "CFLAGS='-O2 -fPIC' CXXFLAGS='-O2 -fPIC' PKG_CONFIG_PATH=/usr/lib/pkgconfig ./configure --build=$CBUILD --host=$CHOST --prefix=/usr --enable-shared --disable-static --with-hunspell --without-nuspell --without-aspell --without-hspell --without-voikko --without-zemberek --disable-dependency-tracking"
+compile   = 'make -j"$(nproc)"'
+install   = 'make DESTDIR=/out install'
+
+[deps]
+# glib de la isla + gmodule/gio salen del mismo paquete (`configure.ac:76` los pide juntos).
+# `hunspell` no es opcional acá: es el proveedor que esta receta enciende.
+build = ["make", "pkgconf", "glib", "hunspell", "libffi", "pcre2", "zlib-shared"]
diff --git a/recipes/incoming-gnome/gnome-text-editor.toml b/recipes/incoming-gnome/gnome-text-editor.toml
new file mode 100644
index 00000000..1001602c
--- /dev/null
+++ b/recipes/incoming-gnome/gnome-text-editor.toml
@@ -0,0 +1,61 @@
+# gnome-text-editor 48.3 — el editor de texto de GNOME: el `kate` de este escritorio, y el último
+# `wanted` que le quedaba al perfil. Un escritorio sin editor de texto es un escritorio en el que no
+# se puede tocar un fichero de configuración.
+#
+# ── SUS DEPS DURAS, con su línea ──────────────────────────────────────────────────────────────
+#     meson.build:46  gtk4
+#     meson.build:47  gtksourceview-5   ← la SOMBRA dinámica de esta cola, no la estática del corpus
+#     meson.build:48  libadwaita-1
+#     meson.build:49  cairo
+#     meson.build:50  libspelling-1     ← y detrás, la cadena enchant → hunspell → hunspell-en
+#  src/editorconfig/meson.build:1  editorconfig  ← con `-Deditorconfig=enabled` (el default)
+#
+# ── `editorconfig` SE DEJA ENCENDIDO, y en ESTE repo no es un detalle ─────────────────────────
+# Es lo que hace que el editor respete el `.editorconfig` del proyecto —sangrado, fin de línea,
+# codificación— en vez de imponer los ajustes del usuario. En un árbol que editan varios agentes y
+# una persona, un editor que no lo respeta mete diffs de espacios que nadie pidió. La librería de
+# abajo es `editorconfig-core-c`; lo que vive dentro del tarball (`src/editorconfig/`) es sólo el
+# pegamento GObject, no una copia del parser.
+#
+# ── LA ORTOGRAFÍA FUNCIONA DE VERDAD, Y ESO COSTÓ TRES RECETAS ────────────────────────────────
+# `libspelling` construye con o sin corrector: sin `enchant` expone un proveedor VACÍO y el editor
+# sigue mostrando su preferencia «spellcheck» (`editor-preferences-dialog.ui:112`) sin efecto
+# ninguno. Por eso la cola trae la cadena entera: `hunspell` (motor) + `hunspell-en` (diccionarios
+# en_US/en_GB) + `enchant` (el intermediario). Está escrito en cada una de las tres.
+# ⚠ **Sólo hay inglés.** El castellano —que es el idioma de esta distro— es UNA LÍNEA en el
+# `install` de `hunspell-en.toml`, del mismo tarball ya descargado; no se añadió acá porque qué
+# idiomas lleva la imagen es una decisión de catálogo, no de esta receta. Hueco escrito, no omitido.
+#
+# ── LAS PERILLAS ──────────────────────────────────────────────────────────────────────────────
+#   -Ddevelopment=false  → ya es el default; con `true` cambia el ID de la aplicación
+#                          (`org.gnome.TextEditor.Devel`) y el icono, o sea que la app NO sería la
+#                          que el escritorio busca por su nombre.
+#   -Deditorconfig=enabled → ya es el default; se declara porque es `feature` y arrastra una receta.
+#
+# ⚠ SIN `sed` del `ar`: este tarball **no trae `po/ar.po`** (56 ficheros en `po/`, ninguno árabe),
+# así que la mina del msgfmt de gettext-tiny no aplica. Comprobado, no supuesto — de las nueve
+# recetas de esta tanda sólo libgtop lo necesitaba.
+name    = "gnome-text-editor"
+version = "48.3"
+license = "GPL-3.0-or-later"
+
+[source]
+tarball = "https://download.gnome.org/sources/gnome-text-editor/48/gnome-text-editor-48.3.tar.xz"
+sha256  = "3f9e9722394edb4d2145c06d69210b3d3fca5cd2b90d632643be750843d556ba"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "dynamic"
+
+[build.phases]
+configure = "PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload -Ddevelopment=false -Deditorconfig=enabled -Dc_args=-Wno-error=date-time"
+compile   = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output"
+install   = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild"
+
+[deps]
+# `desktop-file-utils` está por la lección de nautilus y gnome-console: las apps de GNOME llaman a
+# `update-desktop-database` desde el configure como programa REQUERIDO.
+# `appstream` + su cierre (libxmlb, libyaml-shared, libxml2-shared, curl, openssl, zstd) entran por
+# `libadwaita-1.pc`, que lo declara en `Requires.private`.
+build = ["meson", "samurai", "python3", "pkgconf", "gettext-tiny", "desktop-file-utils", "glib", "gtk4", "libadwaita", "gtksourceview", "libspelling", "enchant", "hunspell", "hunspell-en", "editorconfig-core-c", "gsettings-desktop-schemas", "pango", "cairo-shared", "gdk-pixbuf", "graphene", "harfbuzz", "fribidi", "fontconfig-shared", "freetype-shared", "pixman", "libpng-shared", "expat", "libjpeg-turbo-shared", "libtiff-shared", "libepoxy", "wayland", "wayland-protocols", "libxkbcommon", "libdrm", "mesa", "appstream", "libxmlb", "libyaml-shared", "libxml2-shared", "curl", "openssl", "zstd", "pcre2", "libffi", "zlib-shared"]
diff --git a/recipes/incoming-gnome/gtksourceview.toml b/recipes/incoming-gnome/gtksourceview.toml
new file mode 100644
index 00000000..3d9e8b10
--- /dev/null
+++ b/recipes/incoming-gnome/gtksourceview.toml
@@ -0,0 +1,50 @@
+# gtksourceview 5.16.0 — VARIANTE ISLA DINÁMICA (sombra de `recipes/gtksourceview.toml` estática).
+# El widget de edición de código: resaltado de sintaxis, números de línea, sangrado. Lo piden
+# `libspelling` (`meson.build:8`) y `gnome-text-editor` (`meson.build:47`).
+#
+# ── POR QUÉ UNA SOMBRA, Y NO REUSAR LA DEL CORPUS ──────────────────────────────────────────────
+# La canónica es del MUNDO ESTÁTICO: `--prefer-static -Ddefault_library=static`, y su artefacto es
+# `libgtksourceview-5.a` a secas — comprobado sobre el store, ni un `.so`. Y lo más importante no es
+# que sea `.a`: es **contra qué está enlazada**. Su cierre es el gtk4 CANÓNICO (estático), no el
+# gtk4 de esta cola. Montarla dentro de `libspelling.so` metería un segundo GTK4 y un segundo GLib
+# en el mismo proceso, que es el SIGSEGV del keystone que documenta [[dos-glib-estaticas-en-un-proceso]]
+# y por el que existe la isla entera.
+#
+# Es exactamente el caso de `libadwaita.toml` en esta misma cola —misma explicación, mismo remedio—
+# y por eso la canónica NO se toca: la comparten otros consumidores del corpus y cambiarla los
+# re-hashea a todos para nada.
+#
+# vs. la canónica, revertido:
+#   · link=dynamic, `-Ddefault_library=shared`, SIN `--prefer-static`.
+#   · todas las deps pasan a la isla / a sus variantes `-shared` (cairo-shared, libxml2-shared,
+#     fontconfig-shared, freetype-shared, libpng-shared, libjpeg-turbo-shared, libtiff-shared,
+#     zlib-shared) — que son justamente las que no son PIC y no entran en un `.so`.
+#
+# El `sed` de los tests se hereda de la canónica y por la MISMA razón que ella documenta:
+# gtksourceview 5.16 no tiene opción `tests`, y esos subdirectorios construyen ejecutables que
+# fallan por las deps privadas. La librería —lo único que esta receta produce para el escritorio—
+# ya está enlazada cuando eso pasa.
+#
+# `-Dintrospection=disabled`: la isla SABE hacer introspección y acá se deja apagada porque los dos
+# consumidores (libspelling, gnome-text-editor) son C. Encenderla es una línea el día que una
+# extensión en JS quiera GtkSource por typelib.
+name    = "gtksourceview"
+version = "5.16.0"
+license = "LGPL-2.1-or-later"
+
+[source]
+tarball = "https://download.gnome.org/sources/gtksourceview/5.16/gtksourceview-5.16.0.tar.xz"
+sha256  = "ab35d420102f3e8b055dd3b8642d3a48209f888189e6254d0ffb4b6a7e8c3566"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "dynamic"
+
+[build.phases]
+configure = "sed -i \"/subdir('tests')/d;/subdir('testsuite')/d\" meson.build && PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload -Ddefault_library=shared -Dintrospection=disabled -Dvapi=false -Ddocumentation=false -Dsysprof=false -Dc_args=-Wno-error=date-time"
+compile   = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output"
+install   = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild"
+
+[deps]
+build = ["meson", "samurai", "python3", "pkgconf", "gettext-tiny", "glib", "gtk4", "pango", "gdk-pixbuf", "cairo-shared", "graphene", "harfbuzz", "fribidi", "fontconfig-shared", "freetype-shared", "pixman", "libpng-shared", "expat", "libxml2-shared", "libjpeg-turbo-shared", "libtiff-shared", "libepoxy", "wayland", "wayland-protocols", "libxkbcommon", "libdrm", "pcre2", "libffi", "zlib-shared", "mesa"]
diff --git a/recipes/incoming-gnome/hunspell-en.toml b/recipes/incoming-gnome/hunspell-en.toml
new file mode 100644
index 00000000..3988481c
--- /dev/null
+++ b/recipes/incoming-gnome/hunspell-en.toml
@@ -0,0 +1,64 @@
+# hunspell-en — los DICCIONARIOS en inglés (en_US y en_GB) para hunspell. Datos, no código: dos
+# ficheros de texto por idioma, un `.aff` con las reglas morfológicas y un `.dic` con las palabras.
+#
+# ── POR QUÉ UNA RECETA SÓLO PARA DOS FICHEROS ──────────────────────────────────────────────────
+# Porque sin ellos la cadena entera es decorativa. `hunspell` sabe corregir, `enchant` sabe
+# encontrar correctores, `libspelling` sabe pintar subrayados rojos — y con cero diccionarios
+# instalados la lista de idiomas sale vacía, el interruptor de «revisar ortografía» del editor se
+# enciende y no pasa nada. Motor sin combustible es la misma forma que «media cadena de secretos»:
+# todo contesta bien y no hace nada.
+#
+# ── ⚠ LA FUENTE PESA 110 MB PARA INSTALAR ~1 MB, Y ES DELIBERADO ───────────────────────────────
+# El tarball de `LibreOffice/dictionaries` trae los diccionarios de ~90 idiomas (110.623.165 bytes,
+# medido). De ahí se instalan sólo `en_US` y `en_GB`. Se eligió igual, sobre las alternativas:
+#   · SourceForge/wordlist publica `hunspell-en_US-*.zip` (~200 KB) — pero el fetcher de takana
+#     extrae con `tar` y NO sabe de `.zip` (`fetch.rs`: «extracción con tar»). Habría que tocar el
+#     fetcher, que es infraestructura compartida.
+#   · Debian tiene `hunspell-en-us` en tar.gz, pero su versión es de **2007**.
+#   · Los repos por-idioma (wooorm/dictionaries) son otro monolito, sin releases versionadas.
+# El de LibreOffice es el upstream canónico de facto —es de donde salen los de casi todas las
+# distros—, está etiquetado por release y es un tarball. Se paga una vez: el fetcher cachea el
+# tarball y el mirror (ADR 0013) lo guarda una sola vez para todos los idiomas.
+#
+# ⇒ **Añadir otro idioma es UNA LÍNEA en el `install` de abajo**, sin descargar nada nuevo. Ésa es
+# la otra mitad del argumento: la alternativa barata sería barata sólo para el inglés, y esta distro
+# se escribe en castellano. `es` (español), `pt`, `fr`, `de` e `it` están en el mismo tarball.
+# ⚠ NO se añaden hoy a propósito: cada idioma es una decisión de qué lleva la imagen —y de cuántos
+# MB—, y esta receta entra para destrabar el editor de texto, no para decidir el catálogo de
+# idiomas de la distro. Está escrito acá para que esa decisión sea visible y de una línea.
+#
+# ⚠ EL NOMBRE DEL DIRECTORIO IMPORTA: `enchant` busca en `${datadir}/hunspell` —su
+# `ENCHANT_HUNSPELL_DICT_DIR`, que su `configure.ac` fija como `${datadir}/hunspell`—, no en
+# `/usr/share/myspell` ni junto a la librería. Un diccionario instalado en el sitio equivocado es
+# indistinguible de uno no instalado.
+name    = "hunspell-en"
+version = "25.2.5.2"
+license = "LGPL-2.1-or-later AND MPL-1.1 AND BSD-3-Clause"
+
+[source]
+tarball = "https://github.com/LibreOffice/dictionaries/archive/refs/tags/libreoffice-25.2.5.2.tar.gz"
+sha256  = "cb9f172aae04efec384dd7193109b2d99852d825d70ad85d12c69639045c3ba6"
+
+[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/hunspell /out/usr/share/licenses/hunspell-en
+for d in en_US en_GB; do
+  cp -a "en/$d.aff" "en/$d.dic" /out/usr/share/hunspell/
+done
+cp -a en/README* en/LICENSE* en/COPYING* /out/usr/share/licenses/hunspell-en/ 2>/dev/null || true
+# Un diccionario vacío es un diccionario que no está (regla 3 del repo): se comprueba que el .dic
+# traiga palabras de verdad, no sólo que el fichero exista.
+test "$(wc -l < /out/usr/share/hunspell/en_US.dic)" -gt 1000
+test "$(wc -l < /out/usr/share/hunspell/en_GB.dic)" -gt 1000
+'''
+
+[deps]
+build = []
diff --git a/recipes/incoming-gnome/hunspell.toml b/recipes/incoming-gnome/hunspell.toml
new file mode 100644
index 00000000..89978bd7
--- /dev/null
+++ b/recipes/incoming-gnome/hunspell.toml
@@ -0,0 +1,40 @@
+# hunspell 1.7.2 — el corrector ortográfico. Es el motor que hay debajo de casi todo: LibreOffice,
+# Firefox, Chrome y —por el camino `libspelling → enchant → hunspell`— el editor de texto de GNOME.
+#
+# ── POR QUÉ ESTÁ ACÁ: PORQUE SIN ÉL, CORREGIR ORTOGRAFÍA ES UN INTERRUPTOR QUE NO HACE NADA ────
+# `libspelling` (la que pide `gnome-text-editor`) construye SIEMPRE, con o sin corrector: si no
+# encuentra a `enchant`, compila `spelling-empty-provider.c` y expone un proveedor vacío. El editor
+# sigue mostrando su preferencia «spellcheck» (`editor-preferences-dialog.ui:112`), el usuario la
+# enciende, y no pasa nada — ni subrayados, ni sugerencias, ni lista de idiomas. Es exactamente la
+# papelera dibujada que no existe. Por eso esta cadena entra entera o no entra: hunspell (el motor)
+# + `hunspell-en` (los datos) + `enchant` (el intermediario que GNOME sabe usar).
+#
+# ⚠ ES C++, y eso importa en esta distro: el `.so` lo construye `zig c++`, o sea contra **libc++**.
+# `enchant` —su único consumidor acá— se construye con la misma cadena, así que los dos hablan el
+# mismo runtime. Mezclarlo con algo compilado por gcc (libstdc++) es el fallo documentado en
+# [[cxx-runtime-debe-coincidir]]; no aplica hoy, y conviene que siga sin aplicar.
+#
+# `--with-ui=no`: hunspell trae un corrector interactivo de terminal que pide ncurses y que nadie va
+# a abrir en esta distro. La librería y el binario `hunspell` de línea de comandos salen igual.
+#
+# ⚠ SIN `sed` del `ar`: medido, `po/ar.po` de este tarball trae CERO `msgstr[5]`.
+name    = "hunspell"
+version = "1.7.2"
+license = "GPL-2.0-or-later OR LGPL-2.1-or-later OR MPL-1.1"
+
+[source]
+tarball = "https://github.com/hunspell/hunspell/releases/download/v1.7.2/hunspell-1.7.2.tar.gz"
+sha256  = "11ddfa39afe28c28539fe65fc4f1592d410c1e9b6dd7d8a91ca25d85e9ec65b8"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "dynamic"
+
+[build.phases]
+configure = "CFLAGS='-O2 -fPIC' CXXFLAGS='-O2 -fPIC' ./configure --build=$CBUILD --host=$CHOST --prefix=/usr --enable-shared --disable-static --with-ui=no --disable-dependency-tracking"
+compile   = 'make -j"$(nproc)"'
+install   = 'make DESTDIR=/out install'
+
+[deps]
+build = ["make", "pkgconf", "gettext-tiny"]
diff --git a/recipes/incoming-gnome/libspelling.toml b/recipes/incoming-gnome/libspelling.toml
new file mode 100644
index 00000000..d3883314
--- /dev/null
+++ b/recipes/incoming-gnome/libspelling.toml
@@ -0,0 +1,47 @@
+# libspelling 0.4.10 — el corrector ortográfico COMO WIDGET: subrayado rojo mientras se escribe,
+# menú de sugerencias y elección de idioma, integrado en un `GtkSourceView`. Es dep DURA de
+# `gnome-text-editor` (`meson.build:50`, `dependency('libspelling-1')`, sin perilla).
+#
+# ── `-Denchant=enabled` NO ES EL DEFAULT POR CASUALIDAD, Y ES LA DECISIÓN DE ESTA RECETA ───────
+# El default ya viene `enabled`, pero se declara porque es una `feature` y la diferencia entre
+# declararlo y no hacerlo es el sistema entero: `lib/meson.build:44-45` sólo entra al subdirectorio
+# `enchant/` si la opción está `enabled()` —no `auto`, `enabled`— y `meson.build:20` define
+# `HAVE_ENCHANT` con lo mismo. Sin él, `spelling-provider.c` (`:28` y `:155`) se compila con un
+# **proveedor vacío** (`spelling-empty-provider.c`, que existe y es exactamente eso).
+#
+# ⇒ Con enchant apagado, libspelling CONSTRUYE, SELLA y no corrige nada: cero idiomas, cero
+# sugerencias, cero subrayados. Y `gnome-text-editor` seguiría mostrando su preferencia
+# «spellcheck» (`editor-preferences-dialog.ui:112`), que el usuario puede encender sin efecto.
+# Es la papelera dibujada de nautilus otra vez, en otro sitio. Por eso esta cola trae la cadena
+# completa —`hunspell` + `hunspell-en` + `enchant`— en vez de la mitad barata.
+#
+# ── LAS OTRAS PERILLAS ────────────────────────────────────────────────────────────────────────
+#   -Dsysprof=false   (default TRUE) → `sysprof-capture-4`, la librería de trazas del perfilador de
+#                     GNOME. No está en el catálogo y lo único que aporta son marcas de tiempo para
+#                     un perfilador que tampoco está.
+#   -Dintrospection=disabled / -Dvapi=false / -Ddocs=false → typelib, Vala y gi-docgen. El consumidor
+#                     de hoy (gnome-text-editor) es C. ⚠ `vapi` depende de `introspection`: apagar
+#                     una sin la otra es el assert que costó una corrida en vte.
+#   -Dinstall-static=false → ya es el default; toda la cola es la isla dinámica.
+#
+# ⚠ SIN `sed` del `ar`: su `po/ar.po` trae CERO `msgstr[5]` (medido).
+name    = "libspelling"
+version = "0.4.10"
+license = "LGPL-2.1-or-later"
+
+[source]
+tarball = "https://download.gnome.org/sources/libspelling/0.4/libspelling-0.4.10.tar.xz"
+sha256  = "56e3f01a3a18b575beea4c34349f99cdaba316e1f7c271b1231f7bcf5d9af73b"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "dynamic"
+
+[build.phases]
+configure = "PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload -Ddefault_library=shared -Denchant=enabled -Dsysprof=false -Dintrospection=disabled -Dvapi=false -Ddocs=false -Dinstall-static=false -Dc_args=-Wno-error=date-time"
+compile   = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output"
+install   = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild"
+
+[deps]
+build = ["meson", "samurai", "python3", "pkgconf", "gettext-tiny", "glib", "gtk4", "gtksourceview", "enchant", "hunspell", "pango", "cairo-shared", "gdk-pixbuf", "graphene", "libepoxy", "wayland", "wayland-protocols", "libxkbcommon", "libdrm", "mesa", "fontconfig-shared", "freetype-shared", "harfbuzz", "fribidi", "pixman", "libpng-shared", "expat", "libjpeg-turbo-shared", "libtiff-shared", "libxml2-shared", "pcre2", "libffi", "zlib-shared"]