Analyzes legacy JCL (Job Control Language) scripts to assist with migration to modern workflow orchestration and batch processing systems...
Analyzes legacy JCL scripts for migration to modern batch processing and workflow orchestration systems like Spring Batch, Apache Airflow, Kubernetes Jobs, or shell scripts.
This skill provides comprehensive analysis and migration planning for JCL (Job Control Language) batch processing systems. It extracts job structures, converts JCL constructs to modern workflow patterns, maps data dependencies, and generates implementation-ready migration strategies.
Key Migration Focus: JCL to modern orchestration with proper handling of COND logic inversion, data dependencies (DD statements), GDG generations, procedures (PROCs), and batch workflow patterns.
Use this skill when:
Extract job structure (JOB card), step sequences, program invocations (EXEC PGM/PROC), conditional logic (COND, IF/THEN/ELSE), return codes, data sets (DD statements), resource requirements, and symbolic parameters.
Extract input/output datasets, temporary datasets, GDG handling, concatenation, DISP parameters, and data flow between steps.
Parse PROC definitions, symbolic parameters, PROC overrides, nested procedures, INCLUDE statements, and JCLLIB references.
Generate Spring Batch jobs, Apache Airflow DAGs, Kubernetes Jobs, shell scripts, AWS Step Functions, or Azure Logic Apps.
CRITICAL: COND logic is INVERTED! Map COND parameters, IF/THEN/ELSE, return codes, step bypassing, and restart logic to modern constructs.
Find JCL jobs and procedures in the workspace:
find . -name "*.jcl" -o -name "*.JCL"
find . -name "*.proc" -o -name "*.PROC"
Use scripts/analyze-dependencies.sh or scripts/analyze-dependencies.ps1 to generate dependency graph in JSON format.
Use scripts/extract-structure.py to parse JCL files and extract:
Output format: JSON with job structure, steps, and dependencies.
CRITICAL: Identify and document COND logic (which is INVERTED):
COND=(0,NE) → Run if previous RC ≠0 (run on ERROR)COND=(0,EQ) → Skip if previous RC = 0 (skip on SUCCESS)Create truth tables for complex conditional logic to avoid errors in migration.
Track data flow between steps:
Use scripts/estimate-complexity.py to calculate migration complexity based on:
Select migration target based on requirements:
Create comprehensive migration report with:
Use template: assets/migration-report-template.md
JCL COND (inverted):
//STEP020 EXEC PGM=PROG2,COND=(0,NE)
Means: "Run if previous RC ≠0" → Run on ERROR!
Modern (normal logic):
if [ $rc -ne 0 ]; then run_prog2; fi
JCL IF/THEN (normal logic):
//IF1 IF RC = 0 THEN
//STEP020 EXEC PGM=PROG2
//ENDIF
Modern:
if [ $rc -eq 0 ]; then run_prog2; fi
Simple Sequential:
//STEP010 EXEC PGM=PROG1
//INPUT DD DSN=INPUT.FILE,DISP=SHR
//OUTPUT DD DSN=OUTPUT.FILE,DISP=(NEW,CATLG)
//STEP020 EXEC PGM=PROG2
//INPUT DD DSN=OUTPUT.FILE,DISP=SHR
#!/bin/bash
set -e
prog1 --input="input.file" --output="output.file" || exit 8
prog2 --input="output.file" || exit 8
Conditional (COND - inverted!):
//STEP010 EXEC PGM=VALIDATE
//STEP020 EXEC PGM=PROCESS,COND=(0,NE)
validate_data
rc=$?
if [ $rc -ne 0 ]; then process_data; fi # INVERTED!
IF/THEN/ELSE (normal logic):
//STEP010 EXEC PGM=VALIDATE
//IF1 IF RC = 0 THEN
//STEP020 EXEC PGM=PROCESSOK
//ELSE
//STEP030 EXEC PGM=PROCESSERR
//ENDIF
validate_data
rc=$?
if [ $rc -eq 0 ]; then processok; else processerr; fi
Procedure:
//MYPROC PROC MEMBER=,INFILE=
//STEP1 EXEC PGM=PROG1
//SYSIN DD DSN=&MEMBER,DISP=SHR
// PEND
function myproc() {
prog1 --sysin="$1" --input="$2"
}
myproc "test.data" "prod.file"
Spring Batch:
@Bean
public Job job() {
return jobBuilderFactory.get("job")
.start(step1()).next(step2())
.on("FAILED").to(errorStep())
.from(step2()).on("*").to(step3())
.end().build();
}
Airflow DAG:
with DAG('job', schedule_interval='@daily') as dag:
step1 = BashOperator(task_id='step1', bash_command='prog1.sh')
step2 = BashOperator(task_id='step2', bash_command='prog2.sh')
step1 >> step2
Error Handling: COND-based → if [ $rc -ne 0 ]; then error_handler; fi
GDG: GDG(0) → get_latest_generation, GDG(+1) → create_new_generation
Concatenation: Multiple DD → cat file1 file2 file3 | process
Restart: COND restart → checkpoint files (touch .checkpoint_step)
| RC | Meaning | Action |
|---|---|---|
| 0 | Success | Continue |
| 4 | Warning | Continue (informational) |
| 8 | Error | May continue based on COND |
| 12 | Severe Error | Typically stop |
| 16 | Fatal Error | Abort job |
Provide: Job overview, step sequence, data flow, conditional logic, migration target, workflow definition, migration estimate, action items.
For detailed conversion rules and patterns, see:
All scripts support cross-platform execution (Windows PowerShell, bash):
analyze-dependencies.sh/ps1 - Generate dependency graph in JSON format showing job-to-job, job-to-dataset, and procedure dependenciesextract-structure.py - Parse JCL files and extract structure (job cards, steps, DD statements, COND logic) to JSONgenerate-java-classes.py - Generate Java POJOs from data structures for Spring Batch item readers/writersestimate-complexity.py - Calculate migration complexity score based on steps, conditional logic, procedures, and data dependenciesScripts use standard libraries only and output JSON for easy integration with CI/CD pipelines and migration tracking tools.
Works with job schedulers (Control-M, cron), workflow platforms (Spring Batch, Airflow, K8s), monitoring tools, version control, and CI/CD pipelines.