Skip to main content
Moderne OnlyThis recipe is proprietary to Moderne and runs on the Moderne platform or CLI — it isn’t part of the open-source catalog. Available with a Moderne subscription.Contact Sales

Say which build orders the scheduler does not enforce, and which jobs nobody orders

Recipe IDio.moderne.mainframe.controlm.AnalyzeScheduleGaps
Artifactio.moderne.recipe:recipes-mainframe

Reconcile the scheduler against the build and against the JCL library. A link-edit deck that includes an object binds whatever the object library held when the binder ran, so the job that compiles the object has to have run before the job that links the module: a row per order the build requires, with the job that writes the object, the job that reads it, the schedules that submit each, and whether a condition puts them in that order. The second table is the library from the job's side: every JCL member with the schedules that submit it, and the members nobody orders. A third finding is the reference no deck accounts for: a name an assembler member uses and defines nowhere that no INCLUDE card names is one the binder's autocall resolves, so what the module holds is whatever SYSLIB held on the day it ran. FindScheduleGaps answers the same question and marks the cards and job names it was answered from; this one produces the tables and changes nothing.

Single recipeOpenRewriteModerne Proprietary License
Try in PlatformTry this recipe in the Moderne platform. Not a user yet? You’ll get a no-setup demo environment, with nothing to install or configure.

Usage​

Run this recipe

This recipe has no required configuration options. Users of Moderne can run it via the Moderne CLI.

You will need to have configured the Moderne CLI on your machine before you can run the following command.

shell
mod run . --recipe AnalyzeScheduleGaps

If the recipe is not available locally, then you can install it using:

RELEASE resolves to the newest release and LATEST to the newest build of any kind, including snapshots. Either one lets mod config recipes upgrade pull in later versions without editing this command; a pinned version stays where you put it.

mod config recipes jar install io.moderne.recipe:recipes-mainframe:RELEASE

Data tables​

Build order
io.moderne.mainframe.analysis.table.BuildOrder

Every order the build requires between two jobs, with what the scheduler does about it. A link-edit deck that includes an object binds whatever the object library held when the binder ran, so the job that compiles the object has to have run first — and no one file says so: the deck names a member, the JCL names the library it is written to and read from, and only the scheduler can make one job wait for another.

Export after a run
mod study . --last-recipe-run \
--data-table io.moderne.mainframe.analysis.table.BuildOrder
ColumnDescription
ModuleThe load module whose deck requires the order.
DeckThe link-edit deck that includes the object. A deck written in a job stream is that job.
Deck lineThe one-based line of the deck the INCLUDE card is on.
ObjectThe member the card includes, which is the compiled subroutine, map set or assembler object bound into the module.
Object data setThe library member the include resolves to, from the DD the card names as the linking step allocates it. This is what joins the deck to the job that writes the object.
Producer jobThe job that writes the object, which is the one that has to run first.
Producer stepThe step of that job, on whose SYSLIN or SYSLMOD the object is written.
Producer schedulesThe scheduler's jobs that submit the producing member, comma separated. Empty where nothing schedules it.
Consumer jobThe job that link-edits the module, which is the one that has to run second.
Consumer stepThe step of that job that reads the deck.
Consumer schedulesThe scheduler's jobs that submit the consuming member, comma separated. Empty where nothing schedules it.
EnforcementENFORCED where the consumer waits on a condition the producer adds, ENFORCED_THROUGH where the conditions in between impose the order anyway, MISSING where both are scheduled and neither waits for the other, UNSCHEDULED where one of them has no schedule at all, and SAME_JOB where one job does both and its own step order decides it.
Enforced throughThe jobs the order runs through where no condition joins the two directly, producer first: CLMASMB > CLMCMPC > CLMCMPI. Empty for every other verdict.
Schedule coverage
io.moderne.mainframe.analysis.table.ScheduleCoverage

Every job of the JCL library with the schedules that order it. A JCL member says what a job does and never says when it runs, so a member with no schedule is one somebody submits by hand, or one nothing runs at all — and either way it is outside everything the operations side of the estate is documented and monitored by.

Export after a run
mod study . --last-recipe-run \
--data-table io.moderne.mainframe.analysis.table.ScheduleCoverage
ColumnDescription
JobThe JCL member, which is the name a schedule's MEMNAME writes.
Source pathThe file the job was read from.
SchedulesThe scheduler's jobs that submit this member, comma separated. A member two applications order is submitted by a job of each.
TablesThe tables those jobs are ordered in, comma separated, which is where an operator looks for them.
DefinitionsThe files the schedules were read from, comma separated. A shop that supplies both the panel and the export supplies each job twice.
VerdictORDERED, or UNSCHEDULED for a job no schedule submits.
Findings
io.moderne.mainframe.analysis.table.Findings

