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 1389Shell 137Markdown 80Rust 802602 Definiciones

licencias: la declaración del autor manda — y arreglo 5 recetas que ROMPÍ y commiteé

Dos cosas: una mejora de calidad y un fallo mío que hay que contar entero.

═══ EL FALLO: escribí un error JSON dentro de 5 recetas y las commiteé rotas ═══
En `a6a9d59`, cinco recetas quedaron con
    license = "{"message":"Not Found","documentation_url":"...","status":"404"}"
Causa: cuando el repo da 404 (renombrado, borrado, privado), `gh api` escribe el CUERPO DEL
ERROR en stdout y el filtro `--jq` falla, así que la variable queda valiendo el JSON. Mi
`case` sólo descartaba ""/null/NOASSERTION/other ⇒ el JSON pasó como si fuera una licencia.
Las comillas ROMPEN el TOML, y esas 5 recetas dejaron de parsear y de tener ArtifactHash.

No lo vio nadie leyendo: lo cazó la comparación de hashes, al detectar que `cargo-sort`
había cambiado. Afectadas: cargo-sort, cargo-audit, cargo-binstall, waybackurls, usbutils.

La lección no es «se me pasó un caso», es que **validé los «no sé» conocidos en vez de la
FORMA del dato**. Ahora se acepta sólo lo que tiene forma de expresión SPDX, y la barrera
está en los DOS sitios que escriben (detectar y sembrar), más un GUARDIÁN en el informe que
sale ≠0 si alguna licencia tiene forma imposible. Un fallo aguas arriba disfrazado de dato
hay que verlo sin buscarlo.

Y de paso normalizadas 11 licencias con la barra antigua de Cargo (`MIT/Apache-2.0`), que
no es SPDX válido. Traducir la barra a OR no es inferir: Cargo documentó esa equivalencia.

═══ LA MEJORA: `scripts/licencias-cargo.sh` ═══
Lee la licencia que el AUTOR declara en su Cargo.toml, pidiéndola AL TAG QUE LA RECETA
PINEA (`?ref=v<version>`, con HEAD como último recurso y anotando cuál se usó). 176
obtenidas, 167 al tag exacto. Es la fuente más autoritativa de las que usamos y corrige los
dos defectos de la detección por API de una vez:
 · las licencias DOBLES dejan de colapsar: `fd` pasa de `Apache-2.0` a `MIT OR Apache-2.0`,
   `ripgrep` a `Unlicense OR MIT`, `bat` a `MIT OR Apache-2.0`;
 · los SPDX AMBIGUOS caen de 71 a 55, porque el autor sí escribe -only/-or-later.
66 corregidas, 7 nuevas. Y aparecieron cosas que la detección había perdido: `eza` es
EUPL-1.2, una copyleft europea que se habría empaquetado creyendo otra cosa.

Jerarquía de evidencia, escrita en la cabecera del script: nombre (prohibido) < familia/URL
de fuente < API de licencias de GitHub < Cargo.toml del autor.

997 de 1141 (87%). Verificación COMPLETA sobre las 77 recetas tocadas —no una muestra—:
0 hashes cambiados, y 5 que ahora parsean y en HEAD no.

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

c8d1357f06e526696b07d5815a5334537f8cf683 · por sergio · (hace 2 meses) · padre 5e42d201b · ver el árbol en este commit

Delta semántico

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

81 archivos · +389 −73

