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

licencias: 994 de 1141 (87%) — cerradas las familias Qt, freedesktop, kernel.org y PyPI

Tercera tanda curada, agrupada por la URL DE FUENTE de cada receta (que es la evidencia que
el nombre no da): los once módulos Qt sin prefijo, freedesktop (dbus, libinput, libevdev,
libdisplay-info, poppler, pulseaudio, upower, NetworkManager, ModemManager, polkit),
kernel.org (los tres kernels, linux-headers, git, iproute2, libuuid) y PyPI.

Los kernels llevan `GPL-2.0-only WITH Linux-syscall-note` explícita. No es adorno: sin esa
excepción, todo binario de espacio de usuario que hace un syscall sería obra derivada del
kernel. Es exactamente el tipo de dato que un campo de licencia existe para no perder.

Quedan 147 sin declarar: 69 de GitHub donde la propia API dice NOASSERTION (hay que abrir
el fuente), 20 de tawasuyu —que son nuestras o del otro agente, así que la licencia la
decide el usuario, no yo— y el resto repartido en GNOME, gitlab.freedesktop y sueltos.
Más 71 con SPDX ambiguo pendientes de desambiguar (`licencias.sh --revisar`).

Hashes verificados otra vez sobre 20 recetas tocadas: 20 idénticos, 0 cambiados.

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

fe474dab636d4f43ea912ac0144e76bb83ba3717 · by sergio · (2 months ago) · parent a6a9d59e4 · browse the tree at this commit

Semantic delta

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

59 files · +110 −0

diff --git a/docs/licencias-conocidas.tsv b/docs/licencias-conocidas.tsv
index 30cbd431..4b99cc2c 100644
--- a/docs/licencias-conocidas.tsv
+++ b/docs/licencias-conocidas.tsv
@@ -343,3 +343,55 @@ spectacle	GPL-2.0-or-later
 filelight	GPL-2.0-or-later
 systemsettings	GPL-2.0-or-later
 powerdevil	GPL-2.0-or-later
+
+# ── Qt 6 sin prefijo (download.qt.io) — mismos términos que los qt6-* de arriba ────────────────
+qtbase	LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+qtdeclarative	LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+qtwayland	LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+qtsvg	LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+qtshadertools	LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+qtmultimedia	LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+qtpositioning	LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+qtlocation	LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+qtspeech	LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+qtlanguageserver	LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+qttools	LGPL-3.0-only OR GPL-3.0-only
+
+# ── freedesktop.org ────────────────────────────────────────────────────────────────────────────
+dbus	AFL-2.1 OR GPL-2.0-or-later
+dbus-shared	AFL-2.1 OR GPL-2.0-or-later
+hicolor-icon-theme	GPL-2.0-or-later
+libdisplay-info	MIT
+libevdev	MIT
+libinput	MIT
+libei	MIT
+libxcvt	MIT
+wlr-randr	MIT
+poppler	GPL-2.0-or-later
+pulseaudio	LGPL-2.1-or-later
+upower	GPL-2.0-or-later
+modemmanager	GPL-2.0-or-later
+networkmanager	GPL-2.0-or-later
+polkit	LGPL-2.0-or-later
+
+# ── kernel.org ─────────────────────────────────────────────────────────────────────────────────
+# El kernel lleva la excepción de llamadas al sistema: sin ella, todo binario de espacio de usuario
+# que hace un syscall sería obra derivada. Va explícita, no es adorno.
+linux-generic	GPL-2.0-only WITH Linux-syscall-note
+linux-metal	GPL-2.0-only WITH Linux-syscall-note
+linux-metal-dual	GPL-2.0-only WITH Linux-syscall-note
+linux-headers	GPL-2.0-only WITH Linux-syscall-note
+git	GPL-2.0-only
+iproute2	GPL-2.0-or-later
+libuuid-shared	BSD-3-Clause
+
+# ── PyPI y varios ──────────────────────────────────────────────────────────────────────────────
+mako	MIT
+markupsafe	BSD-3-Clause
+py3-markupsafe	BSD-3-Clause
+py3-jinja2	BSD-3-Clause
+py3-setuptools	MIT
+packaging	Apache-2.0 OR BSD-2-Clause
+nasm	BSD-2-Clause
+mpfr	LGPL-3.0-or-later
+lua	MIT
diff --git a/recipes/dbus.toml b/recipes/dbus.toml
index f564102c..c9903fc9 100644
--- a/recipes/dbus.toml
+++ b/recipes/dbus.toml
@@ -3,6 +3,7 @@
 # glib/xmlto eran de session-mgmt X11 + docs, opcionales). Build meson estático musl.
 name    = "dbus"
 version = "1.16.2"
+license = "AFL-2.1 OR GPL-2.0-or-later"
 
 [source]
 tarball = "https://dbus.freedesktop.org/releases/dbus/dbus-1.16.2.tar.xz"
diff --git a/recipes/git.toml b/recipes/git.toml
index 0ee50b06..a9777b27 100644
--- a/recipes/git.toml
+++ b/recipes/git.toml
@@ -3,6 +3,7 @@
 # sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
 name    = "git"
 version = "2.54.0"
+license = "GPL-2.0-only"
 
 [source]
 tarball = "https://www.kernel.org/pub/software/scm/git/git-2.54.0.tar.xz"
