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 815Rust 56Shell 37Markdown 291229 Definitions

sombras -shared: 8 promovidas al corpus, 0 hashes movidos — y cairo se para en un muro real

Decisión del usuario: promover una por una, verificando. Hecho así, y valió la pena.

EL RIESGO QUE SE TEMÍA NO APLICABA. La nota de `granja-promote-colisiones` advierte que
promover a ciegas hace que variantes homónimas pisen recetas canónicas. Acá no: los nombres
`*-shared` son DISTINTOS de los canónicos —`zlib-shared` no pisa a `zlib`— y se comprobó que
ninguna de las 19 sombras del catálogo choca con un nombre del corpus. Decirlo importa: repetir
una advertencia donde no aplica es tan malo como ignorarla donde sí.

VERIFICADO EMPÍRICAMENTE, no razonado: se calcularon los hashes de LAS 1153 recetas antes y
después de promover. **Ninguna cambió**, y las 8 nuevas tienen hash idéntico a su original ⇒ sus
artefactos ya están sellados y no hay que reconstruir nada. Promovidas: zlib, libpng, freetype,
fontconfig, libjpeg-turbo, libtiff, libxml2 y libyaml (todas en su variante -shared).

⛔ `cairo-shared` NO SE PROMOVIÓ, y el porqué es el hallazgo: su hash SÍ cambia al moverla,
porque una de sus deps —`glib`— resuelve distinto desde el corpus. En `incoming-gnome-onda2`
hay una SOMBRA DE GLIB CON EL MISMO NOMBRE que la canónica (`link=dynamic`,
`-Ddefault_library=both` en vez de static), y `cairo-shared` está construida contra ella.

⇒ O sea que el riesgo de homónimos SÍ existe, pero un nivel más abajo del que se miraba: no en
las `-shared`, sino en el `glib` sombra. Promoverlo pisaría la receta canónica de glib y
re-hashearía en silencio todo lo que cuelga de ella, que es medio catálogo. El camino limpio es
renombrarla a `glib-shared` —nombre que YA existe en incoming-cosmic— y reapuntar cairo-shared;
eso cambia hashes de la cadena GNOME y merece su propia decisión, no colarla acá de madrugada.

Con esto la cadena estática del corpus (gtk4 y las 6 que cuelgan) sigue bloqueada, pero ahora se
sabe exactamente por qué y cuál es el siguiente paso concreto.

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

6e2772109867afcb780dbae97f48210ccd45d9ec · by sergio · (2 months ago) · parent d70098ade · browse the tree at this commit

Semantic delta

No definition changed: this change is text, documentation or data.

8 files · +338 −0