diff --git a/docs/licencias-cargo.tsv b/docs/licencias-cargo.tsv
new file mode 100644
index 00000000..62660d17
--- /dev/null
+++ b/docs/licencias-cargo.tsv
@@ -0,0 +1,185 @@
+# licencias-cargo.tsv — GENERADO por scripts/licencias-cargo.sh. No editar a mano.
+#
+# La licencia que el AUTOR declara en su Cargo.toml: expresión SPDX escrita por quien tiene
+# la potestad de licenciar. Sin ambigüedad -only/-or-later y SIN colapsar las dobles ⇒ manda
+# sobre la detección por API de GitHub, que pierde ambas cosas. Sembrar con FORZAR=1.
+#
+# Tercera columna = el ref con el que se resolvió. Un tag concreto significa que el dato es
+# de la VERSIÓN QUE EMPAQUETAMOS; 'HEAD(aprox)' que no se halló el tag y puede diferir.
+# Total 176 · al tag exacto 167 · aproximadas 9
+aichat	MIT OR Apache-2.0	v0.30.0
+angle-grinder	MIT	v0.19.6
+atac	MIT	v0.23.0
+bacon	AGPL-3.0	v3.23.0
+bandwhich	MIT	v0.23.1
+bat	MIT OR Apache-2.0	v0.26.1
+bingrep	MIT	v0.12.1
+bob-nvim	MIT	v4.1.7
+bottom	MIT	0.12.3
+broot	MIT	v1.57.0
+caligula	GPL-3.0	v0.5.0
+cargo-bloat	MIT	v0.12.1
+cargo-bundle-licenses	MIT/Apache-2.0	v4.2.0
+cargo-cache	MIT/Apache-2.0	0.8.3
+cargo-careful	MIT OR Apache-2.0	v0.4.10
+cargo-criterion	Apache-2.0/MIT	1.1.0
+cargo-deb	MIT	v3.7.0
+cargo-deny	MIT OR Apache-2.0	0.19.9
+cargo-edit	Apache-2.0 OR MIT	v0.13.11
+cargo-expand	MIT OR Apache-2.0	1.0.122
+cargo-feature	MIT	v0.7.0
+cargo-features-manager	MIT	v0.11.0
+cargo-flamegraph	MIT OR Apache-2.0	v0.6.13
+cargo-fuzz	MIT OR Apache-2.0	0.13.2
+cargo-generate	MIT OR Apache-2.0	v0.23.9
+cargo-hack	Apache-2.0 OR MIT	v0.6.45
+cargo-llvm-cov	Apache-2.0 OR MIT	v0.8.5
+cargo-llvm-lines	MIT OR Apache-2.0	0.4.46
+cargo-machete	MIT	v0.9.2
+cargo-make	Apache-2.0	0.37.24
+cargo-modules	MPL-2.0	v0.26.0
+cargo-msrv	Apache-2.0 OR MIT	v0.19.3
+cargo-mutants	MIT	v27.1.0
+cargo-ndk	Apache-2.0 OR MIT	v4.1.2
+cargo-outdated	MIT	v0.19.0
+cargo-readme	MIT OR Apache-2.0	v3.3.2
+cargo-semver-checks	Apache-2.0 OR MIT	v0.48.0
+cargo-sort	MIT/Apache-2.0	v2.1.3
+cargo-supply-chain	Apache-2.0 OR MIT OR Zlib	v0.3.4
+cargo-sweep	MIT	v0.8.0
+cargo-temp	MIT OR Apache-2.0	v0.4.1
+cargo-udeps	MIT OR Apache-2.0	v0.1.61
+cargo-watch	CC0-1.0	v8.5.3
+cargo-wipe	MIT	v0.4.0
+cargo-wizard	MIT	v0.2.3
+cargo-zigbuild	MIT	v0.22.3
+cbindgen	MPL-2.0	v0.27.0
+choose	GPL-3.0-or-later	v1.3.7
+cobalt	MIT	v0.20.4
+comrak	BSD-2-Clause	v0.52.0
+cosmic-comp	GPL-3.0-only	HEAD(aprox)
+cosmic-edit	GPL-3.0-only	HEAD(aprox)
+cosmic-files	GPL-3.0-only	HEAD(aprox)
+cosmic-osd	GPL-3.0-or-later	HEAD(aprox)
+cosmic-session	GPL-3.0-only	HEAD(aprox)
+cosmic-settings-daemon	GPL-3.0-or-later	HEAD(aprox)
+cosmic-term	GPL-3.0-only	HEAD(aprox)
+cpc	MIT	v3.0.0
+csview	MIT OR Apache-2.0	v1.3.4
+csvlens	MIT	v0.13.0
+dalfox	MIT	v3.1.2
+ddh	LGPL-3.0	0.13.0
+delta	MIT	0.19.2
+difftastic	MIT	0.69.0
+diffutils	MIT OR Apache-2.0	v0.5.0
+diskus	MIT/Apache-2.0	v0.9.0
+dotter	Unlicense	v0.13.4
+dua	MIT	v2.34.0
+dufs	MIT OR Apache-2.0	v0.46.0
+dust	Apache-2.0	v1.2.4
+erdtree	MIT	v3.1.2
+eza	EUPL-1.2	v0.23.4
+fastmod	Apache-2.0	v0.4.4
+fblog	WTFPL	v4.17.0
+fd	MIT OR Apache-2.0	v10.4.2
+feroxbuster	MIT	v2.13.1
+findutils	MIT	0.9.1
+findutils-xargs	MIT	0.9.1
+fnm	GPL-3.0	v1.39.0
+fselect	MIT OR Apache-2.0	0.10.1
+genact	MIT	v1.5.1
+git-absorb	BSD-3-Clause	0.9.0
+git-graph	MIT	v0.7.0
+git-igitt	MIT	v0.1.21
+gitoxide	MIT OR Apache-2.0	v0.54.0
+gitui	MIT	v0.28.1
+gitu	MIT	v0.42.0
+gptman	MIT OR Apache-2.0	v1.1.0
+grcov	MPL-2.0	v0.9.1
+grex	Apache-2.0	v1.4.6
+heh	MIT	v0.6.3
+hexyl	MIT/Apache-2.0	v0.17.0
+hgrep	MIT	v0.3.9
+htmlq	MIT	v0.4.0
+hwatch	MIT	0.4.2
+hyperfine	MIT OR Apache-2.0	v1.20.0
+igrep	MIT	v1.3.0
+jnv	MIT	v0.7.1
+joshuto	LGPL-3.0	v0.9.9
+just	CC0-1.0	1.51.0
+kbs2	MIT	v0.7.3
+kmon	GPL-3.0	v1.7.1
+kubie	Zlib	v0.26.1
+lsd	Apache-2.0	v1.2.0
+macchina	MIT	v6.4.0
+maturin	MIT OR Apache-2.0	v1.12.6
+mcfly	MIT	v0.9.3
+mdbook-mermaid	MPL-2.0	v0.17.0
+mdbook-toc	MPL-2.0	0.15.4
+miniserve	MIT	v0.35.0
+mise	MIT	v2026.7.0
+monolith	CC0-1.0	v2.10.1
+natls	MIT	v2.1.14
+navi	Apache-2.0	v2.24.0
+netscanner	MIT	v0.6.41
+nomino	MIT OR Apache-2.0	v1.6.4
+nu	MIT	0.104.1
+oha	MIT	v1.14.0
+otree	MIT	v0.6.5
+ouch	MIT	0.8.0
+ox	GPL-2.0	0.7.7
+parallel-disk-usage	Apache-2.0	0.21.1
+pastel	MIT/Apache-2.0	v0.12.0
+pls	GPL-3.0-or-later	v0.0.1-beta.10
+pop-launcher	MPL-2.0	1.2.7
+presenterm	BSD-2-Clause	v0.16.1
+procs	MIT	v0.14.11
+rep-grep	MIT	0.0.8
+repgrep	Unlicense OR MIT OR Apache-2.0	0.16.1
+rip2	GPL-3.0+	v0.9.6
+ripgrep-all	AGPL-3.0-or-later	v0.10.10
+ripgrep	Unlicense OR MIT	14.1.1
+ripsecrets	MIT	v0.1.11
+rnr	MIT	v0.5.1
+ruplacer	BSD-3-Clause	v0.10.0
+russ	AGPL-3.0-or-later	HEAD(aprox)
+rustcat	GPL-3.0	v3.0.0
+rustic	Apache-2.0 OR MIT	v0.11.3
+rustscan	GPL-3.0-only	2.4.1
+rust-script	MIT/Apache-2.0	0.36.0
+sccache	Apache-2.0	v0.15.0
+sendme	Apache-2.0 OR MIT	v0.33.0
+serie	MIT	v0.8.0
+shellharden	MPL-2.0	v4.3.1
+simple-http-server	MIT	v0.8.0
+skim	MIT	v4.7.0
+sshs	MIT	4.7.2
+ssh-vault	BSD-3-Clause	1.2.10
+starship	ISC	v1.25.1
+stylua	MPL-2.0	v2.5.2
+systemctl-tui	MIT	v0.5.2
+taskwarrior-tui	MIT	v0.27.0
+tealdeer	MIT OR Apache-2.0	v1.8.1
+television	MIT	0.15.9
+tenere	GPL-3.0-or-later	v0.11.3
+tere	EUPL-1.2	v1.6.0
+the-way	MIT	v0.20.3
+tokei	MIT OR Apache-2.0	v14.0.0
+tomlq	MIT	0.2.2
+topgrade	GPL-3.0-or-later	v17.6.1
+trunk	MIT/Apache-2.0	v0.21.14
+ttyper	MIT	v1.6.0
+tuc	GPL-3.0-or-later	v1.3.0
+tuckr	GPL-3.0-or-later	0.13.1
+viddy	MIT	v1.3.1
+viu	MIT	v1.6.1
+vivid	MIT/Apache-2.0	v0.11.1
+wasm-pack	MIT OR Apache-2.0	v0.15.0
+xan	Unlicense OR MIT	0.59.0
+xdg-desktop-portal-cosmic	GPL-3.0-or-later	HEAD(aprox)
+xh	MIT	v0.25.3
+xsv	Unlicense/MIT	0.13.0
+xwin	Apache-2.0 OR MIT	0.7.0
+zenith	MIT	0.15.0
+zola	EUPL-1.2	v0.22.1
+zoxide	MIT	v0.9.9
diff --git a/recipes/aichat.toml b/recipes/aichat.toml
index 0d2e48e3..00017165 100644
--- a/recipes/aichat.toml
+++ b/recipes/aichat.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "aichat"
 version = "0.30.0"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/sigoden/aichat"
diff --git a/recipes/bat.toml b/recipes/bat.toml
index 15aa1041..050c70f3 100644
--- a/recipes/bat.toml
+++ b/recipes/bat.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "bat"
 version = "0.26.1"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/sharkdp/bat"
diff --git a/recipes/cargo-audit.toml b/recipes/cargo-audit.toml
index c6752e98..28167e59 100644
--- a/recipes/cargo-audit.toml
+++ b/recipes/cargo-audit.toml
@@ -6,7 +6,6 @@
 #   - deps.build=["zlib"]: git2/openssl-sys enlazan -lz.
 name    = "cargo-audit"
 version = "0.22.1"
-license = "{"message":"Not Found","documentation_url":"https://docs.github.com/rest/licenses/licenses#get-the-license-for-a-repository","status":"404"}"
 
 [source]
 tarball = "https://github.com/RustSec/cargo-audit/archive/cargo-audit/v0.22.1.tar.gz"