diff --git a/recipes/incoming-cosmic/dbus-shared.toml b/recipes/incoming-cosmic/dbus-shared.toml
index f139ed2b..e8521d80 100644
--- a/recipes/incoming-cosmic/dbus-shared.toml
+++ b/recipes/incoming-cosmic/dbus-shared.toml
@@ -15,6 +15,7 @@
 # artefacto siga trayendo dbus-daemon/dbus-run-session y pueda levantar un bus de verdad.
 name    = "dbus-shared"
 version = "1.16.2"
+license = "AFL-2.1 OR GPL-2.0-or-later"
 
 [source]
 tarball = "https://dbus.freedesktop.org/releases/dbus/dbus-1.16.2.tar.xz"
diff --git a/recipes/incoming-cosmic/hicolor-icon-theme.toml b/recipes/incoming-cosmic/hicolor-icon-theme.toml
index 243a9602..c734f6fa 100644
--- a/recipes/incoming-cosmic/hicolor-icon-theme.toml
+++ b/recipes/incoming-cosmic/hicolor-icon-theme.toml
@@ -14,6 +14,7 @@
 # `configure` (ni `configure.ac`). Un `./configure` heredado de la receta vieja sale con 127.
 name    = "hicolor-icon-theme"
 version = "0.18"
+license = "GPL-2.0-or-later"
 
 [source]
 tarball = "https://icon-theme.freedesktop.org/releases/hicolor-icon-theme-0.18.tar.xz"
diff --git a/recipes/incoming-cosmic/libdisplay-info.toml b/recipes/incoming-cosmic/libdisplay-info.toml
index 4b39558a..30b2fbc1 100644
--- a/recipes/incoming-cosmic/libdisplay-info.toml
+++ b/recipes/incoming-cosmic/libdisplay-info.toml
@@ -4,6 +4,7 @@
 # y meson `files()` EXIGE que exista ⇒ hwdata es dep de build. Sin di-edid-decode (tool) para evitar más deps.
 name    = "libdisplay-info"
 version = "0.2.0"
+license = "MIT"
 
 [source]
 tarball = "https://gitlab.freedesktop.org/emersion/libdisplay-info/-/archive/0.2.0/libdisplay-info-0.2.0.tar.gz"
diff --git a/recipes/incoming-cosmic/lua.toml b/recipes/incoming-cosmic/lua.toml
index 95c23872..3ff4e6bd 100644
--- a/recipes/incoming-cosmic/lua.toml
+++ b/recipes/incoming-cosmic/lua.toml
@@ -33,6 +33,7 @@
 # módulos C cargados por `require` vean la API de Lua, y acá el que exporta es la `.so`.
 name    = "lua"
 version = "5.4.8"
+license = "MIT"
 
 [source]
 tarball = "https://www.lua.org/ftp/lua-5.4.8.tar.gz"
diff --git a/recipes/incoming-cosmic/mpfr.toml b/recipes/incoming-cosmic/mpfr.toml
index bd98eca0..c92a5402 100644
--- a/recipes/incoming-cosmic/mpfr.toml
+++ b/recipes/incoming-cosmic/mpfr.toml
@@ -7,6 +7,7 @@
 # acá y no se da por sentado: los dos artefactos tienen que venir del mismo grafo.
 name    = "mpfr"
 version = "4.2.2"
+license = "LGPL-3.0-or-later"
 
 [source]
 tarball = "https://www.mpfr.org/mpfr-4.2.2/mpfr-4.2.2.tar.xz"
diff --git a/recipes/incoming-cosmic/nasm.toml b/recipes/incoming-cosmic/nasm.toml
index f047e0aa..acb068ba 100644
--- a/recipes/incoming-cosmic/nasm.toml
+++ b/recipes/incoming-cosmic/nasm.toml
@@ -2,6 +2,7 @@
 # varias libs de media más adelante. No está en el rootfs Alpine ni tenía receta. C plano, autotools.
 name    = "nasm"
 version = "2.16.03"
+license = "BSD-2-Clause"
 
 [source]
 tarball          = "https://www.nasm.us/pub/nasm/releasebuilds/2.16.03/nasm-2.16.03.tar.xz"
diff --git a/recipes/incoming-cosmic/pulseaudio.toml b/recipes/incoming-cosmic/pulseaudio.toml
index edd7c3ba..eb65b9fa 100644
--- a/recipes/incoming-cosmic/pulseaudio.toml
+++ b/recipes/incoming-cosmic/pulseaudio.toml
@@ -35,6 +35,7 @@
 # el resto de la onda: la C-ABI de logind se esquiva salvo en mutter.
 name    = "pulseaudio"
 version = "17.0"
+license = "LGPL-2.1-or-later"
 
 [source]
 tarball = "https://freedesktop.org/software/pulseaudio/releases/pulseaudio-17.0.tar.xz"
diff --git a/recipes/incoming-gnome-onda1/py3-setuptools.toml b/recipes/incoming-gnome-onda1/py3-setuptools.toml
index f556f544..21ac6f87 100644
--- a/recipes/incoming-gnome-onda1/py3-setuptools.toml
+++ b/recipes/incoming-gnome-onda1/py3-setuptools.toml
@@ -8,6 +8,7 @@
 # para que `_distutils_hack` se active y setuptools gane sobre el distutils del stdlib.
 name    = "py3-setuptools"
 version = "75.8.2"
