Watson: Pipeline de Ingesta, Catalogación y Protección de Evidencia
El Rol de Watson en la Investigación Judicial
En una causa penal compleja con múltiples ramificaciones, la evidencia suele presentarse de manera desordenada, fragmentaria y distribuida en cientos de correos electrónicos, cédulas digitales, actas escaneadas y resoluciones judiciales en formato PDF. Watson es el componente de ingeniería de datos e infraestructura responsable de recibir, verificar, limpiar, estructurar y proteger todo el corpus probatorio antes de que sea sometido a análisis.
Su principio fundamental es la neutralidad y la preservación forense: convertir material administrativo disperso en un repositorio documental estandarizado, versionado bajo Git, con metadatos explícitos y libre de datos personales sensibles que impidan su divulgación pública.
Descarga, Registro y Clasificación de Mails Oficiales
Las comunicaciones oficiales con el Ministerio Público Fiscal, el Ministerio de Salud y los efectores médicos se gestionan a través de herramientas automatizadas que garantizan la integridad de la cadena de custodia:
- Descarga y trazabilidad (
descargar_mails.py): Conexión automatizada a Gmail mediante reglas declaradas enfuentes/emails/reglas.yaml. Los mensajes y sus archivos adjuntos se persisten en una base SQLite (emails.db) con registros unívocos (asunto, identificador de hilo, remitente, fecha y hash MD5 de cada adjunto). - Identificador de origen (
.eNNNN): Cada correo y cada archivo adjunto descargado lleva incorporado el número de mensaje en su nombre de archivo (por ejemplo,notificacion.e0458.pdf). Este sufijo se preserva de manera inmutable en cualquier renombrado o conversión posterior, permitiendo rastrear el mail original exacto que introdujo cada documento al expediente. - Clasificación y ruteo asistido (
procesar_mails.py): El sistema analiza los remitentes y el contenido de los hilos para sugerir el destino exacto dentro de la estructura de causas (por ejemplo, carpetascausas/mpf*ocausas/den*para correos de@fiscalias.gob.ar, oblog/para otros remitentes), requiriendo validación expresa del investigador antes de mover cualquier pieza.
Conversión a Markdown y Generación de Metadatos (Frontmatter)
Para que los modelos de lenguaje (LLMs) y los índices de búsqueda puedan procesar expedientes judiciales de cientos de fojas sin saturar ventanas de contexto ni malgastar tokens, Watson normaliza los documentos:
- Extracción limpia de texto: Se extrae el texto vectorial de los PDFs judiciales mediante librerías especializadas, depurando cabeceras repetitivas, firmas redundantes y artefactos de maquetación propios de los sistemas de expedientes.
- Frontmatter YAML estandarizado: Cada archivo
.mdresultante incorpora un bloque de metadatos estructurado al inicio del documento:
---
fecha: "2021-02-05"
expediente: "MPF00546803"
origen_email: "fuentes/emails/fiscalias.gob.ar/decreto_archivo.e0458.eml"
original_filename: "resolucion_archivo_firmada.pdf"
---
Este encabezado permite filtrar inmediatamente por fecha cierta, legajo judicial y fuente de procedencia sin necesidad de interpretar el cuerpo del documento.
Detección de Duplicados y Control de Repetidos
Los expedientes judiciales acumulan decenas de copias de los mismos documentos (resoluciones reenviadas en múltiples traslados o copias de cédulas anexadas a distintos legajos). Watson integra scripts de desduplicación (
repetidos.py, detectar_duplicados.py y copias_similares.py):- Duplicados binarios: Comparación de huellas criptográficas MD5 para detectar adjuntos idénticos y evitar duplicar el almacenamiento.
- Duplicados textuales y cuasi-copias: Detección de documentos con textos idénticos o variaciones mínimas de plantilla, unificando referencias y evitando el reprocesamiento innecesario por parte de la IA.
Anonimización y "Redacted" de Datos Personales
La publicación de un caso judicial en plataformas públicas como GitHub exige proteger estrictamente la privacidad de personas particulares, familiares, testigos y denunciantes, sin alterar la fuerza probatoria de los documentos oficiales:
- Diccionario central de anonimización (
anonimizar.yaml): Define las entidades y personas a resguardar con sus respectivos patrones de reemplazo (DNI, nombres de particulares, teléfonos, domicilios y correos personales), especificando también qué datos institucionales deben conservarse (fiscales, secretarios, médicos imputados, funcionarios públicos). - Sustitución en Markdown (
anonimizar.py): Reemplazo sistemático por etiquetas estandarizadas (ej.<dni01>,<telefono01>), auditando mediante expresiones regulares la presencia residual de correos o números no registrados en el diccionario. - Anonimización vectorial en PDFs (
redactar_pdf.py): Para los archivos PDF originales, Watson cuenta con un motor basado enpikepdfque interviene directamente los streams de texto vectorial del PDF. Reemplaza los datos sensibles por etiquetas preservando la misma cantidad de caracteres, los anchos exactos de glifo y la tipografía original, logrando una versión tachada auténtica que no altera la maquetación del expediente judicial.
Control de Publicación y Hook Pre-commit en Git
Para asegurar que ningún dato sensible pueda ser publicado accidentalmente en un repositorio público, Watson implementa un control automatizado en el ciclo de vida de Git a través de
publicables.py:- Gestión de
.gitignorepor causa: El sistema audita cada original (PDF, imagen o audio) y solo permite que sea visible para Git si cuenta con su correspondiente transcripción.mdlimpia y si el índice textual confirma que no contiene ningún dato personal sin cubrir. - Hook de pre-commit forzoso: Mediante
publicables.py --hook, se instala en cada repositorio un script.git/hooks/pre-commit. Antes de confirmar cualquier commit, el hook analiza los archivos en preparación (--staged):
# Verificación ejecutada por el hook pre-commit:
python3 /ruta/a/watson/scripts/publicables.py causa --staged
Si el hook detecta en el área de preparación un archivo con DNI, número de teléfono, correo personal o alguna cadena definida en
anonimizar.yaml, el commit se rechaza de inmediato con código de salida 1, haciendo técnicamente imposible subir datos sensibles al repositorio.