diff --git a/recipes/cargo-binstall.toml b/recipes/cargo-binstall.toml
index a091f873..54b11947 100644
--- a/recipes/cargo-binstall.toml
+++ b/recipes/cargo-binstall.toml
@@ -4,7 +4,6 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "cargo-binstall"
 version = "1.20.0"
-license = "{"message":"Not Found","documentation_url":"https://docs.github.com/rest/licenses/licenses#get-the-license-for-a-repository","status":"404"}"
 
 [source]
 repo   = "https://github.com/cargo-bins/cargo-binstall"
diff --git a/recipes/cargo-bundle-licenses.toml b/recipes/cargo-bundle-licenses.toml
index d4593ea5..0af854d7 100644
--- a/recipes/cargo-bundle-licenses.toml
+++ b/recipes/cargo-bundle-licenses.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "cargo-bundle-licenses"
 version = "4.2.0"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/sstadick/cargo-bundle-licenses"
diff --git a/recipes/cargo-cache.toml b/recipes/cargo-cache.toml
index 051d1880..1dbc4b71 100644
--- a/recipes/cargo-cache.toml
+++ b/recipes/cargo-cache.toml
@@ -4,6 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "cargo-cache"
 version = "0.8.3"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/matthiaskrgr/cargo-cache"
diff --git a/recipes/cargo-careful.toml b/recipes/cargo-careful.toml
index c83d8995..7f7f2f1e 100644
--- a/recipes/cargo-careful.toml
+++ b/recipes/cargo-careful.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "cargo-careful"
 version = "0.4.10"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/RalfJung/cargo-careful"
diff --git a/recipes/cargo-criterion.toml b/recipes/cargo-criterion.toml
index f92f0102..ce431334 100644
--- a/recipes/cargo-criterion.toml
+++ b/recipes/cargo-criterion.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "cargo-criterion"
 version = "1.1.0"
-license = "Apache-2.0"
+license = "Apache-2.0 OR MIT"
 
 [source]
 repo   = "https://github.com/bheisler/cargo-criterion"
diff --git a/recipes/cargo-deny.toml b/recipes/cargo-deny.toml
index 70ec36b2..0eec4fd9 100644
--- a/recipes/cargo-deny.toml
+++ b/recipes/cargo-deny.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "cargo-deny"
 version = "0.19.9"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/EmbarkStudios/cargo-deny"
diff --git a/recipes/cargo-edit.toml b/recipes/cargo-edit.toml
index 54214947..9bc92734 100644
--- a/recipes/cargo-edit.toml
+++ b/recipes/cargo-edit.toml
@@ -8,7 +8,7 @@
 # `cargo rustc --` exige un único target, itero los 4 bins. El install lo auto-genera el lab.
 name    = "cargo-edit"
 version = "0.13.11"
-license = "MIT"
+license = "Apache-2.0 OR MIT"
 
 [source]
 repo   = "https://github.com/killercup/cargo-edit"
diff --git a/recipes/cargo-expand.toml b/recipes/cargo-expand.toml
index adc4e0a1..dad5ed0f 100644
--- a/recipes/cargo-expand.toml
+++ b/recipes/cargo-expand.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "cargo-expand"
 version = "1.0.122"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/dtolnay/cargo-expand"
diff --git a/recipes/cargo-flamegraph.toml b/recipes/cargo-flamegraph.toml
index 9118bbe2..8de0a35f 100644
--- a/recipes/cargo-flamegraph.toml
+++ b/recipes/cargo-flamegraph.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "cargo-flamegraph"
 version = "0.6.13"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/flamegraph-rs/flamegraph"
diff --git a/recipes/cargo-fuzz.toml b/recipes/cargo-fuzz.toml
index 72101432..a72ee8d9 100644
--- a/recipes/cargo-fuzz.toml
+++ b/recipes/cargo-fuzz.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "cargo-fuzz"
 version = "0.13.2"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/rust-fuzz/cargo-fuzz"
diff --git a/recipes/cargo-generate.toml b/recipes/cargo-generate.toml
index 70ba9b3e..5665327b 100644
--- a/recipes/cargo-generate.toml
+++ b/recipes/cargo-generate.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "cargo-generate"
 version = "0.23.9"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/cargo-generate/cargo-generate"
diff --git a/recipes/cargo-hack.toml b/recipes/cargo-hack.toml
index b48bffed..9ce09224 100644
--- a/recipes/cargo-hack.toml
+++ b/recipes/cargo-hack.toml
@@ -4,7 +4,7 @@
 # El `cargo auditable` del abuild de Alpine no existe en el lab ⇒ se elimina.
 name    = "cargo-hack"
 version = "0.6.45"
-license = "Apache-2.0"
+license = "Apache-2.0 OR MIT"
 
 [source]
 tarball = "https://github.com/taiki-e/cargo-hack/archive/refs/tags/v0.6.45.tar.gz"
diff --git a/recipes/cargo-llvm-cov.toml b/recipes/cargo-llvm-cov.toml
index 90ef1b02..3a5f9b92 100644
--- a/recipes/cargo-llvm-cov.toml
+++ b/recipes/cargo-llvm-cov.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "cargo-llvm-cov"
 version = "0.8.5"
-license = "Apache-2.0"
+license = "Apache-2.0 OR MIT"
 
 [source]
 repo   = "https://github.com/taiki-e/cargo-llvm-cov"
diff --git a/recipes/cargo-llvm-lines.toml b/recipes/cargo-llvm-lines.toml
index 6b5bee55..ad05fd6a 100644
--- a/recipes/cargo-llvm-lines.toml
+++ b/recipes/cargo-llvm-lines.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "cargo-llvm-lines"
 version = "0.4.46"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/dtolnay/cargo-llvm-lines"
diff --git a/recipes/cargo-msrv.toml b/recipes/cargo-msrv.toml
index 24a67de6..c70c2263 100644
--- a/recipes/cargo-msrv.toml
+++ b/recipes/cargo-msrv.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "cargo-msrv"
 version = "0.19.3"
-license = "Apache-2.0"
+license = "Apache-2.0 OR MIT"
 
 [source]
 repo   = "https://github.com/foresterre/cargo-msrv"
diff --git a/recipes/cargo-ndk.toml b/recipes/cargo-ndk.toml
index 27c0d1d8..affbe1a5 100644
--- a/recipes/cargo-ndk.toml
+++ b/recipes/cargo-ndk.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "cargo-ndk"
 version = "4.1.2"
-license = "Apache-2.0"
+license = "Apache-2.0 OR MIT"
 
 [source]
 repo   = "https://github.com/bbqsrc/cargo-ndk"
diff --git a/recipes/cargo-readme.toml b/recipes/cargo-readme.toml
index 20318893..d14e7b95 100644
--- a/recipes/cargo-readme.toml
+++ b/recipes/cargo-readme.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "cargo-readme"
 version = "3.3.2"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/webern/cargo-readme"
diff --git a/recipes/cargo-semver-checks.toml b/recipes/cargo-semver-checks.toml
index 7186c678..f31c6701 100644
--- a/recipes/cargo-semver-checks.toml
+++ b/recipes/cargo-semver-checks.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "cargo-semver-checks"
 version = "0.48.0"
-license = "Apache-2.0"
+license = "Apache-2.0 OR MIT"
 
 [source]
 repo   = "https://github.com/obi1kenobi/cargo-semver-checks"
diff --git a/recipes/cargo-sort.toml b/recipes/cargo-sort.toml
index c7f6943e..feb6fb74 100644
--- a/recipes/cargo-sort.toml
+++ b/recipes/cargo-sort.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "cargo-sort"
 version = "2.1.3"