+license = "MIT"
 
 [source]
 tarball = "https://files.pythonhosted.org/packages/source/s/setuptools/setuptools-75.8.2.tar.gz"
diff --git a/recipes/incoming-gnome-onda2/nasm.toml b/recipes/incoming-gnome-onda2/nasm.toml
index f047e0aa..acb068ba 100644
--- a/recipes/incoming-gnome-onda2/nasm.toml
+++ b/recipes/incoming-gnome-onda2/nasm.toml
@@ -2,6 +2,7 @@
 # varias libs de media más adelante. No está en el rootfs Alpine ni tenía receta. C plano, autotools.
 name    = "nasm"
 version = "2.16.03"
+license = "BSD-2-Clause"
 
 [source]
 tarball          = "https://www.nasm.us/pub/nasm/releasebuilds/2.16.03/nasm-2.16.03.tar.xz"
diff --git a/recipes/incoming-gnome-onda2/py3-setuptools.toml b/recipes/incoming-gnome-onda2/py3-setuptools.toml
index f556f544..21ac6f87 100644
--- a/recipes/incoming-gnome-onda2/py3-setuptools.toml
+++ b/recipes/incoming-gnome-onda2/py3-setuptools.toml
@@ -8,6 +8,7 @@
 # para que `_distutils_hack` se active y setuptools gane sobre el distutils del stdlib.
 name    = "py3-setuptools"
 version = "75.8.2"
+license = "MIT"
 
 [source]
 tarball = "https://files.pythonhosted.org/packages/source/s/setuptools/setuptools-75.8.2.tar.gz"
diff --git a/recipes/incoming-gnome/dbus-shared.toml b/recipes/incoming-gnome/dbus-shared.toml
index f139ed2b..e8521d80 100644
--- a/recipes/incoming-gnome/dbus-shared.toml
+++ b/recipes/incoming-gnome/dbus-shared.toml
@@ -15,6 +15,7 @@
 # artefacto siga trayendo dbus-daemon/dbus-run-session y pueda levantar un bus de verdad.
 name    = "dbus-shared"
 version = "1.16.2"
+license = "AFL-2.1 OR GPL-2.0-or-later"
 
 [source]
 tarball = "https://dbus.freedesktop.org/releases/dbus/dbus-1.16.2.tar.xz"
diff --git a/recipes/incoming-gnome/hicolor-icon-theme.toml b/recipes/incoming-gnome/hicolor-icon-theme.toml
index 243a9602..c734f6fa 100644
--- a/recipes/incoming-gnome/hicolor-icon-theme.toml
+++ b/recipes/incoming-gnome/hicolor-icon-theme.toml
@@ -14,6 +14,7 @@
 # `configure` (ni `configure.ac`). Un `./configure` heredado de la receta vieja sale con 127.
 name    = "hicolor-icon-theme"
 version = "0.18"
+license = "GPL-2.0-or-later"
 
 [source]
 tarball = "https://icon-theme.freedesktop.org/releases/hicolor-icon-theme-0.18.tar.xz"
diff --git a/recipes/incoming-gnome/libdisplay-info.toml b/recipes/incoming-gnome/libdisplay-info.toml
index 4b39558a..30b2fbc1 100644
--- a/recipes/incoming-gnome/libdisplay-info.toml
+++ b/recipes/incoming-gnome/libdisplay-info.toml
@@ -4,6 +4,7 @@
 # y meson `files()` EXIGE que exista ⇒ hwdata es dep de build. Sin di-edid-decode (tool) para evitar más deps.
 name    = "libdisplay-info"
 version = "0.2.0"
+license = "MIT"
 
 [source]
 tarball = "https://gitlab.freedesktop.org/emersion/libdisplay-info/-/archive/0.2.0/libdisplay-info-0.2.0.tar.gz"
diff --git a/recipes/incoming-gnome/libei.toml b/recipes/incoming-gnome/libei.toml
index 6a5dcba7..8a8262fe 100644
--- a/recipes/incoming-gnome/libei.toml
+++ b/recipes/incoming-gnome/libei.toml
@@ -16,6 +16,7 @@
 # usa oeffis, lo usan los clientes que piden permiso al portal.
 name    = "libei"
 version = "1.5.0"
+license = "MIT"
 
 [source]
 tarball = "http://deb.debian.org/debian/pool/main/libe/libei/libei_1.5.0.orig.tar.bz2"
diff --git a/recipes/incoming-gnome/libuuid-shared.toml b/recipes/incoming-gnome/libuuid-shared.toml
index bd0e830a..b01c916a 100644
--- a/recipes/incoming-gnome/libuuid-shared.toml
+++ b/recipes/incoming-gnome/libuuid-shared.toml
@@ -14,6 +14,7 @@
 # modo preprocesador (`-dM -E -`) y los generadores errnos.h/syscalls.h lo invocan así.
 name    = "libuuid-shared"
 version = "2.42.2"
+license = "BSD-3-Clause"
 
 [source]
 tarball = "https://www.kernel.org/pub/linux/utils/util-linux/v2.42/util-linux-2.42.2.tar.xz"
