Quién es quién: lo que estoy arreglando por dentro (y por qué mis alertas llevan dos semanas calladas)
Tres averías de mi plataforma, contadas sin maquillaje: la identidad de las empresas, el lío de las UTE y un sistema de alertas que lleva desde el 1 de septiembre en silencio.
Esta plataforma vigila el gasto público de Melilla. Si le pido transparencia a la Administración, lo mínimo es aplicármela a mí mismo. Así que aquí va un repaso honesto de tres cosas que he encontrado rotas por dentro, qué he arreglado ya y qué sigue pendiente.
Dos de ellas afectan a algo que es el corazón del asunto: saber quién es quién. La tercera es el silencio de las alertas.
1. El problema de fondo: una empresa, muchos nombres
En el portal hay hoy 22.465 contratos y 2.846 empresas. Y la pregunta que más valor tiene —«¿cuánto dinero público ha recibido esta empresa?»— depende por completo de una tarea invisible: reconocer que «CONSTRUCCIONES EJEMPLO, S.L.», «Construcciones Ejemplo SL» y «CONSTRUCCIONES EJEMPLO SOCIEDAD LIMITADA» son la misma cosa.
Eso lo resuelvo anclando cada ficha a su CIF, no a su nombre. El nombre es ruido: cambia según quién teclee el expediente. El CIF no. Por eso en la base de datos hay una regla dura que impide que existan dos fichas con el mismo CIF.
Pero quedan huecos, y conviene decirlos con nombre y apellidos:
- Hay expedientes en los que la propia fuente oficial (PCSP) publica el identificador tapado o mal escrito.
- Hay identificadores con forma de DNI en fichas marcadas como empresa. Eso no es una errata cosmética: si una regla automática lo clasificara mal, publicaría el DNI de una persona física. Eso a la Administración le da igual, pero a mí no. Los DNIs de los autónomos no hay que publicarlos. Prefiero una cola de revisión manual antes que ese riesgo.
Por eso estos casos van a un panel de revisión humana donde alguien decide (yo) y deja constancia de en qué documento se apoyó. La decisión queda grabada y sobrevive a las siguientes recargas de datos: no hay que volver a tomarla cada semana.
2. Las UTE: el agujero más grande que he encontrado
Una UTE (Unión Temporal de Empresas) es una alianza entre dos o más empresas para ejecutar una obra o un servicio concretos. Son legales, habituales y perfectamente normales. El problema es cómo se escriben en la PCSP porque normalmente no tienen un CIF propio cuando se les adjudica el contrato. Solo tenemos un nombre, escrito de mil maneras distintas en función del funcionario que toqueteó el expediente.
Por ejemplo, la misma UTE aparece en cinco fichas distintas, con el orden de los socios invertido, con y sin la coletilla «LEY 18/1982», con «número 2» en minúscula en una y en mayúscula en otra: un maldito caos. Entre esas cinco fichas suman cerca de 3,95 millones de euros que hoy nadie puede ver como una sola relación, como contratos de una sola UTE.
Por qué no lo resuelvo «con un algoritmo»
Porque cualquiera que prometa resolverlo automáticamente por el nombre estaría vendiendo humo. Lo he medido sobre las fichas con pinta de UTE y salen cuatro obstáculos:
- Falsos positivos. Muchos nombres comerciales llevan un guion entre dos palabras y no son una UTE. Una regla automática inventaría uniones de empresas que no existen.
- Muchas UTE no nombran a sus socios en el título. Del nombre no se deduce nada.
- Los socios vienen abreviados con siglas que ninguna comparación de texto descubre.
- El código de la fuente no es una identidad, como acabo de explicar.
Qué he construido
Un identificador interno propio que se ancla en quiénes la forman, no en cómo está escrita. Los socios sí tienen CIF válido y conocido; el nombre es basura variable. Sobre ese principio ya está desplegado en producción:
- El modelo de datos que guarda la identidad de la UTE, sus socios y las fichas variantes que absorbe;
- Un generador que propone agrupaciones (nunca decide);
- Un mecanismo de decisión que exige citar el documento oficial en el que se apoya, y que es inmutable: una decisión firmada no se puede reescribir sin dejar rastro.
Hoy todo eso está dormido a propósito: no hay ninguna pantalla que lo invoque todavía, y por eso el portal aún no muestra las UTE agrupadas. Estoy en ello.
3. Las alertas llevan desde el 1 de septiembre sin salir
Esta es la parte que menos gusta escribir.
La plataforma tiene un sistema de avisos: cuando aparece un contrato nuevo, una adjudicación o un cambio relevante que encaja con lo que alguien vigila, se envía un mensaje de Telegram. Lleva 63.677 avisos enviados desde que existe.
El último salió el 1 de septiembre a las 09:15. Desde entonces, ninguno. Hay 617 avisos pendientes esperando en la cola. No he tenido tiempo de arreglarlo hasta ahora.
Qué pasó, en cristiano
El 29 de agosto introduje una mejora relacionada precisamente con la identidad pública de las UTE. Esa mejora generaba, sin que yo me diera cuenta, una consulta inválida a la base de datos: pedía una columna que no existe en la tabla que consultaba. La consulta fallaba siempre, para cualquier contrato.
Y ahí se sumó un segundo defecto de diseño, más grave que el primero: el sistema coge los cien avisos más antiguos en cada vuelta. Como fallaban, se quedaban en la cola. Y al cuarto de hora volvía a coger los mismos cien. La cola quedó tapada por su propia cabeza, y ningún aviso nuevo llegó a salir jamás.
Lo que me llevo de todo esto
Los datos públicos vienen sucios, y limpiarlos a ojo es inventar. Cuando no se puede saber algo con certeza, la respuesta honesta es dejarlo pendiente y decirlo, no rellenarlo con una suposición que parezca convincente.
Contar los fallos propios forma parte del trabajo. Una herramienta de fiscalización que esconde sus averías no se puede tomar en serio cuando señala las de los demás.
Y cuando las UTE aparezcan agrupadas en el portal, lo contaré aquí también.
Una última cosa: estoy pensando en abrir el código
Lo que ves en la web es la punta del iceberg. Debajo hay una cantidad de trabajo que, si te soy sincero, todavía me sorprende a mí: procesos que bajan documentos oficiales de madrugada, un sistema que los interpreta, otro que compara lo de hoy con lo de ayer, copias de seguridad que cada noche se restauran en un servidor de mentira solo para comprobar que la copia sirve de verdad, colas de revisión, reglas de privacidad, alertas… Todo eso para que alguien pueda escribir el nombre de una empresa en un buscador y ver una cifra.
Y esto no se acaba nunca. Cada cosa que arreglas te enseña dos que no sabías que estaban rotas. Este mismo artículo es la prueba.
Por eso llevo un tiempo dándole vueltas a publicar el código fuente en GitHub, abierto, para que cualquiera pueda mirarlo. Por dos motivos:
- Para que otros puedan montar lo suyo. Esto no tiene nada de específico de Melilla. Los contratos públicos se publican igual en toda España. Si alguien en otra ciudad quiere levantar su propia plataforma de vigilancia del gasto, que no tenga que empezar desde cero como empecé yo. Solo tiene que cambiar las reglas de parseo y en lugar de fiscalizar los contratos de Melilla, fiscalizas los de Marbella, Málaga o Teruel.
- Para que me ayuden con los fallos. Cuatro ojos ven más que dos, y cuarenta ven muchísimo más. Los tres problemas que acabo de contar los he encontrado yo solo, tarde y de rebote (yo solo y los agentes de IA, ya me entiendes ;.-) Con el código a la vista, alguien que sepa más que yo (es decir, cualquiera) podría haberlos visto antes.
Por qué todavía no lo he hecho
Aquí toca ser honesto, que es de lo que va este artículo entero.
Yo no soy programador. Soy un novato con superpoderes prestados: todo esto lo he construido apoyándome en inteligencia artificial, preguntando, equivocándome y volviendo atrás. Funciona, está en pie y sirve para algo. Pero hay cosas que se me escapan, y lo sé.
Y la que más miedo me da es esta: que se me haya quedado una contraseña perdida en algún rincón del código. Una clave de acceso, un token, algo escrito en un archivo hace meses que yo ya ni recuerdo. Publicar el repositorio con algo así dentro es abrirle la puerta de par en par a cualquiera que tenga ganas de fastidiar.
No es paranoia. Le pasa a empresas con equipos de seguridad enteros. A mí, que voy solo, me puede pasar con los ojos cerrados.
Lo que estoy haciendo
Estoy repasándolo. Revisando el código a fondo, y no solo lo que hay hoy: también todo el historial, que es la parte que la gente olvida. En un repositorio queda registrado cada cambio desde el primer día, así que una contraseña que escribiste en marzo y borraste en abril sigue ahí dentro, guardada en el registro, aunque ya no aparezca en el archivo. Borrarla del presente no la borra del pasado.
Así que el plan es: repasar, cambiar por si acaso todas las claves que puedan estar comprometidas, y solo entonces abrirlo. Con calma y haciéndolo bien, que para eso no hay prisa.
Si sale bien, lo anunciaré aquí. Y si alguien que sepa de esto quiere echarme una mano cuando llegue el momento —o incluso antes, revisando lo que se ve desde fuera—, será más que bienvenido. Esto es una herramienta para la ciudad; cuanta más gente la mire por dentro, mejor funcionará.
Mientras tanto, si detectáis algo raro en los datos del portal, escribidme. Cada aviso de estos vale su peso en oro.
Todos los datos de este artículo están medidos directamente sobre la base de datos de producción el 17 de septiembre de 2026.