Skip to content
PYD ENTERPRISES

Flagship research · free to cite

The legacy anti-patterns catalog.

An architectural dictionary of the constructs that break modernization programs: what each one does at runtime, how a deterministic engine detects it, and the modern pattern it maps to. 25 patterns at launch, 10 added monthly.

PATTERN SCAN · LOANSYScomplete
  • ALTERCriticalLNACCR02.cbl:412→ state machine
  • PERFORM THRUHighLNFEES01.cbl:88-140→ single-entry function
  • REDEFINESCriticalLNREC.cpy:14-31→ discriminated union
  • COMMAREA stateCriticalLNINQ01.cbl:57→ stateless REST + token
  • COND=(4,LT)HighLNDLY01.jcl:22→ explicit step DAG
patterns at launch
25
patterns at launch
legacy families covered
12
legacy families covered
rated Critical for cutover risk
7
rated Critical for cutover risk
new entries every month
10
new entries every month

Search the catalog

Find the construct. See where it lands.

Filter by legacy family or cutover risk. Each entry has before and after code, the detection method and a generated spec fragment.

25 of 25 entries include an OpenAPI, DMN or JSON Schema fragment.

25 of 25 patterns

Legacy to modern mapping

Every anti-pattern has a target shape.

The catalog at a glance: the legacy construct on top, the modern pattern your engineers build against underneath.

COBOL

ALTER statement

Explicit state machine

COBOL

GO TO DEPENDING ON

Dispatch table with explicit default

COBOL

PERFORM THRU fall-through

Single-entry function with guard clauses

COBOL

REDEFINES memory overlay

Discriminated union (oneOf with a tag)

COBOL

OCCURS DEPENDING ON

Bounded array (child collection)

COBOL

COMP-3 packed decimal arithmetic

BigDecimal with explicit scale and rounding mode

COBOL

88-level condition names

Enum with category predicates

COBOL

Copybook sprawl

Versioned canonical schema

CICS

CICS pseudo-conversational state

Stateless REST resource with explicit versioning

JCL

JCL condition code chains

Explicit step DAG with run conditions

Data stores

VSAM alternate index coupling

Relational table with secondary index and explicit queries

Data stores

IMS hierarchical navigation

Relational aggregate with foreign keys

Java EE

EJB 2.x entity beans

JPA entity, repository and transactional service

Java EE

EJB home and remote interfaces

Coarse-grained REST contract with DTOs

Java EE

Struts god Action

Thin controller per command, domain service underneath

Spring

Spring XML and AOP hidden logic

Explicit composition with declared cross-cutting concerns

SOAP

SOAP and WSDL schema coupling

OpenAPI 3.1 with JSON Schema 2020-12 and problem details

VB6

VB6 On Error Resume Next

Explicit exceptions and result types

VB6

VB6 global module state

Explicit request context and injected services

.NET

WebForms ViewState and code-behind logic

SPA front end over a stateless API that rereads authoritative data

.NET

WCF DataContract versioning

Versioned OpenAPI 3.1 schemas with discriminated oneOf

PL/SQL

PL/SQL row-by-row cursor

Set-based query plus explicit rule table

PL/SQL

PL/SQL trigger side effects

Explicit domain operation with events via an outbox

T-SQL

T-SQL dynamic SQL rules

Parameterised query with criteria as a reviewed decision table

4GL

Informix 4GL screen logic

Request schema plus server-side validation and correction rules

COBOL 8CICS 1JCL 1Data stores 2Java EE 3Spring 1SOAP 1VB6 2.NET 2PL/SQL 2T-SQL 14GL 1

Methodology

How each entry is detected.

The catalog is not a style guide. Each entry describes a detector the PYD ENTERPRISES engine runs over parsed code, and the evidence it produces. No entry depends on a language model reading the source: the optional model you host only names and describes findings that the deterministic passes already located.

Every executable path in a scanned system is accounted for: extracted as a rule, classified as plumbing, or flagged for review. The anti-patterns here are the most common reasons a path lands in that last bucket.

  1. 01

    Parse to a full AST, not a token stream

    Every program, copybook, JCL member, deployment descriptor and stored procedure is parsed by a dialect-aware grammar. Copybooks are expanded with REPLACING applied, so a pattern hidden inside an included member is found at its real position.

  2. 02

    Resolve symbols and storage

    Every data name resolves to an offset and a length; every CALL, CICS LINK or XCTL, EJB lookup and Spring bean reference resolves to a target. Patterns such as REDEFINES overlays and VB6 global state are visible only at this layer.

  3. 03

    Build control flow and data flow

    The engine builds a control-flow graph per program and a cross-program call graph, then runs reaching-definitions, value-range and slicing passes. ALTER, GO TO DEPENDING ON and PERFORM THRU fall-through are CFG properties; trigger side effects and ON ERROR RESUME NEXT are dataflow properties.

  4. 04

    Match detectors and classify

    Each catalog entry is a deterministic detector over those graphs, with a fixed rule set and no sampling. Every hit is classified as a business rule, as plumbing, or as needing review, and carries the file and line range that produced it.

  5. 05

    Map, export and review

    The finding links to its modern mapping and, where it applies, to a generated OpenAPI 3.1 path, DMN 1.5 table or JSON Schema. Your engineers review the mapping beside the source lines and sign it off before anyone builds against it.

The Modernization Architect

Ten new anti-patterns a month, with the playbooks that use them.

A monthly deep dive on mainframe decompilation, DMN extraction and legacy migrations. Each issue walks through the new catalog entries and the migration guide where they show up most.

CITE THIS CATALOG

Architects and SI practice leads may quote any entry in RFP responses, discovery reports and architecture reviews with attribution:

PYD ENTERPRISES PRIVATE LIMITED. Legacy Anti-Patterns Catalog (2026). pydenterprises.com/resources/legacy-patterns-catalog

Look up a term in the glossary

Find every one of these in your code, with line numbers.

Run PYD ENTERPRISES on 100,000 lines of COBOL, Java or .NET in your private VPC and get a pattern inventory with modern mappings in your first week.