diff --git a/recipes/fontconfig-shared.toml b/recipes/fontconfig-shared.toml
new file mode 100644
index 00000000..266c27fd
--- /dev/null
+++ b/recipes/fontconfig-shared.toml
@@ -0,0 +1,39 @@
+# fontconfig-shared 2.18.1 — variante DINÁMICA (libfontconfig.so.1, PIC) para el escritorio KDE.
+# El canónico (recipes/fontconfig.toml) es --disable-shared (sólo libfontconfig.a sin PIC) ⇒ no enlaza en
+# un .so. Lo exige poppler (búsqueda/sustitución de fuentes del PDF) → okular. Deuda Capa 0 del ADR 0011.
+#
+# expat NO necesita variante: el canónico ya usa --with-pic (su .a lleva objetos PIC, enlazable en .so).
+# libpng-shared+zlib-shared: freetype se compila --with-png ⇒ freetype2.pc trae `Requires: libpng` (y
+# libpng.pc → zlib); sin ellos pkg-config no resuelve freetype2 y ./configure aborta (gotcha .pc transitivo).
+name    = "fontconfig-shared"
+version = "2.18.1"
+license = "MIT"
+
+[source]
+tarball = "https://gitlab.freedesktop.org/api/v4/projects/890/packages/generic/fontconfig/2.18.1/fontconfig-2.18.1.tar.xz"
+sha256  = "2300f3dbfa7253b3a44f4feecdbc8dfa45dde5dc2cfb71fceaf31f394cb41031"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "dynamic"
+flags    = []
+
+[build.phases]
+configure = "./configure --build=$CBUILD --host=$CHOST --prefix=/usr --sysconfdir=/etc --enable-shared --disable-static --disable-docs"
+compile   = 'make -j"$(nproc)"'
+install   = "make install DESTDIR=/out && find /out -name '*.la' -delete"
+
+[deps]
+build = ["freetype-shared", "expat", "pkgconf", "gperf", "python3", "libpng-shared", "zlib-shared"]
+
+# ── PROMOVIDA AL CORPUS 2026-08-08 ──────────────────────────────────────────────────────────────
+# Copia literal de la sombra que vivía en una cola `incoming-*`. Se promovió porque la resolución de
+# deps es hermano→padre: una receta del corpus NO ve las de `incoming-*`, así que sin esto ninguna
+# receta canónica puede usar las variantes dinámicas.
+#
+# NO hay riesgo de colisión —el que advierte la nota de `granja-promote-colisiones`— porque el nombre
+# `*-shared` es DISTINTO del canónico: `zlib-shared` no pisa a `zlib`. Verificado además de forma
+# empírica antes de commitear: se calcularon los hashes de LAS 1153 recetas antes y después, y
+# **ninguna cambió**. El hash de esta copia es idéntico al del original, así que su artefacto ya está
+# sellado y no hay que reconstruir nada.
diff --git a/recipes/freetype-shared.toml b/recipes/freetype-shared.toml
new file mode 100644
index 00000000..3b6c93fe
--- /dev/null
+++ b/recipes/freetype-shared.toml
@@ -0,0 +1,43 @@
+# freetype-shared 2.14.3 — variante DINÁMICA (libfreetype.so.6, PIC) para el escritorio KDE.
+# El canónico (recipes/freetype.toml) es --disable-shared (sólo libfreetype.a sin PIC) ⇒ no enlaza dentro
+# de un .so. Lo exige poppler (rasterizado de fuentes del PDF) → okular. Deuda Capa 0 que el ADR 0011
+# marcaba pendiente ("freetype/fontconfig shared-PIC").
+#
+# SIN los 3 patches del canónico (pcf-family-names/subpixel/table-validation-modules): son tweaks de
+# rendering de Alpine y viven en recipes/ (copiarlos a esta cola arriesga la colisión de patches homónimos).
+# No afectan la corrección del rasterizado que poppler necesita.
+#
+# --without-harfbuzz: corta el ciclo freetype↔harfbuzz (harfbuzz autodetectaría freetype). --without-brotli:
+# no hay brotli sellado (sólo afecta fuentes WOFF2). zlib/png dinámicos vía las variantes -shared.
+name    = "freetype-shared"
+version = "2.14.3"
+license = "FTL OR GPL-2.0-or-later"
+
+[source]
+tarball = "https://download.savannah.gnu.org/releases/freetype/freetype-2.14.3.tar.xz"
+sha256  = "36bc4f1cc413335368ee656c42afca65c5a3987e8768cc28cf11ba775e785a5f"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "dynamic"
+flags    = []
+
+[build.phases]
+configure = './configure --build=$CBUILD --host=$CHOST --prefix=/usr --enable-shared --disable-static --without-harfbuzz --without-brotli --with-zlib=yes --with-png=yes CPPFLAGS=-I/usr/include LDFLAGS=-L/usr/lib'
+compile   = 'make -j"$(nproc)"'
+install   = "make DESTDIR=/out install && find /out -name '*.la' -delete"
+
+[deps]
+build = ["zlib-shared", "libpng-shared", "pkgconf"]
+
+# ── PROMOVIDA AL CORPUS 2026-08-08 ──────────────────────────────────────────────────────────────
+# Copia literal de la sombra que vivía en una cola `incoming-*`. Se promovió porque la resolución de
+# deps es hermano→padre: una receta del corpus NO ve las de `incoming-*`, así que sin esto ninguna
+# receta canónica puede usar las variantes dinámicas.
+#
+# NO hay riesgo de colisión —el que advierte la nota de `granja-promote-colisiones`— porque el nombre
+# `*-shared` es DISTINTO del canónico: `zlib-shared` no pisa a `zlib`. Verificado además de forma
+# empírica antes de commitear: se calcularon los hashes de LAS 1153 recetas antes y después, y
+# **ninguna cambió**. El hash de esta copia es idéntico al del original, así que su artefacto ya está
+# sellado y no hay que reconstruir nada.
diff --git a/recipes/libjpeg-turbo-shared.toml b/recipes/libjpeg-turbo-shared.toml
new file mode 100644
index 00000000..e8443e68
--- /dev/null
+++ b/recipes/libjpeg-turbo-shared.toml
@@ -0,0 +1,36 @@
+# libjpeg-turbo-shared 3.1.3 — variante DINÁMICA (libjpeg.so.8 + libturbojpeg.so.0, PIC) para el
+# escritorio KDE. El canónico (recipes/incoming-kde/libjpeg-turbo.toml) es ENABLE_SHARED=0 (sólo .a sin
+# PIC) ⇒ no enlaza dentro de un .so ('R_X86_64_32S ... recompile with -fPIC', jpeg_nbits_table). Como
+# zlib-shared/bzip2-shared. Nombre distinto para no colisionar con el canónico. gwenview lo linkea.
+name    = "libjpeg-turbo-shared"
+version = "3.1.3"
+license = "IJG AND BSD-3-Clause AND Zlib"
+
+[source]
+tarball = "https://github.com/libjpeg-turbo/libjpeg-turbo/releases/download/3.1.3/libjpeg-turbo-3.1.3.tar.gz"
+sha256  = "075920b826834ac4ddf97661cc73491047855859affd671d52079c6867c1c6c0"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "dynamic"
+flags    = []
+
+[build.phases]
+configure = "cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_BUILD_TYPE=Release -DENABLE_SHARED=1 -DENABLE_STATIC=0 -DWITH_SIMD=0"
+compile   = "cmake --build build"
+install   = "DESTDIR=/out cmake --install build"
+
+[deps]
+build = ["cmake", "samurai"]
+
+# ── PROMOVIDA AL CORPUS 2026-08-08 ──────────────────────────────────────────────────────────────
+# Copia literal de la sombra que vivía en una cola `incoming-*`. Se promovió porque la resolución de
+# deps es hermano→padre: una receta del corpus NO ve las de `incoming-*`, así que sin esto ninguna
+# receta canónica puede usar las variantes dinámicas.
+#
+# NO hay riesgo de colisión —el que advierte la nota de `granja-promote-colisiones`— porque el nombre
+# `*-shared` es DISTINTO del canónico: `zlib-shared` no pisa a `zlib`. Verificado además de forma
+# empírica antes de commitear: se calcularon los hashes de LAS 1153 recetas antes y después, y
+# **ninguna cambió**. El hash de esta copia es idéntico al del original, así que su artefacto ya está
+# sellado y no hay que reconstruir nada.
diff --git a/recipes/libpng-shared.toml b/recipes/libpng-shared.toml
new file mode 100644
index 00000000..703032d7
--- /dev/null
+++ b/recipes/libpng-shared.toml
@@ -0,0 +1,35 @@
+# libpng-shared 1.6.58 — variante DINÁMICA (libpng16.so.16, PIC) para el escritorio KDE. El canónico
+# (recipes/libpng.toml) es --disable-shared (sólo libpng16.a sin PIC) ⇒ no enlaza dentro de un .so. Como
+# zlib-shared/xz-shared: autotools --enable-shared, zig-cc, contra zlib-shared (libz.so). gwenview linkea.
+name    = "libpng-shared"
+version = "1.6.58"
+license = "Libpng"
+
+[source]
+tarball = "https://downloads.sourceforge.net/libpng/libpng-1.6.58.tar.gz"
+sha256  = "8c9b05b675ca7301a458df2c2e46f26e1d41ff36b8863f8c33530bc58c2e6225"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "dynamic"
+flags    = []
+
+[build.phases]
+configure = './configure --build=$CBUILD --host=$CHOST --prefix=/usr --enable-shared --disable-static CPPFLAGS=-I/usr/include LDFLAGS=-L/usr/lib'
+compile   = 'make -j"$(nproc)"'
+install   = "make DESTDIR=/out install && find /out -name '*.la' -delete"
+
+[deps]
+build = ["zlib-shared", "pkgconf"]
+
+# ── PROMOVIDA AL CORPUS 2026-08-08 ──────────────────────────────────────────────────────────────
+# Copia literal de la sombra que vivía en una cola `incoming-*`. Se promovió porque la resolución de
+# deps es hermano→padre: una receta del corpus NO ve las de `incoming-*`, así que sin esto ninguna
+# receta canónica puede usar las variantes dinámicas.
+#
+# NO hay riesgo de colisión —el que advierte la nota de `granja-promote-colisiones`— porque el nombre
+# `*-shared` es DISTINTO del canónico: `zlib-shared` no pisa a `zlib`. Verificado además de forma
+# empírica antes de commitear: se calcularon los hashes de LAS 1153 recetas antes y después, y
+# **ninguna cambió**. El hash de esta copia es idéntico al del original, así que su artefacto ya está
+# sellado y no hay que reconstruir nada.
diff --git a/recipes/libtiff-shared.toml b/recipes/libtiff-shared.toml
new file mode 100644
index 00000000..56bac2dc
--- /dev/null
+++ b/recipes/libtiff-shared.toml
@@ -0,0 +1,38 @@
+# libtiff-shared 4.7.0 — variante DINÁMICA (libtiff.so, NEEDED libz.so/libjpeg.so) para la isla GNOME.
+# gtk4 EXIGE libtiff-4 (meson.build:450, sin required:false ⇒ no se puede quitar). El canónico es
+# BUILD_SHARED_LIBS=OFF: su libtiff.a arrastra zlib/jpeg como cadena estática que gtk4 (dinámico) no
+# resuelve ('undefined inflate'). La .so lo resuelve por NEEDED. Ver [[gnome-introspection-dinamica]].
+name    = "libtiff-shared"
+version = "4.7.0"
+license = "libtiff"
+
+[source]
+tarball = "https://download.osgeo.org/libtiff/tiff-4.7.0.tar.gz"
+sha256  = "67160e3457365ab96c5b3286a0903aa6e78bdc44c4bc737d2e486bcecb6ba976"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "dynamic"
+
+[build.phases]
+# --undefined-version: el version-script de libtiff.so nombra símbolos Windows-only (TIFFOpenWExt) que
+# en musl no se compilan; lld lo trata como error salvo con este flag (lo hace laxo, estándar en cross).
+configure = "cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DCMAKE_SHARED_LINKER_FLAGS=-Wl,--undefined-version -Dtiff-tools=OFF -Dtiff-tests=OFF -Dtiff-contrib=OFF -Dtiff-docs=OFF -Dzlib=ON -Djpeg=ON -Dlzma=OFF -Dzstd=OFF -Dwebp=OFF -Djbig=OFF -Dlerc=OFF -Dlibdeflate=OFF -Dcxx=OFF"
+compile   = "cmake --build build --target tiff"
+install   = "DESTDIR=/out cmake --install build"
+
+# zlib-shared/libjpeg-turbo-shared: la .so de tiff los enlaza por NEEDED (libz.so/libjpeg.so).
+[deps]
+build = ["cmake", "zlib-shared", "libjpeg-turbo-shared"]
+
+# ── PROMOVIDA AL CORPUS 2026-08-08 ──────────────────────────────────────────────────────────────
+# Copia literal de la sombra que vivía en una cola `incoming-*`. Se promovió porque la resolución de
+# deps es hermano→padre: una receta del corpus NO ve las de `incoming-*`, así que sin esto ninguna
+# receta canónica puede usar las variantes dinámicas.
+#
+# NO hay riesgo de colisión —el que advierte la nota de `granja-promote-colisiones`— porque el nombre
+# `*-shared` es DISTINTO del canónico: `zlib-shared` no pisa a `zlib`. Verificado además de forma
+# empírica antes de commitear: se calcularon los hashes de LAS 1153 recetas antes y después, y
+# **ninguna cambió**. El hash de esta copia es idéntico al del original, así que su artefacto ya está
+# sellado y no hay que reconstruir nada.
diff --git a/recipes/libxml2-shared.toml b/recipes/libxml2-shared.toml
new file mode 100644
index 00000000..f8970411
--- /dev/null
+++ b/recipes/libxml2-shared.toml
@@ -0,0 +1,53 @@
+# libxml2-shared 2.13.9 — variante DINÁMICA de libxml2 para la isla dinámica de GNOME.
+#
+# Por qué existe, y por qué NO existía hasta ahora: en libical la libxml2 sólo la enlazaba un
+# ejecutable de build (ical-glib-src-generator), así que la .a canónica alcanzó. En
+# evolution-data-server NO: libxml-2.0 es dep REQUERIDA de libedataserver, libebackend, libebook y
+# libecal (CMakeLists.txt:932,936,937,938), o sea que entra dentro de .so reales. La libxml2.a
+# canónica no es PIC (verificado: reubicaciones R_X86_64_32) ⇒ mismo muro que sqlite y freetype.
+#
+# Mismo tarball, misma versión y MISMOS patches de CVE que la canónica: no se abre skew entre el
+# mundo estático y el dinámico, y la superficie de seguridad es idéntica. Los .patch están copiados
+# a esta cola porque se resuelven contra el base_dir de la receta, no contra recipes/.
+#
+# Se mantienen --without-{python,lzma,zlib} de la canónica: eds parsea XML, no comprime.
+name    = "libxml2-shared"
+version = "2.13.9"
+license = "MIT"
+
+[source]
+tarball = "https://download.gnome.org/sources/libxml2/2.13/libxml2-2.13.9.tar.xz"
+sha256  = "a2c9ae7b770da34860050c309f903221c67830c86e4a7e760692b803df95143a"
+patches = ["CVE-2026-6732.patch", "CVE-2026-6732-test.patch"]
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "dynamic"
+flags    = []
+
+[build.phases]
+configure = '''
+./configure \
+	--build=$CBUILD --host=$CHOST \
+	--prefix=/usr \
+	--enable-shared --disable-static \
+	--without-python --without-lzma --without-zlib \
+	--with-legacy
+'''
+compile = 'make -j"$(nproc)"'
+install = 'make DESTDIR=/out install'
+
+[deps]
+build = ["make", "pkgconf"]
+
+# ── PROMOVIDA AL CORPUS 2026-08-08 ──────────────────────────────────────────────────────────────
+# Copia literal de la sombra que vivía en una cola `incoming-*`. Se promovió porque la resolución de
+# deps es hermano→padre: una receta del corpus NO ve las de `incoming-*`, así que sin esto ninguna
+# receta canónica puede usar las variantes dinámicas.
+#
+# NO hay riesgo de colisión —el que advierte la nota de `granja-promote-colisiones`— porque el nombre
+# `*-shared` es DISTINTO del canónico: `zlib-shared` no pisa a `zlib`. Verificado además de forma
+# empírica antes de commitear: se calcularon los hashes de LAS 1153 recetas antes y después, y
+# **ninguna cambió**. El hash de esta copia es idéntico al del original, así que su artefacto ya está
+# sellado y no hay que reconstruir nada.
diff --git a/recipes/libyaml-shared.toml b/recipes/libyaml-shared.toml
new file mode 100644
index 00000000..3c2e5f6b
--- /dev/null
+++ b/recipes/libyaml-shared.toml
@@ -0,0 +1,49 @@
+# libyaml-shared 0.2.5 — variante DINÁMICA de libyaml para la isla dinámica de GNOME.
+#
+# Por qué existe: libadwaita declara `Requires: appstream` en su .pc (es dep PÚBLICA desde 1.6, para
+# las release-notes de AdwAboutDialog), y appstream parsea los catálogos DEP-11 con libyaml. En el
+# mundo estático eso da igual, pero la SOMBRA dinámica de libadwaita mete todo ese cierre dentro de
+# `libadwaita-1.so`, y la libyaml.a canónica NO es PIC: 226 reubicaciones R_X86_64_32/32S en secciones
+# de código. Mismo muro que fontconfig/freetype/libpng/libjpeg-turbo/libtiff/libxml2, que ya tienen su
+# sombra en esta cola. libyaml era la ÚNICA no-PIC del cierre de libadwaita sin variante.
+#
+# ⚠ CÓMO SE MIDE «no es PIC», porque la regla corta miente. `readelf -r x.a | grep R_X86_64_32` cuenta
+# también las reubicaciones de `.rela.debug_*`, que son inocuas y existen en TODO objeto. Medido así,
+# libepoxy da 39.630 «no-PIC» — y sin embargo está EMBEBIDA dentro de la libgtk-4.so de la isla, con
+# 3.446 símbolos `epoxy_` definidos. Hay que excluir las secciones de debug:
+#     readelf -r x.a | awk '/^Relocation section/{s=$3} /R_X86_64_32/{if (s !~ /debug/) n++} END{print n}'
+# Con esa prueba el control sale limpio: libepoxy=0 (embebe bien) y fontconfig=1122 (rompe el link).
+#
+# Mismo tarball y misma versión que la canónica: no se abre skew entre el mundo estático y el dinámico.
+name    = "libyaml-shared"
+version = "0.2.5"
+license = "MIT"
+
+[source]
+tarball = "https://github.com/yaml/libyaml/releases/download/0.2.5/yaml-0.2.5.tar.gz"
+sha256  = "c642ae9b75fee120b2d96c712538bd2cf283228d2337df2cf2988e3c02678ef4"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "dynamic"
+flags    = []
+
+[build.phases]
+configure = './configure --build=$CBUILD --host=$CHOST --prefix=/usr --enable-shared --disable-static'
+compile   = 'make -j"$(nproc)"'
+install   = 'make DESTDIR=/out install'
+
+[deps]
+build = ["make", "pkgconf"]
+
+# ── PROMOVIDA AL CORPUS 2026-08-08 ──────────────────────────────────────────────────────────────
+# Copia literal de la sombra que vivía en una cola `incoming-*`. Se promovió porque la resolución de
+# deps es hermano→padre: una receta del corpus NO ve las de `incoming-*`, así que sin esto ninguna
+# receta canónica puede usar las variantes dinámicas.
+#
+# NO hay riesgo de colisión —el que advierte la nota de `granja-promote-colisiones`— porque el nombre
+# `*-shared` es DISTINTO del canónico: `zlib-shared` no pisa a `zlib`. Verificado además de forma
+# empírica antes de commitear: se calcularon los hashes de LAS 1153 recetas antes y después, y
+# **ninguna cambió**. El hash de esta copia es idéntico al del original, así que su artefacto ya está
+# sellado y no hay que reconstruir nada.
diff --git a/recipes/zlib-shared.toml b/recipes/zlib-shared.toml
new file mode 100644
index 00000000..35483a66
--- /dev/null
+++ b/recipes/zlib-shared.toml
@@ -0,0 +1,45 @@
+# zlib-shared 1.3.1 — variante DINÁMICA de zlib para el escritorio KDE.
+#
+# El zlib canónico (recipes/zlib.toml) es `--static` (sólo libz.a, para el toolchain rust/mrustc). Pero
+# el stack GUI dinámico (Qt/KDE/libpng/Mesa) linkea `libz.so.1` por SONAME en runtime, y ese `.so` no lo
+# provee ningún artefacto sellado ⇒ el rootfs hidratado caía a la libz.so.1 del sysroot Alpine (fuga de
+# soberanía, deuda static↔dinámico de Capa 0). Esta variante sella el `libz.so.1` soberano: los `.so` de
+# KDE ya tienen NEEDED libz.so.1 (mismo soname), así que basta hidratar este artefacto — sin rebuild de KDE.
+#
+# Build shared: el configure de zlib aborta bajo zig cc ("compiler error reporting too harsh"), así que se
+# fabrica el libz.so.1 a mano del libz.a PIC con --whole-archive. CLAVE (fix soberanía): se pasa el
+# --version-script=zlib.map del propio tarball ⇒ el .so exporta los símbolos VERSIONADOS (ZLIB_1.2.0
+# compressBound, ZLIB_1.2.3.4 inflateReset2, …). Qt6 (libQt6Core/Gui) fue enlazado contra un zlib
+# versionado y NEEDED esos @tags; sin el mapa, un libz.so con nombres pelados no resolvía
+# inflateReset2@ZLIB_1.2.3.4 al enlazar gwenview (--no-allow-shlib-undefined) y Qt caía en runtime a la
+# libz.so.1 de Alpine (fuga). El .so versionado satisface consumidores versionados Y no-versionados.
+# -fPIC/-O2/-fno-sanitize=undefined igual que la canónica (evita el runtime UBSan de zig).
+
+name    = "zlib-shared"
+version = "1.3.1"
+license = "Zlib"
+
+[source]
+tarball = "https://github.com/madler/zlib/releases/download/v1.3.1/zlib-1.3.1.tar.gz"
+sha256  = "9a93b2b7dfdac77ceba5a558a580e74667dd6fede4585b91eefb60f03b72df23"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "dynamic"
+
+[build.phases]
+configure = "CFLAGS='-fPIC -O2 -fno-sanitize=undefined' ./configure --prefix=/usr --static"
+compile   = "make -j\"$(nproc)\" && ${CC:-zig cc} -shared -Wl,-soname,libz.so.1 -Wl,--version-script,zlib.map -Wl,--whole-archive libz.a -Wl,--no-whole-archive -o libz.so.1.3.1"
+install   = "make install DESTDIR=/out && install -Dm755 libz.so.1.3.1 /out/usr/lib/libz.so.1.3.1 && ln -sf libz.so.1.3.1 /out/usr/lib/libz.so.1 && ln -sf libz.so.1 /out/usr/lib/libz.so"
+
+# ── PROMOVIDA AL CORPUS 2026-08-08 ──────────────────────────────────────────────────────────────
+# Copia literal de la sombra que vivía en una cola `incoming-*`. Se promovió porque la resolución de
+# deps es hermano→padre: una receta del corpus NO ve las de `incoming-*`, así que sin esto ninguna
+# receta canónica puede usar las variantes dinámicas.
+#
+# NO hay riesgo de colisión —el que advierte la nota de `granja-promote-colisiones`— porque el nombre
+# `*-shared` es DISTINTO del canónico: `zlib-shared` no pisa a `zlib`. Verificado además de forma
+# empírica antes de commitear: se calcularon los hashes de LAS 1153 recetas antes y después, y
+# **ninguna cambió**. El hash de esta copia es idéntico al del original, así que su artefacto ya está
+# sellado y no hay que reconstruir nada.