diff --git a/recipes/incoming-gnome/libxcvt.toml b/recipes/incoming-gnome/libxcvt.toml
index ad2330f9..c36283f1 100644
--- a/recipes/incoming-gnome/libxcvt.toml
+++ b/recipes/incoming-gnome/libxcvt.toml
@@ -12,6 +12,7 @@
 # que es lo único que el script de mutter parsea.
 name    = "libxcvt"
 version = "0.1.3"
+license = "MIT"
 
 [source]
 tarball = "http://deb.debian.org/debian/pool/main/libx/libxcvt/libxcvt_0.1.3.orig.tar.xz"
diff --git a/recipes/incoming-gnome/lua.toml b/recipes/incoming-gnome/lua.toml
index 95c23872..3ff4e6bd 100644
--- a/recipes/incoming-gnome/lua.toml
+++ b/recipes/incoming-gnome/lua.toml
@@ -33,6 +33,7 @@
 # módulos C cargados por `require` vean la API de Lua, y acá el que exporta es la `.so`.
 name    = "lua"
 version = "5.4.8"
+license = "MIT"
 
 [source]
 tarball = "https://www.lua.org/ftp/lua-5.4.8.tar.gz"
diff --git a/recipes/incoming-gnome/nasm.toml b/recipes/incoming-gnome/nasm.toml
index f047e0aa..acb068ba 100644
--- a/recipes/incoming-gnome/nasm.toml
+++ b/recipes/incoming-gnome/nasm.toml
@@ -2,6 +2,7 @@
 # varias libs de media más adelante. No está en el rootfs Alpine ni tenía receta. C plano, autotools.
 name    = "nasm"
 version = "2.16.03"
+license = "BSD-2-Clause"
 
 [source]
 tarball          = "https://www.nasm.us/pub/nasm/releasebuilds/2.16.03/nasm-2.16.03.tar.xz"
diff --git a/recipes/incoming-gnome/polkit.toml b/recipes/incoming-gnome/polkit.toml
index ed089e47..c4de81aa 100644
--- a/recipes/incoming-gnome/polkit.toml
+++ b/recipes/incoming-gnome/polkit.toml
@@ -22,6 +22,7 @@
 # (la lección que costó los SIGSEGV de colord).
 name    = "polkit"
 version = "127"
+license = "LGPL-2.0-or-later"
 
 [source]
 # El .orig.tar.gz inmutable del pool de Debian. El proyecto se mudó a github.com/polkit-org/polkit y
diff --git a/recipes/incoming-gnome/pulseaudio.toml b/recipes/incoming-gnome/pulseaudio.toml
index edd7c3ba..eb65b9fa 100644
--- a/recipes/incoming-gnome/pulseaudio.toml
+++ b/recipes/incoming-gnome/pulseaudio.toml
@@ -35,6 +35,7 @@
 # el resto de la onda: la C-ABI de logind se esquiva salvo en mutter.
 name    = "pulseaudio"
 version = "17.0"
+license = "LGPL-2.1-or-later"
 
 [source]
 tarball = "https://freedesktop.org/software/pulseaudio/releases/pulseaudio-17.0.tar.xz"
diff --git a/recipes/incoming-gnome/py3-jinja2.toml b/recipes/incoming-gnome/py3-jinja2.toml
index efb1a0f3..b262c2de 100644
--- a/recipes/incoming-gnome/py3-jinja2.toml
+++ b/recipes/incoming-gnome/py3-jinja2.toml
@@ -9,6 +9,7 @@
 # wheel/pip; la fuente ES el árbol Python). markupsafe es su única dep.
 name    = "py3-jinja2"
 version = "3.1.6"
+license = "BSD-3-Clause"
 
 [source]
 tarball = "https://files.pythonhosted.org/packages/source/J/Jinja2/jinja2-3.1.6.tar.gz"
diff --git a/recipes/incoming-gnome/py3-markupsafe.toml b/recipes/incoming-gnome/py3-markupsafe.toml
index a37a8993..21d2c2fc 100644
--- a/recipes/incoming-gnome/py3-markupsafe.toml
+++ b/recipes/incoming-gnome/py3-markupsafe.toml
@@ -7,6 +7,7 @@
 # una extensión C en un build-tool que corre unas pocas veces.
 name    = "py3-markupsafe"
 version = "3.0.2"
+license = "BSD-3-Clause"
 
 [source]
 tarball = "https://files.pythonhosted.org/packages/source/M/MarkupSafe/markupsafe-3.0.2.tar.gz"
diff --git a/recipes/incoming-gnome/py3-setuptools.toml b/recipes/incoming-gnome/py3-setuptools.toml
index f556f544..21ac6f87 100644
--- a/recipes/incoming-gnome/py3-setuptools.toml
+++ b/recipes/incoming-gnome/py3-setuptools.toml
@@ -8,6 +8,7 @@
 # para que `_distutils_hack` se active y setuptools gane sobre el distutils del stdlib.
 name    = "py3-setuptools"
 version = "75.8.2"
+license = "MIT"
 
 [source]
 tarball = "https://files.pythonhosted.org/packages/source/s/setuptools/setuptools-75.8.2.tar.gz"
