Auditorías del código
Prefer English? Read the English version.
Cada cierto tiempo, el código que ha entrado desde la última auditoría se vuelve a leer de arriba abajo: una vez buscando fallos que una persona puede ver, otra buscando los que nadie ve hasta que cuestan algo, y otra buscando código que se repite o que será difícil de ampliar. Esta página explica cómo se hace y cómo se informa, para que dos auditorías separadas por un año se puedan comparar y para que cualquiera —una persona que contribuye o un asistente de IA— haga la siguiente igual.
Cuánto hace de la última
Cada auditoría deja una etiqueta anotada en el commit que revisó, auditoria/AAAA-MM-DD:
git describe --tags --match 'auditoria/*' # auditoria/2026-10-14-37-g1a2b3c4 → 37 commits desde entonces
git log --oneline auditoria/2026-10-14..main # lo que tendrá que leer la siguiente
git diff --stat auditoria/2026-10-14..main -- McServerLauncher McServerLauncher.Tests
La etiqueta marca el código que se leyó, no el que se arregló: los arreglos vienen después, en sus propios pull requests, y la siguiente auditoría también los lee. El registro de abajo dice qué encontró cada una y dónde se arregló.
Alcance
Desde la última etiqueta auditoria/* hasta main, en tres áreas, y cada archivo de un área se lee
entero; el diff solo dice qué archivos abrir:
| Área | Qué cubre |
|---|---|
| Configuración e interfaz | La página de configuración del servidor, la de servidor nuevo, las cajas de números, los bindings de las vistas |
| Contenido | Mods y plugins: instalar, actualizar, sustituir, limpiar, la tienda, Crossplay/Hydraulic/MultiVersion |
| Ciclo de vida | Arrancar, parar, copias y restauración, wake-on-demand, la prueba de conexión, la fontanería de la app |
Y en todas: las claves .resx, el texto que un error pone en pantalla y el estilo de la casa.
Qué se busca
- Texto interno en pantalla. El mensaje de una excepción (
ex.Message), el nombre de un tipo de .NET, inglés dentro de una frase en español, una clave de recurso en vez de su texto, un{0}sin rellenar,NaN. El usuario ya vio una vezInvalidCastException: Could not convert '(null)' to System.Int32debajo de una caja de números. - Bindings que fallan en silencio. Las vistas usan
x:CompileBindings="False": un nombre de propiedad con otra mayúscula compila y simplemente no enseña nada. Cada ruta se compara con su contexto de datos. - Los cinco
.resx. Toda clave que se usa existe en todos, con los mismos huecos, y las claves que ya no usa nadie se quitan. - Estado que no vuelve. Un indicador
Is*, una puerta o una configuración a medio copiar que se quedan puestos cuando una excepción se va por otro camino. - Escrituras que pueden quedar a medias. Un archivo del que la app depende se escribe con un nombre temporal y se mueve a su sitio; lo que se le enseña al usuario en una lista (un zip de copia) solo aparece cuando está completo.
- Hilos. Colecciones cambiadas fuera del hilo de la interfaz,
async void, tareas lanzadas sin esperar cuyos fallos no ve nadie, cancelaciones que se aceptan y luego se ignoran. - Windows y Linux. Rutas que distinguen mayúsculas, bloqueos de archivo que existen en un sistema y no en el otro, tests que se saltan fuera de Windows y no prueban nada en el otro runner de CI.
- Dos respuestas a una pregunta. Código nuevo que reescribe un helper que ya existe (se dice cuál y dónde), o la misma lógica tres veces con tres resultados un poco distintos.
- El estilo de la casa.
.editorconfig, las reglas de nombres, 110 columnas, comentarios en inglés.
Gravedad
| Gravedad | Qué significa |
|---|---|
| Alta | Se pierden o se dañan datos, un servidor no puede arrancar, o la interfaz dice algo del servidor que no es verdad |
| Media | Un comportamiento incorrecto que un usuario puede encontrarse usando la app normalmente, o texto interno en pantalla |
| Baja | Un caso límite, un mensaje que confunde, un coste pequeño que nadie notaría |
| Diseño | Duplicación o una forma que hace más difícil el siguiente cambio; hoy no se comporta mal |
| Estilo | Se sale del estilo de la casa |
Comprobar antes de informar
Cada hallazgo se marca como confirmado —el camino del código se leyó de punta a punta, o el fallo se reprodujo— o plausible —depende de un momento concreto, de un servicio de fuera o de un detalle del framework que nadie ha comprobado aún—. Todo lo que se informa como alto se comprueba antes, y comprobar puede bajarlo de grado: en la auditoría del 2026-10-14, «actualizar EssentialsX borra sus módulos» se contrastó con la API de Modrinth, que publica un solo archivo por versión, y pasó de alta a baja.
Un hallazgo que necesita la interfaz para estar seguro se reproduce antes de arreglarlo, en una app de
Avalonia de usar y tirar que aloja la vista de verdad: registra los errores de binding
(LogToTrace(LogEventLevel.Warning)) y hace una captura con RenderTargetBitmap. Compilar no prueba
nada de una vista cuyos bindings no se compilan.
El informe
El informe se escribe para quien decide qué se arregla, así que cada hallazgo se cuenta como lo que un usuario vería o perdería, no como lo que hace el código.
- Una página con los hallazgos (una página HTML; las del mantenedor se guardan como artifacts de
Claude):
- arriba, el rango, la etiqueta y la etiqueta anterior;
- un recuento por gravedad;
- una lista que se filtra por gravedad y por área, con una fila por hallazgo: su gravedad, su área,
confirmado / plausible, el pull request que lo arregla, un título que es el síntoma, el
escenario concreto (entradas y estado → resultado equivocado) y el
archivo:líneadonde mirar.
- Una decisión de alcance: qué se arregla ahora y qué va a un issue.
- Un issue de seguimiento titulado
Auditoría AAAA-MM-DD, con cada hallazgo como tarea. - Una fila en el registro.
Arreglar
- Pull requests por área, cada uno desde
mainen su propio worktree, cada uno con tests que fallan con el código viejo. Un cambio transversal en el que se apoyan los demás (un traductor de errores único, por ejemplo) va primero. - Lo que enseña una auditoría entra en Reglas de corrección aprendidas a golpes, en el mismo pull request que el arreglo del que sale.
- Cuando se mezcla el último arreglo, la fila del registro recibe sus pull requests y el issue se cierra.
Registro
| Fecha | Etiqueta | Rango | Alta · Media · Baja · Diseño | Issue | Arreglado en |
|---|---|---|---|---|---|
| 2026-10-04 | auditoria/2026-10-04 |
toda la app, hasta 5c6d45e |
40 arreglos (seguridad, fiabilidad, rendimiento) | — | #34, #35 |
| 2026-10-14 | auditoria/2026-10-14 |
auditoria/2026-10-04..989678f (v1.17.0 → 1.19.1) |
6 · 13 · 17 · 8 | #55 | #57, #58, #60–#63 |