Everything the mainframe analyses found wrong, ranked, with the evidence for each and the line it is on. Sort on priority.

Export after a run
mod study . --last-recipe-run \
--data-table io.moderne.mainframe.analysis.table.Findings
ColumnDescription
Priority1 for CRITICAL down to 4 for LOW, so the table sorts.
SeverityCRITICAL for code that cannot do what it was written to do, HIGH for what will break a migration if not decided deliberately, MEDIUM for what is worth knowing first, LOW for cleanup.
CategoryWhat kind of problem it is, which is what groups the report into sections: DEAD_RULE, UNREACHABLE_CODE, COPYBOOK_DRIFT, MIGRATION_BLOCKER, RANGE_PATHOLOGY, DEAD_DATA, COMPLEXITY, LAYOUT_DRIFT, IMS_PCB_MISMATCH, IMS_SEGMENT_NOT_SENSITIVE, IMS_IO_AREA_MISMATCH, MFS_MESSAGE_LENGTH, SCREEN_ITEM_UNREACHED, SCREEN_FIELD_UNREACHED, PARSE_FAILURE, UNDOCUMENTED, STALE_DOCUMENTATION, STALE_REFERENCE, UNENFORCED_BUILD_ORDER, UNSCHEDULED_JOB, AUTOCALL_RESOLVED_REFERENCE, UNRESOLVED_EXECUTION_PATH, INHERITED_SETTING, UNLOAD_NEEDS_REDESIGN, UNLOAD_ACCESS_MODE, UNLOAD_CONSISTENCY, UNLOAD_OUTPUT_WIRING, MIXED_SUBSTITUTION.
ProgramThe COBOL program, or the copybook where the finding is about one.
SummaryThe finding in one sentence, written to be read on its own.
EvidenceWhy this is claimed — the conditions that conflict, the two declarations that differ, the caller that made the paragraph unreachable. A finding nobody can check is a finding nobody will act on.
WhereThe paragraph, section or data item the finding is in.
Source pathThe file, so the finding can be opened.
Source files that had results
org.openrewrite.table.SourcesFileResults

Source files that were modified by the recipe run.

Export after a run
mod study . --last-recipe-run \
--data-table org.openrewrite.table.SourcesFileResults
ColumnDescription
Source path before the runThe source path of the file before the run. null when a source file was created during the run.
Source path after the runA recipe may modify the source path. This is the path after the run. null when a source file was deleted during the run.
Parent of the recipe that made changesIn a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all.
Recipe that made changesThe specific recipe that made a change.
Estimated time savingAn estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds.
CycleThe recipe cycle in which the change was made.
Source files that had search results
org.openrewrite.table.SearchResults

Search results that were found during the recipe run.

Export after a run
mod study . --last-recipe-run \
--data-table org.openrewrite.table.SearchResults
ColumnDescription
Source path of search result before the runThe source path of the file with the search result markers present.
Source path of search result after run the runA recipe may modify the source path. This is the path after the run. null when a source file was deleted during the run.
ResultThe trimmed printed tree of the LST element that the marker is attached to.
DescriptionThe content of the description of the marker.
Recipe that added the search markerThe specific recipe that added the Search marker.
Source files that errored on a recipe
org.openrewrite.table.SourcesFileErrors

The details of all errors produced by a recipe run.

Export after a run
mod study . --last-recipe-run \
--data-table org.openrewrite.table.SourcesFileErrors
ColumnDescription
Source pathThe file that failed to parse.
Recipe that made changesThe specific recipe that made a change.
Stack traceThe stack trace of the failure.
Recipe performance
org.openrewrite.table.RecipeRunStats

Statistics used in analyzing the performance of recipes.

Export after a run
mod study . --last-recipe-run \
--data-table org.openrewrite.table.RecipeRunStats
ColumnDescription
The recipeThe recipe whose stats are being measured both individually and cumulatively.
Source file countThe number of source files the recipe ran over.
Source file changed countThe number of source files which were changed in the recipe run. Includes files created, deleted, and edited.
Cumulative scanning time (ns)The total time spent across the scanning phase of this recipe.
Max scanning time (ns)The max time scanning any one source file.
Cumulative edit time (ns)The total time spent across the editing phase of this recipe.
Max edit time (ns)The max time editing any one source file.