Cómo se audita una cartera de 72 sistemas.
LOC, commits, tests y CI no son un portafolio: son la materia prima. El método que convierte 72 carpetas en una tabla con etapas, impacto y límites.
Un portafolio sin medición es una lista de carpetas con nombres bonitos. La diferencia es incómoda: la lista se puede escribir de memoria; el portafolio exige abrir cada repositorio y contar.
La auditoría de cartera al 2026-11-13 cubrió 72 sistemas propios y 23 componentes vendored, medidos desde el código, git y los manifiestos. Los agregados: 1.243.401 líneas, 3.843 commits, 21.292 tests, 14 sistemas en producción.
Qué se mide
Seis variables por repositorio, todas obtenibles sin preguntarle a nadie:
- LOC: líneas de los archivos rastreados por git.
- Commits: historia real, no carpetas copiadas.
- Tests: casos contados recorriendo el árbol de pruebas.
- CI: presencia y contenido del workflow, no la intención de tenerlo.
- TODO: deuda declarada en el código y los manifiestos.
- Dependencias y fechas:
package.json,pyproject.toml,Cargo.toml, y la fecha del último commit.
Además, tres juicios que no salen de un comando: etapa (idea, prototipo, alpha, beta, producción, dormido), impacto de 1 a 5 y madurez de 1 a 5. Se marcan como juicios: el dato y la opinión no comparten columna.
Cómo se mide
Las líneas se cuentan sobre git ls-files: lo que el repositorio rastrea, no lo que hay en el disco. Así quedan fuera node_modules, entornos virtuales y artefactos de build, que inflan cualquier cifra y no son código propio. Los 23 componentes vendored se cuentan aparte y no entran en el total propio.
La actividad sale de las fechas de commit. Donde no hay historia —repositorios sin git, exports, carpetas heredadas— se usa el mtime del archivo más reciente y se declara esa procedencia. Un mtime dice cuándo se tocó un archivo; un commit, cuándo alguien decidió tocar el sistema. La tabla los distingue.
Los tests se cuentan por árbol de pruebas, no por reporte de cobertura: contar casos no dice qué se ejercita. CI y TODO se leen de los manifiestos: .github/workflows, Makefile, pyproject.toml y los comentarios con formato de deuda. Si el workflow existe pero no corre, la columna dice que existe; la interpretación va en la ficha.
Qué produce
Una tabla por sistema con etapa, impacto, madurez, confianza y una proyección escrita: qué lo movería de etapa y qué lo mataría. Cuatro filas reales, con las cifras tal como salieron:
| Sistema | LOC | Commits | Tests | CI | Etapa | Madurez | Impacto |
|---|---|---|---|---|---|---|---|
cerberus_compliance | 602.127 | 2.729 | 12.982 | sí | Producción | 5 | 5 |
cerberus_prescience | 308.292 | 621 | 5.741 | sí | Producción | 5 | 4 |
cerberus-compliance (SDK Python) | 31.156 | 53 | 1.234 | sí | Producción | 5 | 4 |
cerberus_hft | 5.708 | 4 | 0 | no | Alpha | 3 | 4 |
La tabla corrige dos intuiciones de un vistazo: el volumen de líneas no ordena los sistemas por valor, y un proyecto de 5.708 líneas con 4 commits no está en producción aunque su README lo insinúe.
Límites
LOC no es valor. Un archivo de configuración de 3.000 líneas cuenta igual que 3.000 líneas de motor de riesgo, y la mitad de las líneas de un proyecto maduro suelen ser pruebas. Sirve para dimensionar esfuerzo y detectar abandono, no para rankear calidad.
Commits no son calidad. Un repositorio con un solo commit puede contener un sistema terminado importado de golpe; uno con 2.700 puede ser un historial granular sobre el mismo módulo. La cifra mide actividad, y la actividad sin etapa no dice nada.
Tests no son cobertura. Contar casos no dice qué se ejercita; la cobertura, cuando existe, viene en la ficha como dato aparte. Y la presencia de un workflow no garantiza que pase: la auditoría registra que el archivo está, no que el pipeline esté verde.
Decisiones
La tabla no se queda en diagnóstico. Cada fila termina en una decisión.
14 en producción son los sistemas con usuarios, dominio, respaldo y alguien que responde cuando falla. 16 dormidos no son fracasos: están apagados a propósito, con una condición de reanudación escrita. La diferencia entre un sistema dormido y un sistema muerto es que el primero tiene una frase que explica qué lo despertaría.
El reparto completo es 14 en producción, 15 en beta, 10 en prototipo, 9 en alpha, 8 en idea y 16 dormidos. El valor de tenerlos contados es que impide la ilusión más común de una cartera grande: creer que todo avanza. Avanzan 14. El resto está en una etapa, y la etapa es una decisión, no un accidente.
Esa es la función de la auditoría: convertir una lista de carpetas en un tablero donde cada casilla tiene un número y una consecuencia.
- auditoría
- cartera
- medición