Ir al contenido
CodArchel mapa vivo de la arquitectura
ESEN

El riesgo y el lint

La decisión es el ADR 0108. La salud que se copia es la de el artefacto 1.3.

B es la de siempre: complejidad 50 %, churn 32 % y tamaño 18 %. Si una señal no existe, esos pesos se renormalizan. Cada señal se divide por su p95 y se corta a 1. Gamma es 1,7. Una carpeta se queda con el máximo de sus ficheros, no con la suma.

Sin término de lint, risk = B^1,7. Es el mismo número de antes.

D = errores + 0,25·avisos
nL = clamp(D / 10, 0, 1)
raw = min(B + 0,2·nL, 1)
risk = raw^1,7 0..1
score = 100·raw^1,7 0..100

Info no entra en D. α = 0,2 y Dsat = 10 no están calibrados. El lint nunca resta. Si raw ya es 1, más deuda no sube el índice: un mapa de dos ficheros suele estar ya en ese tope, porque el p95 es el menor de los dos.

Por fichero, la vista que sale de su scopeHealth:

CampoQué es
freshtrue si meta.tree es el checksum del snapshot. false si los dos existen y no coinciden. null si no hubo comparación.
countsErrores, avisos, info y hallazgos, contados desde los mensajes.
coverage.stateunmeasured, unknown, partial o complete.
coverage.eligibleTamaño del universo. null no es cero.
coverage.measuredNo entra en la fórmula.
coverage.reasonsLos códigos del contrato. Importan not-found, not-eligible y no-eligible.
applicabilityapplicable, na o not-found.
reasonEl primer motivo, para acreditar na.

No se pasa la salud del proyecto ni el artefacto entero. Si no hay artefacto, no hay vista. Un fichero que no está en files no se rellena con 0.

lintView gana al número legado. Ese número solo vive para quien todavía no construye la vista: se lee como deuda fresca de cobertura desconocida, y hace falta options.lint.

SituaciónQué hace el índice
fresh === true y hay errores o avisos, aunque el estado sea unknownSuma. La confianza es mínimo observado, no medida cerrada.
fresh === true, cobertura complete, eligible > 0, deuda 0 e info 0No suma. Puede decirse limpio.
fresh === true y deuda 0 con universo desconocidoSuma 0. No baja al resto y no se llama limpio.
fresh === falseNo penaliza. El árbol no es este.
fresh === nullNo penaliza. No hubo comparación (freshness-unverified).
applicability: "na"No penaliza. No es cero.
applicability: "not-found"No penaliza. No es no aplicable ni cero.
Sin artefactoNo hay vista. El riesgo es B^1,7.

Cada señal tiene points, percent y weight.

  • points son puntos del índice 0..100. Los que no son null suman score.
  • percent es el porcentaje de ese índice. Null si el índice es 0 o la señal no entra.
  • weight es el peso nominal (0,50, 0,32, 0,18, y 0,2 para el lint cuando hay nL). No es la parte renormalizada ni el porcentaje.

points null significa que la señal no entra. No es un cero.

El objeto es el que devuelve riskBreakdown en @codarch/metrics (packages/metrics/src/risk.ts). El modelo de render lo guarda en riskBreakdown de cada fichero, y de ahí pasa a la ficha. No se escribe en cc.json. El MCP y la captura lo copian solo en su salida. Si el snapshot no trae métricas, el campo es null: la ficha no lo recalcula.