diff --git a/recipes/incoming-gnome/upower.toml b/recipes/incoming-gnome/upower.toml
index f6c4e364..aa64d55b 100644
--- a/recipes/incoming-gnome/upower.toml
+++ b/recipes/incoming-gnome/upower.toml
@@ -30,6 +30,7 @@
 # ISLA DINÁMICA: el typelib nombra `libupower-glib.so.3` y gjs la dlopea.
 name    = "upower"
 version = "1.90.10"
+license = "GPL-2.0-or-later"
 
 [source]
 tarball = "https://gitlab.freedesktop.org/upower/upower/-/archive/v1.90.10/upower-v1.90.10.tar.gz"
diff --git a/recipes/incoming-kde/dbus.toml b/recipes/incoming-kde/dbus.toml
index 5022b758..b172e16f 100644
--- a/recipes/incoming-kde/dbus.toml
+++ b/recipes/incoming-kde/dbus.toml
@@ -5,6 +5,7 @@
 # tools=false: sólo la lib para construir Qt6DBus; el dbus-daemon (runtime de la sesión) se añade luego.
 name    = "dbus"
 version = "1.16.2"
+license = "AFL-2.1 OR GPL-2.0-or-later"
 
 [source]
 tarball = "https://dbus.freedesktop.org/releases/dbus/dbus-1.16.2.tar.xz"
diff --git a/recipes/incoming-kde/libdisplay-info.toml b/recipes/incoming-kde/libdisplay-info.toml
index 4b39558a..30b2fbc1 100644
--- a/recipes/incoming-kde/libdisplay-info.toml
+++ b/recipes/incoming-kde/libdisplay-info.toml
@@ -4,6 +4,7 @@
 # y meson `files()` EXIGE que exista ⇒ hwdata es dep de build. Sin di-edid-decode (tool) para evitar más deps.
 name    = "libdisplay-info"
 version = "0.2.0"
+license = "MIT"
 
 [source]
 tarball = "https://gitlab.freedesktop.org/emersion/libdisplay-info/-/archive/0.2.0/libdisplay-info-0.2.0.tar.gz"
diff --git a/recipes/incoming-kde/libevdev.toml b/recipes/incoming-kde/libevdev.toml
index 95ebb513..2baa6e61 100644
--- a/recipes/incoming-kde/libevdev.toml
+++ b/recipes/incoming-kde/libevdev.toml
@@ -4,6 +4,7 @@
 # Dep de build de libinput (que kwin exige ≥1.28). Autotools.
 name    = "libevdev"
 version = "1.13.4"
+license = "MIT"
 
 [source]
 tarball = "https://www.freedesktop.org/software/libevdev/libevdev-1.13.4.tar.xz"
diff --git a/recipes/incoming-kde/libinput.toml b/recipes/incoming-kde/libinput.toml
index 0931464b..26d376c4 100644
--- a/recipes/incoming-kde/libinput.toml
+++ b/recipes/incoming-kde/libinput.toml
@@ -4,6 +4,7 @@
 # Recorte: sin libwacom, sin debug-gui (GTK), sin tests ni docs. Deps ya selladas.
 name    = "libinput"
 version = "1.28.1"
+license = "MIT"
 
 [source]
 tarball = "https://gitlab.freedesktop.org/libinput/libinput/-/archive/1.28.1/libinput-1.28.1.tar.gz"
diff --git a/recipes/incoming-kde/libxcvt.toml b/recipes/incoming-kde/libxcvt.toml
index 247eb666..28cfc7cb 100644
--- a/recipes/incoming-kde/libxcvt.toml
+++ b/recipes/incoming-kde/libxcvt.toml
@@ -3,6 +3,7 @@
 # Meson, sin deps externas (sólo libm). Las man pages se generan con configure_file (sin asciidoc/xmlto).
 name    = "libxcvt"
 version = "0.1.3"
+license = "MIT"
 
 [source]
 tarball = "https://gitlab.freedesktop.org/xorg/lib/libxcvt/-/archive/libxcvt-0.1.3/libxcvt-libxcvt-0.1.3.tar.gz"
diff --git a/recipes/incoming-kde/modemmanager.toml b/recipes/incoming-kde/modemmanager.toml
index ffdb5bf7..158c0a5e 100644
--- a/recipes/incoming-kde/modemmanager.toml
+++ b/recipes/incoming-kde/modemmanager.toml
@@ -8,6 +8,7 @@
 # Deps duras: gio (glib-shared, deuda Capa 0 saldada) + libudev (libudev-zero ya sellado).
 name    = "modemmanager"
 version = "1.22.0"
+license = "GPL-2.0-or-later"
 
 [source]
 tarball = "https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/archive/1.22.0/ModemManager-1.22.0.tar.gz"
diff --git a/recipes/incoming-kde/mpfr.toml b/recipes/incoming-kde/mpfr.toml
index 35e51b92..945e6c71 100644
--- a/recipes/incoming-kde/mpfr.toml
+++ b/recipes/incoming-kde/mpfr.toml
@@ -9,6 +9,7 @@
 # pero se explicita para determinismo.
 name    = "mpfr"
 version = "4.2.2"
