Intelligence de modernisation COBOL
La plupart des projets de modernisation échouent parce que les outils lisent le code comme du texte, pas comme une topologie. CodeGraph parse votre patrimoine mainframe en un graphe de connaissances typé et résout la fermeture transitive complète des dépendances d'un changement, à travers les copybooks, REDEFINES, COMP-3, DB2 et JCL, avec une provenance file:line pour chaque arête et une preuve de ce qu'il a pu résoudre. La carte est le produit. La traduction est un cas d'usage en aval.
9/9 vs 3/9
Dépendances récupérées : graphe vs fenêtre d'un seul fichier
Sur la fixture TRN-LIMIT, par rapport à un jeu de vérité terrain connu
97.1%
Références résolues (33 of 34), 1 signalée pour examen
Porte de complétude déterministe, même résultat à chaque exécution
47 / 70
Nœuds et arêtes sur 7 types de nœuds
La fixture bancaire synthétique livrée
Ceci est une démonstration exécutable. Le patrimoine est synthétique et rédigé pour la démonstration, le graphe est en mémoire plus SQLite, et les vues DB2, JCL et naïves d'un seul fichier sont des fixtures fichiers et des simulations, pas des connecteurs live.
Le mode de défaillance est la cécité contextuelle, et un modèle plus grand ne la supprime pas.
70 to 80% des projets de modernisation mainframe n'atteignent pas leurs objectifs (méta-analyse sectorielle, 2025). Non pas parce que la traduction est fausse, mais parce que les outils traitent le code comme du texte plutôt que comme une topologie. Un traducteur générique lit le seul fichier qu'il peut voir. Le fait qui compte vraiment est invisible dans une fenêtre de contexte d'un seul fichier.
Les enjeux ne sont pas académiques. Environ 220 milliards de lignes de COBOL tournent encore en production, portant environ 95% des transactions ATM, 43% des systèmes bancaires, et 3 trillion dollars d'activité par jour (Reuters, 2017), face à une dette technique américaine accumulée estimée à 1.52 trillion dollars (CISQ, 2022). C'est le cœur de la pile bancaire et d'assurance, et c'est exactement le code que personne ne veut toucher à l'aveugle.
La parabole concrète est un programme de virement qui calcule sur un champ appelé TRN-LIMIT. Dans le seul fichier qu'un traducteur peut voir, l'arithmétique a l'air triviale. Mais TRN-LIMIT est un décimal packé COMP-3 défini trois copybooks plus loin, son interprétation est choisie par un indicateur positionné dans un autre programme, et cet indicateur est écrit par un job batch JCL de 2 h du matin qui s'exécute avant le job de virement. Avec seulement les faits visibles, un modèle émet un simple long, le Java compile, passe les tests unitaires, puis corrompt la base de données au premier virement live. Cette défaillance d'intégrité référentielle apparaît en UAT. L'échec était la cécité contextuelle.
Cela ne disparaît pas à mesure que les modèles s'améliorent. Un vrai patrimoine fait 1 to 10 million de lignes ou plus et ne tient dans aucune fenêtre de contexte, présente ou future. Le plus dur est de récupérer la tranche transitive exacte qu'un changement touche et de prouver que vous l'avez trouvée entièrement. C'est un problème de topologie, de récupération et de preuves, pas un problème de qualité de raisonnement. Les agents conseillent, le code décide.
Parser le patrimoine en un graphe typé, puis exécuter des analyses déterministes. Aucun LLM ne se trouve sur le chemin critique.
Le pipeline exécute le patrimoine fixture, puis le parse (COBOL, copybooks, JCL, DB2 DDL), puis construit un graphe de connaissances typé, puis l'impact par fermeture transitive plus la provenance, puis les analyses déterministes, puis un audit et l'export de preuves, puis le tableau de bord interactif. Au chargement, l'application exécute cela en direct via Server-Sent Events, de sorte que chaque étape raconte sa latence réellement mesurée dans une console, les panneaux se remplissent progressivement, et un rail d'étapes persistant permet d'ouvrir la trace Input, Processing et Output de n'importe quelle étape. Un seul contrôle rejoue toute l'exécution.
Construit avec networkx et conservé en mémoire plus SQLite, le graphe a sept types de nœuds (program, copybook, variable, table, jcl, dataset, et un placeholder non résolu) et des arêtes typées telles que DEFINES, IMPORTS, REDEFINES, CONTROLS_TYPE_OF, WRITES_VAR, REFERENCES, CALLS, READS et WRITES, EXECUTES, USES_DATASET et PRECEDES. Sur la fixture livrée, le graphe a 47 nœuds et 70 arêtes : 14 programs, 5 copybooks, 17 variables, 3 tables DB2, 3 jobs JCL, 4 datasets, et 1 nœud non résolu.
Ce sont de simples algorithmes de graphe, pas des appels de modèle, donc la même fixture produit le même résultat à chaque exécution.
La tranche de dépendances transitives d'un changement, chaque arête portant sa source file:line, pour voir non seulement ce qui est affecté mais où vit la preuve.
La fermeture du graphe scorée par rapport au jeu de dépendances de vérité terrain connu de la fixture, versus une fenêtre simulée d'un seul fichier, ce qu'un outil textuel nourrit réellement à un modèle.
Un score de couplage et de rayon d'impact par programme (couplage pondéré trois, pièges COMP-3 pondérés deux, criticité JCL pondérée deux, appels non résolus pondérés cinq) qui classe un ordre de migration strangler-fig sûr.
Chaque PERFORM, CALL, COPY et référence DB2 doit se résoudre ou être signalé comme needs review, jamais écarté silencieusement. Les paragraphes inatteignables sont rapportés à titre d'illustration, pas scorés comme métrique phare.
Un seul interrupteur rend la différence tangible. Cochez la vue de contexte IA naïve et le graphe s'estompe jusqu'au seul fichier source avec quelques lignes de contexte. Six des neuf faits du virement disparaissent, une bannière rouge énonce la conséquence, et le retour restaure 9/9 avec les justificatifs. Cet interrupteur illustre le contexte que la couche de récupération doit fournir, ce n'est pas la source de valeur.
Lorsque vous avez terminé, Export JSON écrit un fichier migration-evidence.json, et Evidence report rend un Rapport de topologie et de complétude du code imprimable : le résumé des nœuds et arêtes, les fermetures par module avec provenance file:line, le résultat de rappel et la méthode, la séquence d'extraction classée, la liste du code mort, et un horodatage. Nous le positionnons comme un inventaire d'actifs TIC DORA et un reçu de contrôle des changements SOC-2. Une couche Pydantic-AI optionnelle peut répondre à des questions sur la fermeture, mais elle est désactivée par défaut et protégée par clé, et la démonstration déterministe enregistre le résultat sans aucune clé.
Un changement sur un champ, résolu par rapport à un jeu de vérité terrain connu. Chaque image ci-dessous est une capture d'écran de l'application en cours d'exécution.
La vue par défaut s'ouvre sur le sous-système de virement avec TRN-LIMIT sélectionné. Le panneau d'impact montre une récupération par graphe à 9/9 (100%) contre un contexte naïf d'un seul fichier de 3/9 (33%), scorée par rapport au jeu de dépendances de vérité terrain connu de la fixture. Trois faits sont visibles dans le seul fichier : WIRETXN utilise TRN-LIMIT dans un COMPUTE (WIRETXN.cbl:33), le copybook CBACCT est importé par nom (WIRETXN.cbl:13), et un UPDATE sur la table DB2 ACCOUNTS se produit (WIRETXN.cbl:37). Les six qui décident de la correction ne le sont pas : TRN-LIMIT est un décimal packé PIC S9(9)V99 COMP-3 qui doit devenir un BigDecimal et non un long (CBACCT.cpy:11), TRN-LIMIT-ALPHA le REDEFINES comme texte sur les mêmes six octets (CBACCT.cpy:12), LIMIT-TYPE-FLAG décide quelle interprétation est active (CBACCT.cpy:13), deux programmes (LIMITSET et BATCHUPD) écrivent cet indicateur, et le job JCL NIGHTLY à 02:00 s'exécute avant WIREJOB pour que l'indicateur soit positionné avant l'exécution du virement.
Cochez la vue de contexte IA naïve et le graphe s'estompe jusqu'à ce qui vit à l'intérieur de WIRETXN.cbl. Le type COMP-3, l'overlay REDEFINES, l'indicateur de contrôle, ses deux writers inter-modules, et le prédécesseur JCL 02:00 s'estompent tous en gris, et une bannière rouge énonce la conséquence : avec seulement les trois faits visibles, un modèle émet un simple long TRN_LIMIT et écrit des octets corrompus dans ACCOUNTS.TRN_LIMIT, ce qui est l'échec UAT. C'est exactement l'écart de cécité contextuelle qu'un outil à fenêtre de texte ne peut structurellement pas fermer, rendu visible en un clic.
La vue d'extraction classe les 14 programs par un score de couplage et de rayon d'impact. AUDITLOG est la première extraction sûre au rang 1 avec un score de risque de 0 et un couplage zéro. WIRETXN se situe au rang 11 (risque 4, un piège COMP-3 plus la criticité JCL). DISPATCH se classe 12 (risque 5) pour son CALL dynamique non résolu, et le programme-dieu ACCTMGR s'extrait en dernier au rang 14 (couplage 5, risque 15). C'est un ordre strangler-fig que vous pouvez défendre, risque le plus bas d'abord, couplage le plus élevé en dernier.
L'onglet audit rapporte 97.1% des références résolues, soit 33 of 34, avec exactement une signalée pour examen et non écartée silencieusement. Celle-là est le CALL dynamique WS-PROGNAME de DISPATCH, dont la cible est calculée à l'exécution (DISPATCH.cbl:15) et ne peut donc pas être résolue statiquement. L'onglet liste aussi le code mort par accessibilité : le paragraphe LEGACY-FORMAT d'AUDITLOG et le paragraphe OLD-LIMIT-CHECK de WIRETXN sont inatteignables. Refuser de feindre une résolution est le comportement honnête, et c'est le comportement qu'un régulateur veut voir.
Tout ce qui précède s'exporte vers un Rapport de topologie et de complétude du code imprimable : le résumé 47 nœuds, 70 arêtes, la couverture 97.1%, les neuf faits de dépendance TRN-LIMIT avec leur visibilité d'un seul fichier et leur provenance file:line, la séquence d'extraction classée, et un horodatage de génération. Parce que le patrimoine est synthétique et rédigé, le vrai jeu de dépendances est connu par construction, ce qui fait du chiffre de rappel une mesure étiquetée reproductible plutôt qu'une revendication. Nous attribuons 9/9, 3/9 et 97.1% à cette fixture livrée, jamais comme une garantie en monde ouvert sur des patrimoines COBOL arbitraires.
Le même interrupteur que la démonstration compare, côte à côte, sur la fixture de virement.
| Dimension | Fenêtre de contexte d'un seul fichier | Graphe de connaissances CodeGraph |
|---|---|---|
| Dépendances TRN-LIMIT récupérées | 3 of 9 | 9 of 9, par rapport à un jeu de vérité terrain connu |
| Type COMP-3 à travers les copybooks | Invisible | Résolu avec provenance file:line |
| Overlay REDEFINES et indicateur de contrôle | Invisible | Résolu, y compris les writers inter-modules |
| Arête d'ordonnancement uniquement JCL (NIGHTLY avant WIREJOB) | Invisible | Modélisé comme une arête PRECEDES |
| Preuve de complétude | Aucune | 97.1% résolu, non résolu signalé pour examen |
| Ordre d'extraction sûr | Aucune | Classé par couplage et rayon d'impact |
| Artefact d'audit | Aucune | Rapport de topologie et de complétude exportable |
Non. CodeGraph est la couche de compréhension, pas un traducteur, et il ne colle délibérément pas du COBOL pour émettre du Java. Il construit un graphe de dépendances typé de votre patrimoine et résout la tranche transitive exacte qu'un changement touche, avec une provenance file:line et une preuve de complétude. La traduction est un cas d'usage en aval, et chaque outil de traduction a encore besoin de cette carte pour savoir ce qu'un changement touche réellement.
Non, et c'est le point durable. Un vrai patrimoine fait 1 to 10 million de lignes ou plus et ne tient dans aucune fenêtre de contexte, présente ou future. Le plus dur est de récupérer la tranche transitive exacte et de prouver que vous l'avez trouvée entièrement, ce qui est un problème de topologie, de récupération et de preuves, pas un problème de qualité de raisonnement. Un modèle parfait ne peut toujours pas prouver à un régulateur quelles dépendances ont été récupérées, a toujours besoin d'un ordre d'extraction sûr, et doit toujours un inventaire d'actifs TIC.
La porte de complétude exige que chaque PERFORM, CALL, COPY et référence DB2 se résolve ou soit signalée pour examen, jamais écartée silencieusement. Sur la fixture livrée, cela fait 33 of 34 références résolues, soit 97.1% de couverture, avec la seule référence non résolvable signalée. Vous pouvez exporter un Rapport de topologie et de complétude du code imprimable avec le résumé des nœuds et arêtes, les fermetures par module avec provenance file:line, le résultat de rappel et la méthode, la séquence d'extraction classée, et la liste du code mort, positionné comme un inventaire d'actifs TIC DORA et un reçu de contrôle des changements SOC-2.
Elle est signalée pour examen, pas écartée silencieusement, et ce comportement d'honnêteté est le point. Sur la fixture, la seule référence non résolvable est le CALL dynamique WS-PROGNAME de DISPATCH, dont la cible est calculée à l'exécution (DISPATCH.cbl:15), donc elle ne peut pas être résolue statiquement. CodeGraph l'enregistre comme needs review et classe DISPATCH près de la fin de l'ordre d'extraction sûr pour exactement cette raison.
Pas dans cette démonstration. Le graphe est en mémoire plus SQLite, et les entrées DB2, JCL et d'ordonnanceur sont des fixtures fichiers, tandis que la vue naïve d'un seul fichier est une fenêtre de contexte simulée. Un déploiement en production nommerait une plateforme de graphe telle que Neo4j ou Memgraph et lirait votre vrai patrimoine, mais rien ici n'implique un pipeline z/OS live. La démonstration prouve le mécanisme sur un patrimoine synthétique, pas un déploiement.
Nous ne prétendons pas battre le parseur d'IBM ou d'un intégrateur de systèmes, et le parseur de la démonstration couvre un sous-ensemble synthétique réaliste de COBOL, pas chaque dialecte, ALTER, ou OCCURS DEPENDING ON. La distinction est le livrable : un graphe de connaissances conscient du dépôt plus une preuve de complétude et un ordre d'extraction sûr, plutôt qu'une traduction fichier par fichier. C'est la couche de compréhension dont tout effort de traduction a d'abord besoin, et c'est la couche qu'un meilleur modèle de base ne supprime pas.
C'est une démonstration exécutable qui prouve le mécanisme, pas un pipeline déployé. Le patrimoine bancaire est synthétique et rédigé pour cette démonstration, donc le vrai jeu de dépendances est connu par construction, ce qui fait de la métrique de rappel une mesure étiquetée reproductible plutôt qu'une revendication. Le parse, le graphe et les quatre analyses sont du Python déterministe simple (FastAPI plus networkx, UI Cytoscape.js) qui s'exécutent sans clé API et sans base de données. Une couche LLM optionnelle pour les questions-réponses existe mais est désactivée par défaut, et la valeur n'en dépend pas.
La recherche derrière cette démonstration — l'architecture, la conception de la vérification, et le plan d'entreprise.
Solution complète
Explorer la solution Legacy COBOL Modernization →La couche de compréhension est la partie difficile. Nous construisons d'abord la carte.
Si votre équipe pèse comment moderniser un patrimoine COBOL sans surprise UAT due à une dépendance que personne n'a pu voir, nous aimerions sincèrement entendre comment vous y réfléchissez. Le problème est à l'échelle de l'industrie et les réponses le seront aussi.