Inteligencia de modernización COBOL
La mayoría de los proyectos de modernización fracasan porque las herramientas leen el código como texto, no como topología. CodeGraph analiza su patrimonio de mainframe en un grafo de conocimiento tipado y resuelve el cierre transitivo completo de dependencias de un cambio, a través de copybooks, REDEFINES, COMP-3, DB2 y JCL, con procedencia archivo:línea para cada arista y una prueba de cuánto pudo resolver. El mapa es el producto. La traducción es un caso de uso posterior.
9/9 vs 3/9
Dependencias recuperadas: grafo vs ventana de un solo archivo
En el fixture TRN-LIMIT, frente a un conjunto de verdad de referencia conocido
97.1%
Referencias resueltas (33 de 34), 1 marcada para revisión
Puerta de completitud determinista, el mismo resultado en cada ejecución
47 / 70
Nodos y aristas a través de 7 tipos de nodo
El fixture bancario sintético publicado
Esta es una demo ejecutable. El patrimonio es sintético y creado para la demo, el grafo está en memoria más SQLite, y las vistas de DB2, JCL y de un solo archivo ingenuo son fixtures de archivo y simulaciones, no conectores en vivo.
El modo de fallo es la ceguera contextual, y un modelo más grande no la elimina.
Entre el 70 y el 80 % de los proyectos de modernización de mainframe no cumplen sus objetivos (meta-análisis del sector, 2025). No porque la traducción sea incorrecta, sino porque las herramientas tratan el código como texto en lugar de topología. Un traductor genérico lee el único archivo que puede ver. El hecho que realmente importa es invisible en una ventana de contexto de un solo archivo.
Lo que está en juego no es académico. Unas 220 mil millones de líneas de COBOL siguen en producción, que transportan alrededor del 95 % de las transacciones de cajeros automáticos, el 43 % de los sistemas bancarios y 3 billones de dólares de actividad al día (Reuters, 2017), frente a una deuda técnica acumulada estimada de 1,52 billones de dólares en EE. UU. (CISQ, 2022). Este es el núcleo de la pila bancaria y de seguros, y es exactamente el código que nadie quiere tocar a ciegas.
La parábola concreta es un programa de transferencias electrónicas que calcula sobre un campo llamado TRN-LIMIT. En el único archivo que un traductor puede ver, la aritmética parece trivial. Pero TRN-LIMIT es un decimal empaquetado COMP-3 definido a tres copybooks de distancia, su interpretación la elige un indicador establecido en un programa distinto, y ese indicador lo escribe un trabajo por lotes JCL a las 2 a. m. que se ejecuta antes del trabajo de transferencias. Con solo los hechos visibles, un modelo emite un long simple, el Java compila, pasa las pruebas unitarias y luego corrompe la base de datos en la primera transferencia electrónica en vivo. Ese fallo de integridad referencial aparece en UAT. El fallo fue ceguera contextual.
Esto no desaparece a medida que mejoran los modelos. Un patrimonio real tiene de 1 a 10 millones de líneas o más y no cabe en ninguna ventana de contexto, presente o futura. Lo difícil es recuperar exactamente el corte transitivo que toca un cambio y demostrar que lo encontró todo. Eso es un problema de topología, recuperación y evidencia, no un problema de calidad de razonamiento. Los agentes aconsejan, el código decide.
Analice el patrimonio en un grafo tipado y luego ejecute análisis deterministas. Ningún LLM se sienta en el camino crítico.
El pipeline recorre el patrimonio fixture, luego el parse (COBOL, copybooks, JCL, DB2 DDL), luego construye un grafo de conocimiento tipado, luego el impacto por cierre transitivo más procedencia, luego los análisis deterministas, luego una auditoría y exportación de evidencia, luego el panel interactivo. Al cargar, la aplicación ejecuta esto en vivo sobre Server-Sent Events, de modo que cada etapa narra con su latencia real medida en una consola, los paneles se llenan de forma progresiva, y un riel persistente de etapas le permite abrir la traza de Entrada, Procesamiento y Salida de cualquier etapa. Un único control reproduce toda la ejecución.
Construido con networkx y mantenido en memoria más SQLite, el grafo tiene siete tipos de nodo (programa, copybook, variable, tabla, jcl, dataset y un marcador de posición no resuelto) y aristas tipadas como DEFINES, IMPORTS, REDEFINES, CONTROLS_TYPE_OF, WRITES_VAR, REFERENCES, CALLS, READS y WRITES, EXECUTES, USES_DATASET y PRECEDES. En el fixture publicado el grafo tiene 47 nodos y 70 aristas: 14 programas, 5 copybooks, 17 variables, 3 tablas DB2, 3 trabajos JCL, 4 datasets y 1 nodo no resuelto.
Estos son algoritmos de grafo simples, no llamadas a un modelo, de modo que el mismo fixture produce el mismo resultado en cada ejecución.
El corte de dependencia transitiva de un cambio, con cada arista llevando su origen archivo:línea, de modo que puede ver no solo qué se ve afectado sino dónde vive la evidencia.
El cierre del grafo puntuado contra el conjunto conocido de dependencias de verdad de referencia del fixture, frente a una ventana de un solo archivo simulada, que es lo que una herramienta basada en texto realmente alimenta a un modelo.
Una puntuación de acoplamiento y radio de explosión por programa (acoplamiento ponderado tres, trampas COMP-3 ponderadas dos, criticidad JCL ponderada dos, llamadas no resueltas ponderadas cinco) que establece un orden de migración strangler-fig seguro.
Cada PERFORM, CALL, COPY y referencia DB2 debe resolverse o marcarse como necesita revisión, nunca descartarse en silencio. Los párrafos inalcanzables se reportan como una ilustración, no se puntúan como una métrica principal.
Un interruptor hace tangible la diferencia. Active la vista de contexto de IA ingenua y el grafo se atenúa al único archivo fuente con unas pocas líneas de contexto. Seis de los nueve hechos de la transferencia electrónica desaparecen, un banner rojo enuncia la consecuencia, y al volver se restauran 9/9 con comprobantes. Ese interruptor es una ilustración de qué contexto debe suministrar la capa de recuperación, no la fuente de valor.
Cuando termina, Export JSON escribe un archivo migration-evidence.json, y Evidence report renderiza un Informe de topología y completitud de la base de código imprimible: el resumen de nodos y aristas, los cierres por módulo con procedencia archivo:línea, el resultado de recall y el método, la secuencia de extracción ordenada, la lista de código muerto y una marca de tiempo. Lo posicionamos como un inventario de activos TIC DORA y un comprobante de control de cambios SOC-2. Una capa opcional Pydantic-AI puede responder preguntas sobre el cierre, pero está desactivada por defecto y protegida por clave, y la demo determinista registra el resultado sin ninguna clave.
Un cambio en un campo, resuelto contra un conjunto de verdad de referencia conocido. Cada imagen debajo es una captura de pantalla de la aplicación en ejecución.
La vista predeterminada aterriza en el subsistema de transferencias electrónicas con TRN-LIMIT seleccionado. El panel de impacto muestra recuperación por grafo en 9/9 (100 %) frente a un contexto ingenuo de un solo archivo de 3/9 (33 %), puntuado contra el conjunto conocido de dependencias de verdad de referencia del fixture. Tres hechos son visibles en el único archivo: WIRETXN usa TRN-LIMIT en un COMPUTE (WIRETXN.cbl:33), el copybook CBACCT se importa por nombre (WIRETXN.cbl:13), y ocurre un UPDATE en la tabla DB2 ACCOUNTS (WIRETXN.cbl:37). Los seis que deciden la corrección no lo son: TRN-LIMIT es un decimal empaquetado PIC S9(9)V99 COMP-3 que debe convertirse en un BigDecimal y no en un long (CBACCT.cpy:11), TRN-LIMIT-ALPHA lo REDEFINES como texto sobre los mismos seis bytes (CBACCT.cpy:12), LIMIT-TYPE-FLAG decide qué interpretación está activa (CBACCT.cpy:13), dos programas (LIMITSET y BATCHUPD) escriben ese indicador, y el trabajo JCL NIGHTLY a las 02:00 se ejecuta antes de WIREJOB para que el indicador esté establecido antes de que corra la transferencia.
Active la vista de contexto de IA ingenua y el grafo se atenúa a lo que vive dentro de WIRETXN.cbl. El tipo COMP-3, la superposición REDEFINES, el indicador de control, sus dos escritores entre módulos y el predecesor JCL de las 02:00 se atenúan en gris, y un banner rojo enuncia la consecuencia: con solo los tres hechos visibles, un modelo emite un TRN_LIMIT long simple y escribe bytes corruptos en ACCOUNTS.TRN_LIMIT, que es el fallo de UAT. Esta es exactamente la brecha de ceguera contextual que una herramienta de ventana de texto no puede cerrar estructuralmente, hecha visible en un clic.
La vista de extracción clasifica los 14 programas por una puntuación de acoplamiento y radio de explosión. AUDITLOG es la primera extracción segura en el puesto 1 con una puntuación de riesgo de 0 y acoplamiento cero. WIRETXN está en el puesto 11 (riesgo 4, una trampa COMP-3 más criticidad JCL). DISPATCH ocupa el puesto 12 (riesgo 5) por su CALL dinámico no resuelto, y el programa dios ACCTMGR se extrae al final en el puesto 14 (acoplamiento 5, riesgo 15). Ese es un orden strangler-fig que puede defender, menor riesgo primero, mayor acoplamiento al final.
La pestaña de auditoría reporta el 97.1% de referencias resueltas, que es 33 de 34, con exactamente una marcada para revisión y no descartada en silencio. Ese es el CALL dinámico WS-PROGNAME de DISPATCH, cuyo destino se calcula en tiempo de ejecución (DISPATCH.cbl:15) y por eso no puede resolverse estáticamente. La pestaña también lista código muerto por alcanzabilidad: el párrafo LEGACY-FORMAT de AUDITLOG y el párrafo OLD-LIMIT-CHECK de WIRETXN son inalcanzables. Negarse a fingir una resolución es el comportamiento honesto, y es el comportamiento que un regulador quiere ver.
Todo lo anterior se exporta a un Informe de topología y completitud de la base de código imprimible: el resumen de 47 nodos y 70 aristas, la cobertura del 97.1%, los nueve hechos de dependencia TRN-LIMIT con su visibilidad de un solo archivo y procedencia archivo:línea, la secuencia de extracción ordenada y una marca de tiempo de generación. Como el patrimonio es sintético y creado, el conjunto verdadero de dependencias se conoce por construcción, que es lo que hace de la cifra de recall una medición etiquetada reproducible en lugar de una afirmación. Atribuimos 9/9, 3/9 y 97.1% a este fixture publicado, nunca como una garantía de mundo abierto sobre patrimonios COBOL arbitrarios.
El mismo interruptor contra el que compara la demo, lado a lado, en el fixture de transferencias electrónicas.
| Dimensión | Ventana de contexto de un solo archivo | Grafo de conocimiento CodeGraph |
|---|---|---|
| Dependencias TRN-LIMIT recuperadas | 3 de 9 | 9 de 9, contra un conjunto de verdad de referencia conocido |
| Tipo COMP-3 a través de copybooks | Invisible | Resuelto con procedencia archivo:línea |
| Superposición REDEFINES e indicador de control | Invisible | Resuelto, incluidos los escritores entre módulos |
| Arista de orden solo JCL (NIGHTLY antes de WIREJOB) | Invisible | Modelada como una arista PRECEDES |
| Prueba de completitud | Ninguna | 97.1% resuelto, lo no resuelto marcado para revisión |
| Orden seguro de extracción | Ninguna | Ordenado por acoplamiento y radio de explosión |
| Artefacto de auditoría | Ninguna | Informe de topología y completitud exportable |
No. CodeGraph es la capa de comprensión, no un traductor, y deliberadamente no pega COBOL y emite Java. Construye un grafo de dependencias tipado de su patrimonio y resuelve el corte transitivo exacto que toca un cambio, con procedencia archivo:línea y una prueba de completitud. La traducción es un caso de uso posterior, y toda herramienta de traducción sigue necesitando este mapa para saber qué toca realmente un cambio.
No, y ese es el punto duradero. Un patrimonio real tiene de 1 a 10 millones de líneas o más y no cabe en ninguna ventana de contexto, presente o futura. Lo difícil es recuperar el corte transitivo exacto y demostrar que lo encontró todo, lo cual es un problema de topología, recuperación y evidencia, no un problema de calidad de razonamiento. Un modelo perfecto aún no puede demostrar a un regulador qué dependencias se recuperaron, aún necesita un orden seguro de extracción, y aún debe un inventario de activos TIC.
La puerta de completitud exige que cada referencia PERFORM, CALL, COPY y DB2 se resuelva o se marque para revisión, nunca se descarte en silencio. En el fixture publicado eso es 33 de 34 referencias resueltas, que es una cobertura del 97.1%, con la única referencia irresoluble marcada. Puede exportar un Informe de topología y completitud de la base de código imprimible con el resumen de nodos y aristas, los cierres por módulo con procedencia archivo:línea, el resultado de recall y el método, la secuencia de extracción ordenada y la lista de código muerto, posicionado como un inventario de activos TIC DORA y un comprobante de control de cambios SOC-2.
Se marca para revisión, no se descarta en silencio, y ese comportamiento de honestidad es el punto. En el fixture la única referencia irresoluble es el CALL dinámico WS-PROGNAME de DISPATCH, cuyo destino se calcula en tiempo de ejecución (DISPATCH.cbl:15), así que no puede resolverse estáticamente. CodeGraph la registra como necesita revisión y sitúa a DISPATCH cerca del final del orden seguro de extracción exactamente por esa razón.
No en esta demo. El grafo está en memoria más SQLite, y las entradas de DB2, JCL y del programador son fixtures de archivo, mientras que la vista ingenua de un solo archivo es una ventana de contexto simulada. Un despliegue en producción nombraría una plataforma de grafos como Neo4j o Memgraph y leería su patrimonio real, pero nada aquí implica un pipeline z/OS en vivo. La demo prueba el mecanismo sobre un patrimonio sintético, no un despliegue.
No reivindicamos superar el analizador de IBM ni el de un integrador de sistemas, y el analizador de la demo cubre un subconjunto sintético realista de COBOL, no todos los dialectos, ALTER u OCCURS DEPENDING ON. La distinción es el entregable: un grafo de conocimiento consciente del repositorio más una prueba de completitud y un orden seguro de extracción, en lugar de una traducción por archivo. Es la capa de comprensión que cualquier esfuerzo de traducción necesita primero, y es la capa que un modelo base mejor no elimina.
Es una demo ejecutable que prueba el mecanismo, no un pipeline desplegado. El patrimonio bancario es sintético y creado para esta demo, de modo que el conjunto verdadero de dependencias se conoce por construcción, que es lo que hace de la métrica de recall una medición etiquetada reproducible en lugar de una afirmación. El parse, el grafo y los cuatro análisis son Python plano determinista (FastAPI más networkx, UI de Cytoscape.js) que se ejecutan sin clave de API y sin base de datos. Existe una capa LLM opcional para preguntas y respuestas pero está desactivada por defecto, y el valor no depende de ella.
La investigación detrás de esta demo — la arquitectura, el diseño de verificación y el plano empresarial.
Solución completa
Explore la solución Modernización de COBOL heredado →La capa de comprensión es la parte difícil. Construimos el mapa primero.
Si su equipo está sopesando cómo modernizar un patrimonio COBOL sin una sorpresa en UAT por una dependencia que nadie pudo ver, nos gustaría de verdad oír cómo lo están pensando. El problema es de toda la industria y las respuestas también lo serán.