+license = "LGPL-3.0-or-later"
 
 [source]
 tarball = "https://ftp.gnu.org/gnu/mpfr/mpfr-4.2.2.tar.xz"
diff --git a/recipes/incoming-kde/networkmanager.toml b/recipes/incoming-kde/networkmanager.toml
index 78a8ecc1..5ee13593 100644
--- a/recipes/incoming-kde/networkmanager.toml
+++ b/recipes/incoming-kde/networkmanager.toml
@@ -16,6 +16,7 @@
 # sin introspection/docs/tests/ebpf/firewalld.
 name    = "networkmanager"
 version = "1.52.0"
+license = "GPL-2.0-or-later"
 
 [source]
 tarball = "https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/archive/1.52.0/NetworkManager-1.52.0.tar.gz"
diff --git a/recipes/incoming-kde/poppler.toml b/recipes/incoming-kde/poppler.toml
index 8b78abd4..461a12d8 100644
--- a/recipes/incoming-kde/poppler.toml
+++ b/recipes/incoming-kde/poppler.toml
@@ -9,6 +9,7 @@
 # (DCTDECODER) + libpng-shared + zlib-shared.
 name    = "poppler"
 version = "25.02.0"
+license = "GPL-2.0-or-later"
 
 [source]
 tarball = "https://poppler.freedesktop.org/poppler-25.02.0.tar.xz"
diff --git a/recipes/incoming-kde/pulseaudio.toml b/recipes/incoming-kde/pulseaudio.toml
index dbd93797..cfd65a36 100644
--- a/recipes/incoming-kde/pulseaudio.toml
+++ b/recipes/incoming-kde/pulseaudio.toml
@@ -11,6 +11,7 @@
 # variante glib-shared (deuda Capa 0 saldada). dbus=enabled para el protocolo.
 name    = "pulseaudio"
 version = "17.0"
+license = "LGPL-2.1-or-later"
 
 [source]
 tarball = "https://freedesktop.org/software/pulseaudio/releases/pulseaudio-17.0.tar.xz"
diff --git a/recipes/incoming-kde/qtbase.toml b/recipes/incoming-kde/qtbase.toml
index bf889a6c..1c56fbfe 100644
--- a/recipes/incoming-kde/qtbase.toml
+++ b/recipes/incoming-kde/qtbase.toml
@@ -18,6 +18,7 @@
 # IPO/LTO OFF para el gate: reduce riesgo y tiempo; se puede reactivar tras validar.
 name    = "qt6-qtbase"
 version = "6.11.1"
+license = "LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"
 
 [source]
 tarball = "https://download.qt.io/official_releases/qt/6.11/6.11.1/submodules/qtbase-everywhere-src-6.11.1.tar.xz"
diff --git a/recipes/incoming-kde/qtdeclarative.toml b/recipes/incoming-kde/qtdeclarative.toml
index 305907a0..b5f79f04 100644
--- a/recipes/incoming-kde/qtdeclarative.toml
+++ b/recipes/incoming-kde/qtdeclarative.toml
@@ -4,6 +4,7 @@
 # qtsvg + qtlanguageserver (qmlls). Conserva el parche de Alpine (QQmlTableInstanceModel).
 name    = "qt6-qtdeclarative"
 version = "6.11.1"
+license = "LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"
 
 [source]
 tarball = "https://download.qt.io/official_releases/qt/6.11/6.11.1/submodules/qtdeclarative-everywhere-src-6.11.1.tar.xz"
diff --git a/recipes/incoming-kde/qtlanguageserver.toml b/recipes/incoming-kde/qtlanguageserver.toml
index 58a9ba6d..955b7721 100644
--- a/recipes/incoming-kde/qtlanguageserver.toml
+++ b/recipes/incoming-kde/qtlanguageserver.toml
@@ -2,6 +2,7 @@
 # qtdeclarative. Campaña KDE (ADR 0011), Capa 1. Módulo sin GUI (sólo Core). Patrón Qt del gate H-Qt.
 name    = "qt6-qtlanguageserver"
 version = "6.11.1"
+license = "LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"
 
 [source]
 tarball = "https://download.qt.io/official_releases/qt/6.11/6.11.1/submodules/qtlanguageserver-everywhere-src-6.11.1.tar.xz"
diff --git a/recipes/incoming-kde/qtlocation.toml b/recipes/incoming-kde/qtlocation.toml
index 665f60f4..7ffa353b 100644
--- a/recipes/incoming-kde/qtlocation.toml
+++ b/recipes/incoming-kde/qtlocation.toml
@@ -3,6 +3,7 @@
 # PREFIX_PATH). Depende de qtpositioning (sellado) + qtdeclarative + qtshadertools (mapas QML/shaders).
 name    = "qt6-qtlocation"
 version = "6.11.1"
+license = "LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"
 
 [source]
 tarball = "https://download.qt.io/official_releases/qt/6.11/6.11.1/submodules/qtlocation-everywhere-src-6.11.1.tar.xz"
diff --git a/recipes/incoming-kde/qtmultimedia.toml b/recipes/incoming-kde/qtmultimedia.toml
index 8437040c..6b1164d4 100644
--- a/recipes/incoming-kde/qtmultimedia.toml
+++ b/recipes/incoming-kde/qtmultimedia.toml
@@ -3,6 +3,7 @@
 # son FEATURES autodetectadas (no REQUIRED) → build mínimo sin backend (dummy). Molde módulo Qt.
 name    = "qtmultimedia"
 version = "6.11.1"