-license = "{"message":"Not Found","documentation_url":"https://docs.github.com/rest/licenses/licenses#get-the-license-for-a-repository","status":"404"}"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/devinr528/cargo-sort"
diff --git a/recipes/cargo-supply-chain.toml b/recipes/cargo-supply-chain.toml
index 20bbcbba..9406b1d5 100644
--- a/recipes/cargo-supply-chain.toml
+++ b/recipes/cargo-supply-chain.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "cargo-supply-chain"
 version = "0.3.4"
-license = "Apache-2.0"
+license = "Apache-2.0 OR MIT OR Zlib"
 
 [source]
 repo   = "https://github.com/rust-secure-code/cargo-supply-chain"
diff --git a/recipes/cargo-temp.toml b/recipes/cargo-temp.toml
index d59e619b..0abc4e94 100644
--- a/recipes/cargo-temp.toml
+++ b/recipes/cargo-temp.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "cargo-temp"
 version = "0.4.1"
-license = "MIT"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/yozhgoor/cargo-temp"
diff --git a/recipes/cargo-udeps.toml b/recipes/cargo-udeps.toml
index eb8b769d..cd8fff5b 100644
--- a/recipes/cargo-udeps.toml
+++ b/recipes/cargo-udeps.toml
@@ -4,6 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "cargo-udeps"
 version = "0.1.61"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/est31/cargo-udeps"
diff --git a/recipes/choose.toml b/recipes/choose.toml
index b02b80da..b7912438 100644
--- a/recipes/choose.toml
+++ b/recipes/choose.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "choose"
 version = "1.3.7"
-license = "GPL-3.0"
+license = "GPL-3.0-or-later"
 
 [source]
 repo   = "https://github.com/theryangeary/choose"
diff --git a/recipes/cobalt.toml b/recipes/cobalt.toml
index 8487c333..a1dd7c91 100644
--- a/recipes/cobalt.toml
+++ b/recipes/cobalt.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "cobalt"
 version = "0.20.4"
-license = "Apache-2.0"
+license = "MIT"
 
 [source]
 repo   = "https://github.com/cobalt-org/cobalt.rs"
diff --git a/recipes/comrak.toml b/recipes/comrak.toml
index d415d309..f00af5fe 100644
--- a/recipes/comrak.toml
+++ b/recipes/comrak.toml
@@ -4,6 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "comrak"
 version = "0.52.0"
+license = "BSD-2-Clause"
 
 [source]
 repo   = "https://github.com/kivikakk/comrak"
diff --git a/recipes/cpc.toml b/recipes/cpc.toml
index 273aa08a..667e06dc 100644
--- a/recipes/cpc.toml
+++ b/recipes/cpc.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "cpc"
 version = "3.0.0"
-license = "AGPL-3.0"
+license = "MIT"
 
 [source]
 repo   = "https://github.com/probablykasper/cpc"
diff --git a/recipes/csview.toml b/recipes/csview.toml
index 46d79fb7..6296a49f 100644
--- a/recipes/csview.toml
+++ b/recipes/csview.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "csview"
 version = "1.3.4"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/wfxr/csview"
diff --git a/recipes/ddh.toml b/recipes/ddh.toml
index e5810351..86097684 100644
--- a/recipes/ddh.toml
+++ b/recipes/ddh.toml
@@ -4,6 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "ddh"
 version = "0.13.0"
+license = "LGPL-3.0"
 
 [source]
 repo   = "https://github.com/darakian/ddh"
diff --git a/recipes/diffutils.toml b/recipes/diffutils.toml
index abef90b4..13bc295a 100644
--- a/recipes/diffutils.toml
+++ b/recipes/diffutils.toml
@@ -10,7 +10,7 @@
 
 name    = "diffutils"
 version = "0.5.0"
-license = "GPL-3.0-or-later"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/uutils/diffutils"
diff --git a/recipes/diskus.toml b/recipes/diskus.toml
index 2a99cfdd..10c769af 100644
--- a/recipes/diskus.toml
+++ b/recipes/diskus.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "diskus"
 version = "0.9.0"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/sharkdp/diskus"
diff --git a/recipes/dufs.toml b/recipes/dufs.toml
index bfe6641d..0ceac9ad 100644
--- a/recipes/dufs.toml
+++ b/recipes/dufs.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "dufs"
 version = "0.46.0"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/sigoden/dufs"
diff --git a/recipes/fd.toml b/recipes/fd.toml
index 1e1d95f5..2b1f53ca 100644
--- a/recipes/fd.toml
+++ b/recipes/fd.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "fd"
 version = "10.4.2"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/sharkdp/fd"
diff --git a/recipes/findutils.toml b/recipes/findutils.toml
index 7fa2bcff..3201c1a1 100644
--- a/recipes/findutils.toml
+++ b/recipes/findutils.toml
@@ -16,7 +16,7 @@
 
 name    = "findutils"
 version = "0.9.1"
-license = "GPL-3.0-or-later"
+license = "MIT"
 
 [source]
 repo   = "https://github.com/uutils/findutils"
diff --git a/recipes/fselect.toml b/recipes/fselect.toml
index 0d99f88c..f8f21ced 100644
--- a/recipes/fselect.toml
+++ b/recipes/fselect.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "fselect"
 version = "0.10.1"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/jhspetersson/fselect"
diff --git a/recipes/gitoxide.toml b/recipes/gitoxide.toml
index 6bc717bf..89533f4d 100644
--- a/recipes/gitoxide.toml
+++ b/recipes/gitoxide.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "gitoxide"
 version = "0.54.0"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/GitoxideLabs/gitoxide"
diff --git a/recipes/gptman.toml b/recipes/gptman.toml
index dd8b1aa4..76fbde11 100644
--- a/recipes/gptman.toml
+++ b/recipes/gptman.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "gptman"
 version = "1.1.0"
-license = "MIT"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/rust-disk-partition-management/gptman"
diff --git a/recipes/hexyl.toml b/recipes/hexyl.toml
index aeb71914..5dc8b331 100644
--- a/recipes/hexyl.toml
+++ b/recipes/hexyl.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "hexyl"
 version = "0.17.0"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/sharkdp/hexyl"
diff --git a/recipes/hyperfine.toml b/recipes/hyperfine.toml
index 0bc3a948..2fce7189 100644
--- a/recipes/hyperfine.toml
+++ b/recipes/hyperfine.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "hyperfine"
 version = "1.20.0"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/sharkdp/hyperfine"
diff --git a/recipes/incoming-cosmic/cosmic-comp.toml b/recipes/incoming-cosmic/cosmic-comp.toml
index 3336f0ca..a7cda718 100644
--- a/recipes/incoming-cosmic/cosmic-comp.toml
+++ b/recipes/incoming-cosmic/cosmic-comp.toml
@@ -29,7 +29,7 @@
 # de EGL/wayland/xkbcommon; un estático acá no es una postura, es una mentira.
 name    = "cosmic-comp"
 version = "1.5.0"
-license = "GPL-3.0"
+license = "GPL-3.0-only"
 
 [source]
 tarball = "https://github.com/pop-os/cosmic-comp/archive/epoch-1.5.0/cosmic-comp-epoch-1.5.0.tar.gz"
diff --git a/recipes/incoming-cosmic/cosmic-edit.toml b/recipes/incoming-cosmic/cosmic-edit.toml
index f7a12b0d..943547aa 100644
--- a/recipes/incoming-cosmic/cosmic-edit.toml
+++ b/recipes/incoming-cosmic/cosmic-edit.toml
@@ -29,7 +29,7 @@
 # los cuarenta minutos.
 name    = "cosmic-edit"
 version = "1.5.0"
