A mainframe extract is bytes, not a file format. Nothing inside it says where one field ends and the next begins, whether a number is negative, or where its decimal point belongs. All of that lives in a separate document — and when the two disagree, the load still succeeds and the numbers are still wrong.
Open the inspector → to run this against a copybook of your own.
Eighty seconds, no sound. The same copybook against two files — one it does not describe, and one it does. Every frame is the tool running, not a mock-up.
Anyone moving decades of mainframe data into a warehouse, a lake, or a new system — which right now is most large banks, insurers, utilities and government agencies in Europe.
A flat file of fixed-length records in EBCDIC, and a COBOL copybook describing the layout. The file has no header, no delimiters and no types. The copybook is the only thing that makes it readable — and it was last edited by someone who has retired.
Slice each record at fixed offsets, strip anything that isn't a digit, cast to a number, load it. It runs. It produces a table. Row counts match the source exactly, which is the check most teams stop at.
Credits arrive as charges. Amounts arrive a hundred times too large. A code column silently falls through every branch. There is no exception, no rejected row, no red mark — just a column of plausible numbers that are wrong, sitting in a warehouse being reported on.
Click any field in the copybook to select it in the inspector below. The raw bytes are the same 60 records, shown as they actually sit on disk.
Press As text to see what happens when this file is opened in an ordinary editor. The bytes are unchanged; only the assumed character set differs. EBCDIC is not ASCII, and nothing in the file announces which one it is.
Not three settings. Three real loaders, of which two are common and both are wrong.
Recover the digit hiding under the sign, apply the sign, then shift the implied decimal point that the copybook declares and the file does not store.
# PIC S9(08)V99, EBCDIC, trailing overpunch digits, sign = split_overpunch(text) value = Decimal(digits) * sign value = value.scaleb(-2) # the V99
What overpunch does.
The last byte of a negative value is } or J–R, not a digit. Strip non-digits and it disappears — along with the digit sharing that byte. Every credit silently becomes a charge.
value = int(re.sub(r"\D", "", text)) / 100
The most common mistake, because it looks defensive.
The same, plus forgetting that V99 means two decimal places that are never written down. Cents are read as whole units and every figure is a hundred times too large.
value = int(re.sub(r"\D", "", text))
Usually spotted — but only when someone already knows the true total.
BIL-ADJUSTMENT-AMT totalled across all 100,000 records by the tool. Same bytes each time.
60 verbatim records are embedded in this page and decoded here in your browser — these figures are computed live, not quoted. Click a byte to select its field.
No model involved. Every line carries the number of records it was observed in, and where the consequence is arithmetic, the arithmetic.
Nemotron may only propose from a closed vocabulary the prober knows how to test. A hallucination cannot become a finding here — only a refuted hypothesis.
Plenty of copybooks are not files. They are printouts, or images inside a PDF nobody can select text out of, and the person who could retype them left in 2009.
Same model, same image, two attempts. One is right. The other names a field DALYTRANS-ID, truncates another to DALY, and parses as perfectly valid COBOL — nothing about its shape gives it away.
What settles it is that a copybook makes a falsifiable prediction. The field widths must sum to the record length printed on the page, and the real 105,000-byte data file must divide by it. A model read the paper; the arithmetic decided whether it read it right. An unreliable reader plus a decisive check is a reliable pipeline — so the tool simply re-reads until a layout is proved, and tells you how many attempts it took.
A copybook describes bytes. A schema needs answers the bytes do not carry. So nothing is generated from the copybook — a plan is, and the plan is what a person reviews and edits. Everything below is real output of the tool.
Point it at a copybook of your own, with or without a data file.
Nothing is uploaded. The parser and the rules run in this page, in your browser — there is no server to send anything to. That is not a convenience; the data this tool is for is exactly the data nobody is allowed to put on a website, so the analysis has to come to the bytes instead. You can disconnect your network and this section still works.
Six terms that carry all the trouble.
Every figure on this page is real output of overpunch run against
demo/UTLBILL.dat. The record layout, its domain and every byte of its data are invented
for the demo — no copybook or dataset belonging to any organisation appears here. Full-file totals
come from the tool's own 100,000-record pass; the inspector's figures are computed in your browser
from the 60 records embedded in this page, by a second decoder written independently of the first.
Comparing the two across 660 field reads is how a digit-dropping bug in the original was found.