ADR 0108 — El lint suma al riesgo
Estado: aceptado · Fecha: 2026-11-06
Enmienda el punto 3 del ADR 0094 y no toca los pesos de la base del ADR 0008. La cobertura que se lee es la del ADR 0107. La fórmula, con los casos, está en el riesgo.
Contexto
Sección titulada «Contexto»Con artefacto, el riesgo reescalaba la base para dejar un 20 % al lint: complejidad 0,40, churn 0,256, tamaño 0,144 y lint 0,20. Un fichero sin hallazgos bajaba, porque ese 20 % pesaba cero. Un fichero que no estaba en files se rellenaba con cero y contaba como medido. La salud del proyecto, si se usaba, decía lo mismo de todos.
Eso mezcla tres cosas distintas: la base del snapshot, la deuda observada y el hecho de no haber podido comparar el árbol.
Decisión
Sección titulada «Decisión»-
La base B no cambia. Complejidad 50 %, churn 32 % y tamaño 18 %, renormalizados si falta una señal, normalizados por su p95. Gamma sigue en 1,7. Las carpetas siguen agregando por máximo.
-
El lint no es una cuarta señal de esa base. Con deuda que entra, se suma antes de gamma y nunca resta:
D = errores + 0,25·avisos(info no cuenta)nL = clamp(D / 10, 0, 1)raw = min(B + 0,2·nL, 1)risk = raw^1,7en 0..1score = 100·raw^1,7en 0..100α = 0,2 y Dsat = 10 son provisionales: no están calibrados.
RISK_WEIGHTS_WITH_LINTse queda exportado como metadato de la ficha; el índice no lo usa. -
Quien calcula el riesgo pasa
lintViewde cada fichero, copiada de suscopeHealth:fresh,counts,coverage(state,eligible,measured,reasons),applicability(applicable,naonot-found) yreason. No se pasa la salud del proyecto. No se pasa el artefacto entero. Si no hay artefacto, no hay vista: no se inventa un 0. -
Si el fichero trae
lintView, manda sobre el número legado y sobreoptions.lint. El número legado solo es puente para quien aún no tiene vista. -
La deuda entra con
fresh === truey cuentas válidas, aunque la cobertura seaunknown,partialounmeasured: es un mínimo observado, no una medida cerrada.fresh === falseonullno penaliza.fresh === nullsigue siendo «no hubo comparación», con motivofreshness-unverified. -
No aplicable y no encontrado no se colapsan.
nasale deeligible === 0, denot-eligibleono-eligible, o deapplicability: "na"con un motivo.not-foundes otro estado: no es cero ni es no aplicable. -
contributionsde complejidad, churn, tamaño y lint tienenpoints,percentyweight. Lospointsque no son null sumanscore.weightes el peso nominal, no el porcentaje ni la parte renormalizada.pointsnull significa que la señal no entra.
risk sin término de lint es el de la base sola, el mismo de antes de este término.
Consecuencias
Sección titulada «Consecuencias»- Un mapa con dos ficheros puede no mover el color: el p95 es el menor, los dos saturan a 1 y sumar lint no pasa de 1. Hacen falta hallazgos y una base que no esté ya en el tope.
- Cero hallazgos con árbol al día suma cero. No baja el riesgo del resto.
- La lente de deuda sigue pintando
errores + 0,25·avisos. Eso no es el término del índice. - La ficha que aún lee
parts.lint.weightve 0: en el desglose de la base ese peso no existe. Las contribuciones de la ficha las cierra el frontend sobre esta rama. - α y Dsat se pueden cambiar sin tocar el contrato de
scopeHealth.
Alternativas descartadas
Sección titulada «Alternativas descartadas»- Seguir reescalando al 20 %. Un cero de lint bajaba ficheros que nadie había podido declarar limpios.
- Rellenar con 0 los ficheros ausentes de
files. Ausencia y deuda cero dejaban de distinguirse. - Usar la salud del proyecto para todos. Un hallazgo en un fichero teñía el índice de los demás.
- No sumar nada si la cobertura es
unknown. Se tiraban errores que sí se vieron. Entran como mínimo observado, y no se llama limpio.
Hoja de ruta
Sección titulada «Hoja de ruta»Sin fase nueva.
- Hecho: la fórmula en
@codarch/metricsy el cable del render, del MCP y de la captura. - Queda fuera: la fila de contribuciones en la ficha. El frontend la parchea sobre esta rama.
- Queda abierto: calibrar α y Dsat. Hoy son provisionales.
El registro de lo hecho vive en el feed de la guía.