-license = "GPL-3.0"
+license = "GPL-3.0-only"
 
 [source]
 tarball = "https://github.com/pop-os/cosmic-edit/archive/epoch-1.5.0/cosmic-edit-epoch-1.5.0.tar.gz"
diff --git a/recipes/incoming-cosmic/cosmic-files.toml b/recipes/incoming-cosmic/cosmic-files.toml
index f4d6114c..504b9a8a 100644
--- a/recipes/incoming-cosmic/cosmic-files.toml
+++ b/recipes/incoming-cosmic/cosmic-files.toml
@@ -26,7 +26,7 @@
 # (`bzip2-sys` no aparece) antes de agregar una dep que no hacía falta.
 name    = "cosmic-files"
 version = "1.5.0"
-license = "GPL-3.0"
+license = "GPL-3.0-only"
 
 [source]
 tarball = "https://github.com/pop-os/cosmic-files/archive/epoch-1.5.0/cosmic-files-epoch-1.5.0.tar.gz"
diff --git a/recipes/incoming-cosmic/cosmic-osd.toml b/recipes/incoming-cosmic/cosmic-osd.toml
index bec0969b..e601efb5 100644
--- a/recipes/incoming-cosmic/cosmic-osd.toml
+++ b/recipes/incoming-cosmic/cosmic-osd.toml
@@ -13,7 +13,7 @@
 # `libxkbcommon` + `pkgconf` por el gotcha 7 del runbook: winit/sctk ENLAZAN xkbcommon.
 name    = "cosmic-osd"
 version = "1.5.0"
-license = "GPL-3.0"
+license = "GPL-3.0-or-later"
 
 [source]
 tarball = "https://github.com/pop-os/cosmic-osd/archive/epoch-1.5.0/cosmic-osd-epoch-1.5.0.tar.gz"
diff --git a/recipes/incoming-cosmic/cosmic-session.toml b/recipes/incoming-cosmic/cosmic-session.toml
index 9d9794e7..0005c164 100644
--- a/recipes/incoming-cosmic/cosmic-session.toml
+++ b/recipes/incoming-cosmic/cosmic-session.toml
@@ -23,7 +23,7 @@
 # arriba y no lo implica: es el nombre del protocolo, no del programa que lo contesta.
 name    = "cosmic-session"
 version = "1.5.0"
-license = "GPL-3.0"
+license = "GPL-3.0-only"
 
 [source]
 tarball = "https://github.com/pop-os/cosmic-session/archive/epoch-1.5.0/cosmic-session-epoch-1.5.0.tar.gz"
diff --git a/recipes/incoming-cosmic/cosmic-settings-daemon.toml b/recipes/incoming-cosmic/cosmic-settings-daemon.toml
index d0707d95..a95bfbb0 100644
--- a/recipes/incoming-cosmic/cosmic-settings-daemon.toml
+++ b/recipes/incoming-cosmic/cosmic-settings-daemon.toml
@@ -21,7 +21,7 @@
 # `ddc-hi` (brillo por DDC/CI sobre i2c) es Rust puro: habla el ioctl directo, no libddcutil.
 name    = "cosmic-settings-daemon"
 version = "1.5.0"
-license = "GPL-3.0"
+license = "GPL-3.0-or-later"
 
 [source]
 tarball = "https://github.com/pop-os/cosmic-settings-daemon/archive/epoch-1.5.0/cosmic-settings-daemon-epoch-1.5.0.tar.gz"
diff --git a/recipes/incoming-cosmic/cosmic-term.toml b/recipes/incoming-cosmic/cosmic-term.toml
index 45c4a400..c4354e3d 100644
--- a/recipes/incoming-cosmic/cosmic-term.toml
+++ b/recipes/incoming-cosmic/cosmic-term.toml
@@ -16,7 +16,7 @@
 # tocar las features por defecto es apartarse de la única combinación que upstream prueba.
 name    = "cosmic-term"
 version = "1.5.0"
-license = "GPL-3.0"
+license = "GPL-3.0-only"
 
 [source]
 tarball = "https://github.com/pop-os/cosmic-term/archive/epoch-1.5.0/cosmic-term-epoch-1.5.0.tar.gz"
diff --git a/recipes/incoming-cosmic/xdg-desktop-portal-cosmic.toml b/recipes/incoming-cosmic/xdg-desktop-portal-cosmic.toml
index 4bf2486b..47aa5c5c 100644
--- a/recipes/incoming-cosmic/xdg-desktop-portal-cosmic.toml
+++ b/recipes/incoming-cosmic/xdg-desktop-portal-cosmic.toml
@@ -31,7 +31,7 @@
 # recorte.
 name    = "xdg-desktop-portal-cosmic"
 version = "1.5.0"
-license = "GPL-3.0"
+license = "GPL-3.0-or-later"
 
 [source]
 tarball = "https://github.com/pop-os/xdg-desktop-portal-cosmic/archive/epoch-1.5.0/xdg-desktop-portal-cosmic-epoch-1.5.0.tar.gz"
diff --git a/recipes/maturin.toml b/recipes/maturin.toml
index e5378179..a709bb07 100644
--- a/recipes/maturin.toml
+++ b/recipes/maturin.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "maturin"
 version = "1.12.6"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/PyO3/maturin"
diff --git a/recipes/nomino.toml b/recipes/nomino.toml
index f76ee697..e4d15dc2 100644
--- a/recipes/nomino.toml
+++ b/recipes/nomino.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "nomino"
 version = "1.6.4"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/yaa110/nomino"
diff --git a/recipes/ouch.toml b/recipes/ouch.toml
index 5dddcda6..e5bea126 100644
--- a/recipes/ouch.toml
+++ b/recipes/ouch.toml
@@ -4,6 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "ouch"
 version = "0.8.0"
+license = "MIT"
 
 [source]
 repo   = "https://github.com/ouch-org/ouch"
diff --git a/recipes/pastel.toml b/recipes/pastel.toml
index ce2eac6c..7b53be0c 100644
--- a/recipes/pastel.toml
+++ b/recipes/pastel.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "pastel"
 version = "0.12.0"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/sharkdp/pastel"
diff --git a/recipes/pls.toml b/recipes/pls.toml
index 89476aa0..d0fe4c8d 100644
--- a/recipes/pls.toml
+++ b/recipes/pls.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "pls"
 version = "0.0.1-beta.10"
-license = "GPL-3.0"
+license = "GPL-3.0-or-later"
 
 [source]
 repo   = "https://github.com/pls-rs/pls"
diff --git a/recipes/repgrep.toml b/recipes/repgrep.toml
index 4d3e93c7..63e1b58e 100644
--- a/recipes/repgrep.toml
+++ b/recipes/repgrep.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "repgrep"
 version = "0.16.1"
-license = "Apache-2.0"
+license = "Unlicense OR MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/acheronfail/repgrep"
diff --git a/recipes/rip2.toml b/recipes/rip2.toml
index e05f6d63..192fc194 100644
--- a/recipes/rip2.toml
+++ b/recipes/rip2.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "rip2"
 version = "0.9.6"
-license = "GPL-3.0"
+license = "GPL-3.0+"
 
 [source]
 repo   = "https://github.com/MilesCranmer/rip2"
diff --git a/recipes/ripgrep-all.toml b/recipes/ripgrep-all.toml
index 51e022ed..2cf7d498 100644
--- a/recipes/ripgrep-all.toml
+++ b/recipes/ripgrep-all.toml
@@ -4,6 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "ripgrep-all"
 version = "0.10.10"
