Files
sergioandClaude Opus 4.8 4f609080df yupana: los 2 "bugs" de duplicados eran falsos positivos MÍOS — detector afinado, 0 reales
El usuario pidió arreglar itstool y la sombra de dbus. Apliqué el reflejo
(`yupana radio` + diff completo antes de tocar) y NINGUNO era un bug: ambos eran
patrones deliberados y documentados que mi detector, demasiado superficial, leyó
mal. Si los "arreglaba" a ciegas rompía dos builds.

  · dbus: corpus/dbus (estático) e incoming-kde/dbus (dinámico) NO son redundantes
    — qtbase linkea libdbus-1.so dinámicamente para Qt6DBus. El detector comparó
    sólo versión+sha+deps, no el BUILD. Borrar la sombra rompía KDE.
  · itstool: es un STUB documentado (`[source]=carrier`). El itstool real es
    Python con libxml2-bindings ausentes en el lab; este genera un script inline y
    sólo PRESTA el tarball de gettext-tiny. Apuntarlo al itstool real rompía
    appstream (radio 5) con un source que ni compila acá.
    Los 3 *-hello son el mismo patrón carrier; prison/prison-scanner una variante
    cross-nombre (misma fuente, WITH_ZXING distinto).

FIX = el detector, no las recetas. Tres señales que le faltaban:
  1. huella de BUILD en la firma de sombra (estático≠dinámico ⇒ no redundante).
  2. CARRIER: ≤1 receta del grupo construye la fuente ⇒ el resto presta el tarball.
     Señal: ¿invoca make/meson/cmake/ninja/cargo? (comentarios strippeados — la
     prosa "invocación de meson" de un stub daba falso builder, lo cazó el guardián).
  3. variante cross-nombre: ≥2 builders con BUILD distinto = deliberado, no bug.
Resultado: 0 colisiones reales (invariante c se cumple), 4 carrier + 14 variantes
+ 12 sombras justificadas, todas benignas.

Guardián extendido: ancla que el detector agrupa por FUENTE (itstool↔gettext-tiny)
y NO cría lobos (itstool=carrier, dbus=variante deliberada).

LECCIÓN: el reflejo del radio/diff antes de tocar evitó dos borrados destructivos
guiados por un falso positivo de mi propia herramienta. Medir antes de creer, aun
a la propia yupana.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-22 20:14:10 -04:00

372 lines
6.1 KiB
JSON