+license = "LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"
 
 [source]
 tarball = "https://download.qt.io/official_releases/qt/6.11/6.11.1/submodules/qtmultimedia-everywhere-src-6.11.1.tar.xz"
diff --git a/recipes/incoming-kde/qtpositioning.toml b/recipes/incoming-kde/qtpositioning.toml
index f3960e1a..40625ecf 100644
--- a/recipes/incoming-kde/qtpositioning.toml
+++ b/recipes/incoming-kde/qtpositioning.toml
@@ -4,6 +4,7 @@
 # omite → sólo desactiva backends serie de GPS). Quick/Qml opcionales via qtdeclarative.
 name    = "qt6-qtpositioning"
 version = "6.11.1"
+license = "LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"
 
 [source]
 tarball = "https://download.qt.io/official_releases/qt/6.11/6.11.1/submodules/qtpositioning-everywhere-src-6.11.1.tar.xz"
diff --git a/recipes/incoming-kde/qtshadertools.toml b/recipes/incoming-kde/qtshadertools.toml
index 7a63a75d..42ca706c 100644
--- a/recipes/incoming-kde/qtshadertools.toml
+++ b/recipes/incoming-kde/qtshadertools.toml
@@ -4,6 +4,7 @@
 # el Qt6 sellado, examples/tests off. Linkea contra qtbase .so ⇒ sin la fricción static-PIC de qtbase.
 name    = "qt6-qtshadertools"
 version = "6.11.1"
+license = "LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"
 
 [source]
 tarball = "https://download.qt.io/official_releases/qt/6.11/6.11.1/submodules/qtshadertools-everywhere-src-6.11.1.tar.xz"
diff --git a/recipes/incoming-kde/qtspeech.toml b/recipes/incoming-kde/qtspeech.toml
index e03ff42d..8c502e88 100644
--- a/recipes/incoming-kde/qtspeech.toml
+++ b/recipes/incoming-kde/qtspeech.toml
@@ -11,6 +11,7 @@
 # Es el sub-blocker nuevo de qtspeech (no speech-dispatcher, que es opcional).
 name    = "qt6-qtspeech"
 version = "6.11.1"
+license = "LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"
 
 [source]
 tarball = "https://download.qt.io/official_releases/qt/6.11/6.11.1/submodules/qtspeech-everywhere-src-6.11.1.tar.xz"
diff --git a/recipes/incoming-kde/qtsvg.toml b/recipes/incoming-kde/qtsvg.toml
index 0168929a..694a0f3b 100644
--- a/recipes/incoming-kde/qtsvg.toml
+++ b/recipes/incoming-kde/qtsvg.toml
@@ -2,6 +2,7 @@
 # (ADR 0011), Capa 1. Patrón Qt del gate H-Qt (dinámico, wrappers zig, Qt6 sellado vía PREFIX_PATH).
 name    = "qt6-qtsvg"
 version = "6.11.1"
+license = "LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"
 
 [source]
 tarball = "https://download.qt.io/official_releases/qt/6.11/6.11.1/submodules/qtsvg-everywhere-src-6.11.1.tar.xz"
diff --git a/recipes/incoming-kde/qttools.toml b/recipes/incoming-kde/qttools.toml
index da129134..ddb358a3 100644
--- a/recipes/incoming-kde/qttools.toml
+++ b/recipes/incoming-kde/qttools.toml
@@ -4,6 +4,7 @@
 # + set Gui (linguist linkea Widgets) + dbus (tools cargan Qt6DBus).
 name    = "qt6-qttools"
 version = "6.11.1"
+license = "LGPL-3.0-only OR GPL-3.0-only"
 
 [source]
 tarball = "https://download.qt.io/official_releases/qt/6.11/6.11.1/submodules/qttools-everywhere-src-6.11.1.tar.xz"
diff --git a/recipes/incoming-kde/qtwayland.toml b/recipes/incoming-kde/qtwayland.toml
index 9d4e9ee8..009e770b 100644
--- a/recipes/incoming-kde/qtwayland.toml
+++ b/recipes/incoming-kde/qtwayland.toml
@@ -6,6 +6,7 @@
 # set X11 la compilación de hardwareintegration/wayland-egl aborta en <X11/Xlib.h> (falla previa conocida).
 name    = "qt6-qtwayland"
 version = "6.11.1"
+license = "LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"
 
 [source]
 tarball = "https://download.qt.io/official_releases/qt/6.11/6.11.1/submodules/qtwayland-everywhere-src-6.11.1.tar.xz"
diff --git a/recipes/iproute2.toml b/recipes/iproute2.toml
index 02cad4fe..28e41a8d 100644
--- a/recipes/iproute2.toml
+++ b/recipes/iproute2.toml
@@ -3,6 +3,7 @@
 # sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
 name    = "iproute2"
 version = "7.1.0"
+license = "GPL-2.0-or-later"
 
 [source]
 tarball = "https://kernel.org/pub/linux/utils/net/iproute2/iproute2-7.1.0.tar.xz"