+license = "AGPL-3.0-or-later"
 
 [source]
 repo   = "https://github.com/phiresky/ripgrep-all"
diff --git a/recipes/ripgrep.toml b/recipes/ripgrep.toml
index a5f535cd..077a9dfc 100644
--- a/recipes/ripgrep.toml
+++ b/recipes/ripgrep.toml
@@ -15,7 +15,7 @@
 
 name    = "ripgrep"
 version = "14.1.1"
-license = "Unlicense"
+license = "Unlicense OR MIT"
 
 [source]
 repo   = "https://github.com/BurntSushi/ripgrep"
diff --git a/recipes/russ.toml b/recipes/russ.toml
index 0e2382a8..5d447bce 100644
--- a/recipes/russ.toml
+++ b/recipes/russ.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "russ"
 version = "0.5.0"
-license = "AGPL-3.0"
+license = "AGPL-3.0-or-later"
 
 [source]
 repo   = "https://github.com/ckampfe/russ"
diff --git a/recipes/rust-script.toml b/recipes/rust-script.toml
index b062d825..5004130f 100644
--- a/recipes/rust-script.toml
+++ b/recipes/rust-script.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "rust-script"
 version = "0.36.0"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/fornwall/rust-script"
diff --git a/recipes/rustic.toml b/recipes/rustic.toml
index e106270f..c8ca8bc3 100644
--- a/recipes/rustic.toml
+++ b/recipes/rustic.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "rustic"
 version = "0.11.3"
-license = "Apache-2.0"
+license = "Apache-2.0 OR MIT"
 
 [source]
 repo   = "https://github.com/rustic-rs/rustic"
diff --git a/recipes/rustscan.toml b/recipes/rustscan.toml
index d823034a..07d023d6 100644
--- a/recipes/rustscan.toml
+++ b/recipes/rustscan.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "rustscan"
 version = "2.4.1"
-license = "GPL-3.0"
+license = "GPL-3.0-only"
 
 [source]
 repo   = "https://github.com/RustScan/RustScan"
diff --git a/recipes/sendme.toml b/recipes/sendme.toml
index c070adb3..d6c4b5d8 100644
--- a/recipes/sendme.toml
+++ b/recipes/sendme.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "sendme"
 version = "0.33.0"
-license = "Apache-2.0"
+license = "Apache-2.0 OR MIT"
 
 [source]
 repo   = "https://github.com/n0-computer/sendme"
diff --git a/recipes/tealdeer.toml b/recipes/tealdeer.toml
index 1142bff8..eea0cc2a 100644
--- a/recipes/tealdeer.toml
+++ b/recipes/tealdeer.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "tealdeer"
 version = "1.8.1"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/tealdeer-rs/tealdeer"
diff --git a/recipes/tenere.toml b/recipes/tenere.toml
index 0da26c8a..c7ab2b85 100644
--- a/recipes/tenere.toml
+++ b/recipes/tenere.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "tenere"
 version = "0.11.3"
-license = "GPL-3.0"
+license = "GPL-3.0-or-later"
 
 [source]
 repo   = "https://github.com/pythops/tenere"
diff --git a/recipes/tokei.toml b/recipes/tokei.toml
index 8924c300..49a1e590 100644
--- a/recipes/tokei.toml
+++ b/recipes/tokei.toml
@@ -4,6 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "tokei"
 version = "14.0.0"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/XAMPPRocky/tokei"
diff --git a/recipes/topgrade.toml b/recipes/topgrade.toml
index abe91d64..ec220776 100644
--- a/recipes/topgrade.toml
+++ b/recipes/topgrade.toml
@@ -4,7 +4,7 @@
 # crt-static + linker zig-cc ⇒ binario ESTÁTICO). Pure-Rust ⇒ zig-cc baseline.
 name    = "topgrade"
 version = "17.6.1"
-license = "GPL-3.0"
+license = "GPL-3.0-or-later"
 
 [source]
 tarball = "https://github.com/topgrade-rs/topgrade/archive/refs/tags/v17.6.1.tar.gz"
diff --git a/recipes/trunk.toml b/recipes/trunk.toml
index c7f467e0..46a4cfe2 100644
--- a/recipes/trunk.toml
+++ b/recipes/trunk.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "trunk"
 version = "0.21.14"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/trunk-rs/trunk"
diff --git a/recipes/tuc.toml b/recipes/tuc.toml
index 0ccdb9da..e9f6464d 100644
--- a/recipes/tuc.toml
+++ b/recipes/tuc.toml
@@ -3,7 +3,7 @@
 # sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
 name    = "tuc"
 version = "1.3.0"
-license = "GPL-3.0"
+license = "GPL-3.0-or-later"
 
 [source]
 tarball = "https://github.com/riquito/tuc/archive/v1.3.0/tuc-1.3.0.tar.gz"
diff --git a/recipes/tuckr.toml b/recipes/tuckr.toml
index 4f9dc1c0..05b18af2 100644
--- a/recipes/tuckr.toml
+++ b/recipes/tuckr.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "tuckr"
 version = "0.13.1"
-license = "GPL-3.0"
+license = "GPL-3.0-or-later"
 
 [source]
 repo   = "https://github.com/RaphGL/Tuckr"
diff --git a/recipes/usbutils.toml b/recipes/usbutils.toml
index 70519f17..7f27a49d 100644
--- a/recipes/usbutils.toml
+++ b/recipes/usbutils.toml
@@ -3,7 +3,6 @@
 # sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
 name    = "usbutils"
 version = "019"
-license = "{"message":"Not Found","documentation_url":"https://docs.github.com/rest/licenses/licenses#get-the-license-for-a-repository","status":"404"}"
 
 [source]
 tarball = "https://github.com/gregkh/usbutils/archive/refs/tags/v019.tar.gz"
diff --git a/recipes/vivid.toml b/recipes/vivid.toml
index cf90a334..dffb0d6a 100644
--- a/recipes/vivid.toml
+++ b/recipes/vivid.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "vivid"
 version = "0.11.1"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/sharkdp/vivid"
diff --git a/recipes/wasm-pack.toml b/recipes/wasm-pack.toml
index 79f4e777..5769f1a9 100644
--- a/recipes/wasm-pack.toml
+++ b/recipes/wasm-pack.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "wasm-pack"
 version = "0.15.0"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
 
 [source]
 repo   = "https://github.com/wasm-bindgen/wasm-pack"
diff --git a/recipes/waybackurls.toml b/recipes/waybackurls.toml
index 8b93f561..d08cb33a 100644
--- a/recipes/waybackurls.toml
+++ b/recipes/waybackurls.toml
@@ -4,7 +4,6 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "waybackurls"
 version = "0.1.0"
-license = "{"message":"Not Found","documentation_url":"https://docs.github.com/rest/licenses/licenses#get-the-license-for-a-repository","status":"404"}"
 
 [source]
 repo   = "https://github.com/tomnomnom/waybackurls"
diff --git a/recipes/xan.toml b/recipes/xan.toml
index 70fcaaf4..3600eedf 100644
--- a/recipes/xan.toml
+++ b/recipes/xan.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "xan"
 version = "0.59.0"
-license = "Unlicense"
+license = "Unlicense OR MIT"
 
 [source]
 repo   = "https://github.com/medialab/xan"
diff --git a/recipes/xsv.toml b/recipes/xsv.toml
index 8f7feb0e..de8b19af 100644
--- a/recipes/xsv.toml
+++ b/recipes/xsv.toml
@@ -7,7 +7,7 @@
 
 name    = "xsv"
 version = "0.13.0"
