Intelligence de modernisation COBOL

Nous construisons la carte de votre code avant de toucher une seule ligne.

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.

La modernisation échoue à la compréhension, pas à la traduction

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.

Comment CodeGraph fonctionne

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.

L'interface CodeGraph exécutant son pipeline d'analyse en direct sur le programme WIRETXN, avec la latence par étape affichée dans la console : scan, parse, build graph, impact closure, recover facts, et plan and audit.
Le pipeline live : scan, parse, build graph, impact closure, recover facts, et plan and audit, chaque étape avec sa latence réellement mesurée.

Le graphe de connaissances typé

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.

Quatre analyses déterministes

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.

1. Fermeture d'impact avec provenance

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.

2. Rappel naïf versus graphe

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.

3. Séquençage d'extraction

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.

4. Accessibilité du code mort et porte de complétude

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é.

La fermeture du virement TRN-LIMIT, traitée de bout en bout

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.

Neuf faits, et six qu'un seul fichier ne peut pas voir

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.

Le panneau d'impact TRN-LIMIT : récupération par graphe 9/9 versus naïf d'un seul fichier 3/9, avec les faits F1 à F3 marqués dans le fichier et F4 à F9 marqués cachés et critiques ou élevés, chacun portant sa provenance file:line.
Récupération par graphe 9/9 versus naïf d'un seul fichier 3/9. Les trois faits visibles sont dans le fichier ; les six qui décident du type sont cachés d'une vue d'un seul fichier, chacun avec une provenance file:line.

Le temps fort : passez à une fenêtre d'un seul fichier et voyez six faits disparaître

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 de contexte naïf d'un seul fichier : une bannière rouge explique que seulement 3 of 9 faits vivent à l'intérieur de WIRETXN.cbl, et les faits F4 à F9 sont grisés, y compris le type COMP-3, l'overlay REDEFINES, l'indicateur de contrôle, et le prédécesseur JCL 02:00.
La vue naïve d'un seul fichier : six faits s'estompent et une bannière rouge énonce la défaillance de production qui en résulte. Revenez en arrière et 9/9 revient avec les justificatifs.

Un ordre d'extraction sûr, classé par rayon d'impact

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.

La table de séquence d'extraction classant 14 programs par couplage, pièges COMP-3, criticité JCL et score de risque, avec AUDITLOG en premier à risque 0 et le programme-dieu ACCTMGR en dernier à risque 15, à côté d'une vue de diff héritage-vers-modernisé.
L'ordre strangler-fig : AUDITLOG en premier à risque 0, ACCTMGR en dernier à risque 15, avec la raison de chaque rang montrée dans les colonnes couplage, pièges et JCL.

Une porte de complétude qui signale ce qu'elle ne peut pas résoudre

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.

L'onglet audit montrant 97.1% des références résolues et 1 signalée pour examen, avec le CALL dynamique WS-PROGNAME de DISPATCH signalé comme marqué pour examen, non écarté silencieusement, et une liste de code mort nommant AUDITLOG LEGACY-FORMAT et WIRETXN OLD-LIMIT-CHECK.
97.1% résolu, 1 signalée. Le CALL dynamique non résolvable est marqué pour examen, pas écarté, et la liste du code mort est rapportée à côté.

Un artefact d'audit exportable

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 Rapport de topologie et de complétude du code imprimable montrant 47 nœuds, 70 arêtes, 97.1% des références résolues, les faits de dépendance TRN-LIMIT F1 à F9 avec visibilité d'un seul fichier et provenance, et la séquence d'extraction strangler-fig.
Le Rapport de topologie et de complétude du code exportable : résumé des nœuds et arêtes, les neuf faits de dépendance avec provenance, et la séquence d'extraction classée, positionné comme un inventaire d'actifs TIC DORA.

Une fenêtre de contexte d'un seul fichier versus le graphe

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

Ce que cette démonstration ne fait pas

  • ✓ Elle ne traduit pas le COBOL en Java. CodeGraph est la couche de compréhension, la carte. La traduction est un cas d'usage en aval qu'elle ne réalise délibérément pas.
  • ✓ Elle n'utilise pas de connecteurs live. Le graphe est en mémoire plus SQLite, les entrées DB2, JCL et d'ordonnanceur sont des fixtures fichiers, et la vue naïve d'un seul fichier est une fenêtre de contexte simulée. Neo4j ou Memgraph est le chemin de production nommé, non livré ici.
  • ✓ Elle ne présente pas la banque, ses programmes, ni aucun chiffre comme le code d'un vrai client. Le patrimoine est synthétique et rédigé pour cette démonstration. Il n'y a pas d'étude de cas et pas de résultat de déploiement.
  • ✓ Elle ne revendique pas une couverture complète du dialecte IBM Enterprise COBOL. Le parseur couvre un sous-ensemble synthétique réaliste, pas chaque dialecte, ALTER, ou OCCURS DEPENDING ON, et il ne prétend pas battre le parseur d'un quelconque éditeur.
  • ✓ Elle ne présente pas 9/9, 3/9, ou 97.1% comme des garanties en monde ouvert. Ce sont des mesures sur la fixture de virement synthétique livrée, dont le jeu de vérité terrain est connu par construction.
  • ✓ Elle n'emporte pas de clients, d'études de cas, de témoignages, ni de chiffres de ROI. Aucun n'existe encore. C'est une démonstration qui prouve le mécanisme.

Questions que les acheteurs posent réellement

Est-ce un traducteur COBOL vers Java ?

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.

Une fenêtre de contexte plus grande ou un meilleur modèle ne résoudra-t-il pas simplement cela ?

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.

Comment prouvez-vous à un auditeur que vous avez trouvé chaque dépendance ?

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.

Que se passe-t-il avec une dépendance que vous ne pouvez pas résoudre, comme un CALL dynamique ?

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.

Est-ce que cela se connecte à notre mainframe, DB2, ou ordonnanceur z/OS ?

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.

En quoi cela diffère-t-il d'IBM watsonx Code Assistant ou de la chaîne d'outils d'un grand SI ?

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.

Est-ce un produit live ou une démonstration ?

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.

Recherche technique

La recherche derrière cette démonstration — l'architecture, la conception de la vérification, et le plan d'entreprise.

Vous planifiez une modernisation mainframe ?

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.

Évaluation de topologie

  • ✓ Cartographier jusqu'où un changement peut atteindre à travers les copybooks, DB2 et JCL
  • ✓ Résoudre la fermeture transitive avec une provenance file:line
  • ✓ Scorer le rappel de récupération des dépendances par rapport à un jeu de vérité terrain
  • ✓ Produire la preuve de complétude dont vos auditeurs ont besoin

Construire la carte

  • ✓ Un graphe de connaissances typé sur votre vrai patrimoine
  • ✓ Une porte de complétude qui signale ce qu'elle ne peut pas résoudre
  • ✓ Un ordre d'extraction strangler-fig classé et défendable
  • ✓ Un rapport DORA d'actifs TIC et de contrôle des changements SOC-2 exportable
Réseaux sociaux

Également publié sur