diff --git a/recipes/libevdev.toml b/recipes/libevdev.toml
index 41570392..78451f31 100644
--- a/recipes/libevdev.toml
+++ b/recipes/libevdev.toml
@@ -2,6 +2,7 @@
 # Sin docs (evita doxygen) ni tests.
 name    = "libevdev"
 version = "1.13.4"
+license = "MIT"
 
 [source]
 tarball = "https://www.freedesktop.org/software/libevdev/libevdev-1.13.4.tar.xz"
diff --git a/recipes/libinput.toml b/recipes/libinput.toml
index 6a8fc0de..c3ec98df 100644
--- a/recipes/libinput.toml
+++ b/recipes/libinput.toml
@@ -4,6 +4,7 @@
 # Deps: libudev (libudev-zero), libevdev, mtdev.
 name    = "libinput"
 version = "1.27.1"
+license = "MIT"
 
 [source]
 tarball = "https://gitlab.freedesktop.org/libinput/libinput/-/archive/1.27.1/libinput-1.27.1.tar.gz"
diff --git a/recipes/linux-generic.toml b/recipes/linux-generic.toml
index ac77c56f..e2bca16c 100644
--- a/recipes/linux-generic.toml
+++ b/recipes/linux-generic.toml
@@ -23,6 +23,7 @@
 
 name    = "linux-generic"
 version = "7.1.2"
+license = "GPL-2.0-only WITH Linux-syscall-note"
 
 [source]
 tarball = "https://mirrors.edge.kernel.org/pub/linux/kernel/v7.x/linux-7.1.2.tar.gz"
diff --git a/recipes/linux-headers.toml b/recipes/linux-headers.toml
index 433d87c4..0066af92 100644
--- a/recipes/linux-headers.toml
+++ b/recipes/linux-headers.toml
@@ -19,6 +19,7 @@
 
 name    = "linux-headers"
 version = "6.16.12"
+license = "GPL-2.0-only WITH Linux-syscall-note"
 
 [source]
 tarball = "https://mirrors.edge.kernel.org/pub/linux/kernel/v6.x/linux-6.16.12.tar.gz"
diff --git a/recipes/linux-metal-dual.toml b/recipes/linux-metal-dual.toml
index 4ceda80a..6fcb6b91 100644
--- a/recipes/linux-metal-dual.toml
+++ b/recipes/linux-metal-dual.toml
@@ -31,6 +31,7 @@
 
 name    = "linux-metal-dual"
 version = "7.1.2"
+license = "GPL-2.0-only WITH Linux-syscall-note"
 
 [source]
 tarball = "https://mirrors.edge.kernel.org/pub/linux/kernel/v7.x/linux-7.1.2.tar.gz"
diff --git a/recipes/linux-metal.toml b/recipes/linux-metal.toml
index 50b06de9..f1d8fb7a 100644
--- a/recipes/linux-metal.toml
+++ b/recipes/linux-metal.toml
@@ -84,6 +84,7 @@
 
 name    = "linux-metal"
 version = "6.16.12"
+license = "GPL-2.0-only WITH Linux-syscall-note"
 
 [source]
 tarball = "https://mirrors.edge.kernel.org/pub/linux/kernel/v6.x/linux-6.16.12.tar.gz"
diff --git a/recipes/mako.toml b/recipes/mako.toml
index 6c9406cb..24f16680 100644
--- a/recipes/mako.toml
+++ b/recipes/mako.toml
@@ -3,6 +3,7 @@
 # `mako/filters.py` importa `markupsafe` a nivel de módulo ⇒ markupsafe es dep de runtime.
 name    = "mako"
 version = "1.3.12"
+license = "MIT"
 
 [source]
 tarball = "https://files.pythonhosted.org/packages/00/62/791b31e69ae182791ec67f04850f2f062716bbd205483d63a215f3e062d3/mako-1.3.12.tar.gz"
diff --git a/recipes/markupsafe.toml b/recipes/markupsafe.toml
index 3cfc0868..d1ca5df4 100644
--- a/recipes/markupsafe.toml
+++ b/recipes/markupsafe.toml
@@ -4,6 +4,7 @@
 # python3.12. python3 es dep de runtime.
 name    = "markupsafe"
 version = "3.0.3"
+license = "BSD-3-Clause"
 
 [source]
 tarball = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz"
diff --git a/recipes/packaging.toml b/recipes/packaging.toml
index d34b3146..ce898d44 100644
--- a/recipes/packaging.toml
+++ b/recipes/packaging.toml
@@ -4,6 +4,7 @@
 # Mismo patrón que mako/markupsafe/meson: se copia el paquete a site-packages, sin pip/wheel.
 name    = "packaging"
 version = "26.2"
+license = "Apache-2.0 OR BSD-2-Clause"
 
 [source]
 tarball = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz"
diff --git a/recipes/wlr-randr.toml b/recipes/wlr-randr.toml
index b59b5448..764adf05 100644
--- a/recipes/wlr-randr.toml
+++ b/recipes/wlr-randr.toml
@@ -25,6 +25,7 @@
 
 name    = "wlr-randr"
 version = "0.5.0"
+license = "MIT"
 
 [source]
 # Tarball de RELEASE, no el `-/archive/` autogenerado de GitLab: los archivos