-license = "Unlicense"
+license = "Unlicense OR MIT"
 
 [source]
 tarball = "https://github.com/BurntSushi/xsv/archive/0.13.0/xsv-0.13.0.tar.gz"
diff --git a/recipes/xwin.toml b/recipes/xwin.toml
index aa55c230..63e9be01 100644
--- a/recipes/xwin.toml
+++ b/recipes/xwin.toml
@@ -4,7 +4,7 @@
 # - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
 name    = "xwin"
 version = "0.7.0"
-license = "Apache-2.0"
+license = "Apache-2.0 OR MIT"
 
 [source]
 repo   = "https://github.com/Jake-Shadle/xwin"
diff --git a/scripts/licencias-cargo.sh b/scripts/licencias-cargo.sh
new file mode 100755
index 00000000..e445499c
--- /dev/null
+++ b/scripts/licencias-cargo.sh
@@ -0,0 +1,81 @@
+#!/usr/bin/env bash
+# licencias-cargo.sh — lee la licencia que el AUTOR declara en su `Cargo.toml`, al tag exacto que la
+# receta pinea. Es la fuente más autoritativa de las tres que usamos, y corrige a las otras dos.
+#
+# ── LA JERARQUÍA DE EVIDENCIA, DE PEOR A MEJOR ──────────────────────────────────────────────────
+#   1. El nombre de la receta ......... NO es evidencia. Prohibido (ver docs/licencias-conocidas.tsv).
+#   2. La familia / URL de fuente ..... buena para agrupar (X.Org=MIT, KDE Frameworks=LGPL doble).
+#   3. La API de licencias de GitHub .. detecta el fichero LICENSE real, pero con DOS pérdidas:
+#      devuelve identificadores obsoletos y ambiguos (`GPL-3.0` sin decir -only/-or-later) y
+#      **colapsa las licencias dobles a una sola**.
+#   4. El `Cargo.toml` del autor ...... ← ESTO. Una expresión SPDX escrita por quien tiene la potestad
+#      de licenciar, sin ambigüedad y sin colapsar. Corrige los dos defectos de (3) de una vez.
+#
+# Ejemplo medido: la API dejó `fd` como `Apache-2.0`; su Cargo.toml dice `MIT OR Apache-2.0`. No era
+# falso —cumplir Apache-2.0 basta— pero perdía una opción que el autor concedió. Con esto se recupera.
+#
+# ── SE PIDE AL TAG QUE LA RECETA PINEA, NO A HEAD ───────────────────────────────────────────────
+# Ésa era la limitación registrada de la detección por API (mira la rama por defecto, no la versión
+# que empaquetamos). Acá se prueba `?ref=v<version>` y `?ref=<version>` antes de caer a HEAD, y se
+# ANOTA con qué ref se resolvió cada una, para que la tercera columna diga si el dato es exacto o
+# aproximado. Un dato con su procedencia se puede auditar; uno sin ella hay que creerlo.
+#
+# ── LO QUE NO HACE ──────────────────────────────────────────────────────────────────────────────
+# `license.workspace = true` (la licencia vive en el workspace padre) y `license-file` (licencia a
+# medida, sin SPDX) se DESCARTAN en vez de adivinarse. Y no toca las recetas que no son Cargo: los
+# módulos Go no tienen un campo equivalente en `go.mod`, así que ésos siguen dependiendo de (2) y (3).
+#
+# Uso:  scripts/licencias-cargo.sh                (escribe docs/licencias-cargo.tsv)
+#       FORZAR=1 TABLA=docs/licencias-cargo.tsv scripts/licencias.sh --sembrar
+set -uo pipefail
+ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT"
+SALIDA="${SALIDA:-docs/licencias-cargo.tsv}"
+JOBS="${JOBS:-12}"
+
+command -v gh >/dev/null && gh auth status >/dev/null 2>&1 || { echo "!!  'gh' ausente o sin auth"; exit 1; }
+TMP=$(mktemp -d); trap 'rm -rf "$TMP"' EXIT
+
+# Todas las recetas con fuente en GitHub (tengan licencia o no: éste CORRIGE, no sólo rellena).
+for f in recipes/*.toml recipes/incoming-*/*.toml; do
+  [ -f "$f" ] || continue
+  u=$(grep -m1 -E '^[[:space:]]*(tarball|repo)[[:space:]]*=' "$f" 2>/dev/null)
+  case "$u" in *github.com*) ;; *) continue ;; esac
+  n=$(basename "$f" .toml)
+  v=$(awk -F'"' '/^\[/{exit} /^[[:space:]]*version[[:space:]]*=/{print $2; exit}' "$f")
+  slug=$(printf '%s\n' "$u" | sed -E 's#.*github\.com[:/]+([^/"]+)/([^/"]+).*#\1/\2#; s/\.git$//')
+  case "$slug" in */*) printf '%s\t%s\t%s\n' "$n" "$slug" "${v:-}" ;; esac
+done | sort -u > "$TMP/obj.tsv"
+
+echo "==> recetas con fuente en GitHub: $(wc -l < "$TMP/obj.tsv")"
+
+export TMP
+xargs -P "$JOBS" -I{} sh -c '
+  n=$(printf "%s" "{}" | cut -f1); slug=$(printf "%s" "{}" | cut -f2); v=$(printf "%s" "{}" | cut -f3)
+  for ref in "v$v" "$v" ""; do
+    [ -z "$v" ] && [ -n "$ref" ] && continue
+    if [ -n "$ref" ]; then q="?ref=$ref"; etiq="$ref"; else q=""; etiq="HEAD(aprox)"; fi
+    c=$(gh api "repos/$slug/contents/Cargo.toml$q" --jq ".content" 2>/dev/null) || continue
+    [ -z "$c" ] && continue
+    lic=$(printf "%s" "$c" | base64 -d 2>/dev/null | awk -F\" "/^\[/{if(t)exit; if(\$0 ~ /^\[package\]/)t=1; next} t&&/^[[:space:]]*license[[:space:]]*=/{print \$2; exit}")
+    case "$lic" in
+      ""|*workspace*|*true*) break ;;
+      *) printf "%s\t%s\t%s\n" "$n" "$lic" "$etiq" >> "$TMP/ok.tsv"; break ;;
+    esac
+  done
+' < "$TMP/obj.tsv"
+
+N=$(wc -l < "$TMP/ok.tsv" 2>/dev/null || echo 0)
+EXACT=$(grep -vc 'HEAD(aprox)' "$TMP/ok.tsv" 2>/dev/null || echo 0)
+{
+  echo "# licencias-cargo.tsv — GENERADO por scripts/licencias-cargo.sh. No editar a mano."
+  echo "#"
+  echo "# La licencia que el AUTOR declara en su Cargo.toml: expresión SPDX escrita por quien tiene"
+  echo "# la potestad de licenciar. Sin ambigüedad -only/-or-later y SIN colapsar las dobles ⇒ manda"
+  echo "# sobre la detección por API de GitHub, que pierde ambas cosas. Sembrar con FORZAR=1."
+  echo "#"
+  echo "# Tercera columna = el ref con el que se resolvió. Un tag concreto significa que el dato es"
+  echo "# de la VERSIÓN QUE EMPAQUETAMOS; 'HEAD(aprox)' que no se halló el tag y puede diferir."
+  echo "# Total $N · al tag exacto $EXACT · aproximadas $((N-EXACT))"
+  sort "$TMP/ok.tsv" 2>/dev/null
+} > "$SALIDA"
+echo "==> $N licencias de Cargo.toml ($EXACT al tag exacto) → $SALIDA"
diff --git a/scripts/licencias-detectar.sh b/scripts/licencias-detectar.sh
index 470c0f1d..16d96d42 100755
--- a/scripts/licencias-detectar.sh
+++ b/scripts/licencias-detectar.sh
@@ -53,8 +53,17 @@ export TMP
 xargs -P "$JOBS" -I{} sh -c '
   n=$(printf "%s" "{}" | cut -f1); slug=$(printf "%s" "{}" | cut -f2)
   lic=$(gh api "repos/$slug/license" --jq ".license.spdx_id" 2>/dev/null)
+  # ⚠ VALIDAR LA FORMA, NO SÓLO LOS «NO SÉ» CONOCIDOS. Cuando el repo da 404 (renombrado, borrado,
+  # privado), `gh api` escribe el CUERPO DEL ERROR JSON en stdout y el filtro --jq falla ⇒ `lic`
+  # queda valiendo `{"message":"Not Found",...}`. Filtrando sólo ""/null/NOASSERTION/other, ese JSON
+  # pasaba como si fuera una licencia y se escribía en la receta: comillas incluidas, lo que además
+  # ROMPE el TOML y hace que el ArtifactHash deje de calcularse. Pasó de verdad en 5 recetas el
+  # 2026-08-07 y lo cazó la verificación de hashes, no la vista.
+  # ⇒ Regla: aceptar sólo lo que TIENE FORMA de expresión SPDX (letras, dígitos, . - + y los
+  # operadores OR/AND/WITH). Todo lo demás es un fallo disfrazado de dato.
   case "$lic" in
     ""|null|NOASSERTION|other) printf "%s\t%s\n" "$n" "$slug" >> "$TMP/sin.tsv" ;;
+    *[!A-Za-z0-9.+\ -]*)       printf "%s\t%s\n" "$n" "$slug" >> "$TMP/sin.tsv" ;;
     *) printf "%s\t%s\t%s\n" "$n" "$lic" "$slug" >> "$TMP/con.tsv" ;;
   esac
 ' < "$TMP/objetivos.tsv"
diff --git a/scripts/licencias.sh b/scripts/licencias.sh
index 5a27fa18..2a84d528 100755
--- a/scripts/licencias.sh
+++ b/scripts/licencias.sh
@@ -63,7 +63,7 @@ case "$MODO" in
 # ── sembrar: escribir las licencias de la tabla curada ──────────────────────────────────────────
 --sembrar)
   [ -s "$TABLA" ] || { echo "!!  falta la tabla curada: $TABLA"; exit 1; }
-  puestas=0; ya=0; sin_receta=0
+  puestas=0; ya=0; sin_receta=0; corregidas=0
   # TRES campos, no dos: `licencias-detectadas.tsv` añade una tercera columna con el `owner/repo`
   # consultado (la procedencia, para poder auditar). Leyendo sólo dos variables, `lic` se tragaría
   # también el slug y se escribiría `license = "MIT<TAB>owner/repo"` en la receta — basura silenciosa,
@@ -71,11 +71,32 @@ case "$MODO" in
   while IFS=$'\t' read -r pkg lic _resto; do
     case "$pkg" in ''|'#'*) continue ;; esac
     [ -n "${lic:-}" ] || continue
+    # ÚLTIMA BARRERA antes de tocar una receta: la licencia tiene que TENER FORMA de expresión SPDX.
+    # Sin esto, cualquier fallo de una fuente aguas arriba se escribe como si fuera un dato — y el
+    # 2026-08-07 pasó: un cuerpo de error JSON de la API de GitHub acabó dentro de 5 recetas, con
+    # comillas, rompiendo el TOML y dejando de calcularse su ArtifactHash. Validar en el sitio que
+    # ESCRIBE es lo que corta la clase entera de fallo, no sólo el caso conocido.
+    case "$lic" in
+      *[!A-Za-z0-9.+\ -]*) echo "  ??  $pkg: descarto licencia con forma inválida: $(printf '%.40s' "$lic")"; continue ;;
+    esac
     hallada=0
     for f in recipes/"$pkg".toml recipes/incoming-*/"$pkg".toml; do
       [ -f "$f" ] || continue
       hallada=1
