Skip to main content
A unit is a directory in a mainframe codebase’s own shape, plus a run.json that says what to run.

The tree

CATALOG/, DB/, CHAIN/ and ORACLE/ are reserved. Every other directory is a source library. A source file at the top of the tree is never found: put it in a subdirectory. A copybook directory must be named cpy, cpyv1, copy or copybooks (any case) to be searched.

The demand

Exactly one of these says what to run: Declaring two of compile, submit and CHAIN/ is refused.

run.json

Every setting is optional. What run.json leaves out comes from the codebase’s harwell.toml [run], then from the default. An unknown key is refused by name. The report carries the resolved settings, where each came from, and one digest over them under configuration: two runs with the same digest ran under the same settings. A run.json may not restate what a codebase is (its libraries, search orders, JOB card, region or Db2 parameters). Those live in harwell.toml [site].

CHAIN/chain.json

CATALOG/_geometry.json

A fixed-format data set holds fixed-length records with no newlines. A file that is exactly N lines of LRECL bytes is read as N records with the newlines dropped. Any other misfit is read as it is, and the result’s seed: line says where records start going wrong.

ORACLE/

With an ORACLE/, the result carries a verdict. It checks only what it names. Tables. One row per line, fields joined with |, rows ordered by every column. \N is NULL. Escape \\, \|, \n and \r. Trailing blanks are not significant. Screens. One entry per map sent, in order. null skips one. An entry is {"map", "mapset", "fields": {NAME: value}}, compared as the screen shows the fields, trailing blanks dropped. A field whose value is null must be on the map, and its value is not checked. "exact": true also checks the number of maps sent.