{
"schema": "hammer-duplicados/2",
"colisiones_fuente": [],
"variantes": [
{
"sha": "ab5a03176ee106d3",
"nudos": [
"corpus/bzip2",
"incoming-kde/bzip2-shared"
],
"radio": {
"corpus/bzip2": 0,
"incoming-kde/bzip2-shared": 3
}
},
{
"sha": "2300f3dbfa7253b3",
"nudos": [
"corpus/fontconfig",
"incoming-kde/fontconfig-shared"
],
"radio": {
"corpus/fontconfig": 17,
"incoming-kde/fontconfig-shared": 2
}
},
{
"sha": "36bc4f1cc4133353",
"nudos": [
"corpus/freetype",
"incoming-kde/freetype-shared"
],
"radio": {
"corpus/freetype": 19,
"incoming-kde/freetype-shared": 3
}
},
{
"sha": "51ab804c56f6eab3",
"nudos": [
"corpus/glib",
"incoming-kde/glib-shared"
],
"radio": {
"corpus/glib": 14,
"incoming-kde/glib-shared": 10
}
},
{
"sha": "075920b826834ac4",
"nudos": [
"corpus/libjpeg-turbo",
"incoming-kde/libjpeg-turbo-shared"
],
"radio": {
"corpus/libjpeg-turbo": 9,
"incoming-kde/libjpeg-turbo-shared": 6
}
},
{
"sha": "8c9b05b675ca7301",
"nudos": [
"corpus/libpng",
"incoming-kde/libpng-shared"
],
"radio": {
"corpus/libpng": 16,
"incoming-kde/libpng-shared": 8
}
},
{
"sha": "ffc6af80b014ddeb",
"nudos": [
"corpus/linux",
"corpus/linux-headers",
"corpus/linux-metal"
],
"radio": {
"corpus/linux-headers": 29,
"corpus/linux-metal": 0,
"corpus/linux": 0
}
},
{
"sha": "b43e0a2db2a89fc5",
"nudos": [
"corpus/linux-generic",
"corpus/linux-metal-dual"
],
"radio": {
"corpus/linux-generic": 0,
"corpus/linux-metal-dual": 0
}
},
{
"sha": "51aa686ca4060e38",
"nudos": [
"corpus/mesa",
"corpus/mesa-llvmpipe",
"corpus/mesa-swrast"
],
"radio": {
"corpus/mesa-llvmpipe": 0,
"corpus/mesa-swrast": 0,
"corpus/mesa": 124
}
},
{
"sha": "47fe8c99461250d4",
"nudos": [
"corpus/pcre2",
"incoming-kde/pcre2-shared"
],
"radio": {
"corpus/pcre2": 19,
"incoming-kde/pcre2-shared": 11
}
},
{
"sha": "fff1ffcf2b0da84d",
"nudos": [
"corpus/xz",
"incoming-kde/xz-shared"
],
"radio": {
"corpus/xz": 0,
"incoming-kde/xz-shared": 4
}
},
{
"sha": "9a93b2b7dfdac77c",
"nudos": [
"corpus/zlib",
"incoming-kde/zlib-shared"
],
"radio": {
"corpus/zlib": 67,
"incoming-kde/zlib-shared": 34
}
},
{
"sha": "760903e9ae401f8b",
"nudos": [
"incoming-kde/prison",
"incoming-kde/prison-scanner"
],
"radio": {
"incoming-kde/prison-scanner": 1,
"incoming-kde/prison": 3
}
},
{
"sha": "809afafab61593f9",
"nudos": [
"incoming-kde/qcoro",
"incoming-kde/qcoro-shared"
],
"radio": {
"incoming-kde/qcoro-shared": 2,
"incoming-kde/qcoro": 1
}
}
],
"carriers": [
{
"sha": "5eacc5550f0bdbba",
"nudos": [
"corpus/adwaita-hello",
"corpus/libadwaita"
],
"radio": {
"corpus/adwaita-hello": 0,
"corpus/libadwaita": 3
},
"carriers": [
"corpus/adwaita-hello"
]
},
{
"sha": "29cc165e27e83d2b",
"nudos": [
"corpus/gettext-tiny",
"corpus/itstool"
],
"radio": {
"corpus/gettext-tiny": 78,
"corpus/itstool": 1
},
"carriers": [
"corpus/itstool"
]
},
{
"sha": "e1817c650ddc3261",
"nudos": [
"corpus/gtk4",
"corpus/gtk4-hello"
],
"radio": {
"corpus/gtk4-hello": 0,
"corpus/gtk4": 6
},
"carriers": [
"corpus/gtk4-hello"
]
},
{
"sha": "ab35d420102f3e8b",
"nudos": [
"corpus/gtksourceview",
"corpus/hammer-edit",
"corpus/sourceview-hello"
],
"radio": {
"corpus/gtksourceview": 2,
"corpus/hammer-edit": 0,
"corpus/sourceview-hello": 0
},
"carriers": [
"corpus/hammer-edit",
"corpus/sourceview-hello"
]
}
],
"sombras": [
{
"nombre": "dbus",
"colas": [
"corpus",
"incoming-kde"
],
"redundante": false,
"radio": {
"corpus/dbus": 0,
"incoming-kde/dbus": 114
}
},
{
"nombre": "libarchive",
"colas": [
"corpus",
"incoming-kde"
],
"redundante": false,
"radio": {
"corpus/libarchive": 0,
"incoming-kde/libarchive": 1
}
},
{
"nombre": "libevdev",
"colas": [
"corpus",
"incoming-kde"
],
"redundante": false,
"radio": {
"corpus/libevdev": 2,
"incoming-kde/libevdev": 2
}
},
{
"nombre": "libgcrypt",
"colas": [
"corpus",
"incoming-kde"
],
"redundante": false,
"radio": {
"corpus/libgcrypt": 1,
"incoming-kde/libgcrypt": 16
}
},
{
"nombre": "libgpg-error",
"colas": [
"corpus",
"incoming-kde"
],
"redundante": false,
"radio": {
"corpus/libgpg-error": 4,
"incoming-kde/libgpg-error": 16
}
},
{
"nombre": "libinput",
"colas": [
"corpus",
"incoming-kde"
],
"redundante": false,
"radio": {
"corpus/libinput": 1,
"incoming-kde/libinput": 1
}
},
{
"nombre": "libnl",
"colas": [
"corpus",
"incoming-kde"
],
"redundante": false,
"radio": {
"corpus/libnl": 1,
"incoming-kde/libnl": 2
}
},
{
"nombre": "libxkbcommon",
"colas": [
"corpus",
"incoming-kde"
],
"redundante": false,
"radio": {
"corpus/libxkbcommon": 9,
"incoming-kde/libxkbcommon": 114
}
},
{
"nombre": "libxml2",
"colas": [
"corpus",
"incoming-kde"
],
"redundante": false,
"radio": {
"corpus/libxml2": 7,
"incoming-kde/libxml2": 4
}
},
{
"nombre": "mtdev",
"colas": [
"corpus",
"incoming-kde"
],
"redundante": false,
"radio": {
"corpus/mtdev": 2,
"incoming-kde/mtdev": 2
}
},
{
"nombre": "openssl",
"colas": [
"corpus",
"incoming-kde"
],
"redundante": false,
"radio": {
"corpus/openssl": 25,
"incoming-kde/openssl": 21
}
},
{
"nombre": "util-linux",
"colas": [
"corpus",
"incoming-kde"
],
"redundante": false,
"radio": {
"corpus/util-linux": 1,
"incoming-kde/util-linux": 20
}
}
]
}