-      if tiene_licencia "$f"; then ya=$((ya+1)); continue; fi
+      if tiene_licencia "$f"; then
+        # FORZAR=1: reemplazar lo ya declarado. Sólo tiene sentido con una fuente MÁS autoritativa
+        # que la que puso el valor actual — el caso real es `licencias-cargo.tsv`, la declaración
+        # del propio autor, que corrige los dos defectos de la detección por API (SPDX ambiguo y
+        # licencias dobles colapsadas). Con la tabla curada NO se usa: pisaría a mano lo verificado.
+        if [ "${FORZAR:-0}" = 1 ] && [ "$(licencia_de "$f")" != "$lic" ]; then
+          esc=$(printf '%s' "$lic" | sed 's/[&/\]/\\&/g')
+          sed -i "0,/^[[:space:]]*license[[:space:]]*=.*/s//license = \"$esc\"/" "$f"
+          corregidas=$((corregidas+1))
+        else
+          ya=$((ya+1))
+        fi
+        continue
+      fi
       # Insertar DESPUÉS de la línea `version = ...`, que está en la raíz del TOML y antes de
       # cualquier `[table]`. Es el único sitio seguro (ver la trampa de TOML en la cabecera).
       if grep -qE '^version[[:space:]]*=' "$f"; then
@@ -90,7 +111,7 @@ case "$MODO" in
     done
     [ "$hallada" = 0 ] && sin_receta=$((sin_receta+1))
   done < "$TABLA"
-  echo "==> sembradas $puestas · ya tenían $ya · en la tabla pero sin receta $sin_receta"
+  echo "==> sembradas $puestas · corregidas $corregidas · ya tenían $ya · sin receta $sin_receta"
   echo "==> verificá que el hash NO se movió:  ./scripts/store-gc.sh   (debe dar los mismos vigentes)"
   ;;
 
@@ -139,6 +160,23 @@ case "$MODO" in
   done
   pct=0; [ "$tot" -gt 0 ] && pct=$((con*100/tot))
   echo "==> licencias declaradas: $con de $tot recetas (${pct}%)"
+
+  # ── GUARDIÁN: licencias con FORMA INVÁLIDA ───────────────────────────────────────────────────
+  # El 2026-08-07 se escribió el cuerpo de un error JSON de la API de GitHub dentro de 5 recetas
+  # (`license = "{"message":"Not Found",...}"`). Las comillas rompen el TOML ⇒ esas recetas dejaron
+  # de parsear y de tener ArtifactHash, y así se COMMITEARON. No lo vio nadie leyendo: lo cazó la
+  # comparación de hashes. Por eso el informe lo comprueba SIEMPRE y sale distinto de cero: un dato
+  # con forma imposible es un fallo aguas arriba disfrazado de dato, y hay que verlo sin buscarlo.
+  malas=0
+  for f in $(recetas); do
+    l=$(licencia_de "$f")
+    [ -z "$l" ] && continue
+    case "$l" in *[!A-Za-z0-9.+\ -]*) echo "!!  FORMA INVÁLIDA en $f: $(printf '%.50s' "$l")"; malas=$((malas+1));; esac
+  done
+  if [ "$malas" -gt 0 ]; then
+    echo "!!  $malas recetas con licencia de forma imposible — probablemente TOML roto. Arreglar YA."
+    exit 1
+  fi
   if [ "$con" -gt 0 ]; then
     echo "==> reparto:"
     sort /tmp/.lic-cuenta.$$ | uniq -c | sort -rn | head -25 | sed 's/^/    /'