Repository navigation
oracle policy: IBM is the reference, GnuCOBOL the instrument — audit register entries + z/OS calibration oracle #4702
Copy link
Copy link
Open
Labels
claim:melekenhancementNew feature, sensor, or structural signatureNew feature, sensor, or structural signaturelegacy-modernizationCOBOL refractor, dead-code extraction, and JCL forgingCOBOL refractor, dead-code extraction, and JCL forgingneeds:corpusNeeds the large local source corpora (main box only)Needs the large local source corpora (main box only)needs:dockerNeeds Docker toolchain/oracle containersNeeds Docker toolchain/oracle containerspriority: highCore feature broken, but workarounds existCore feature broken, but workarounds existscope:coreBlocks a burned-estate program's next evidence rung, or the 4th-estate one-shot trialBlocks a burned-estate program's next evidence rung, or the 4th-estate one-shot trialtestingUnit, integration, and E2E pipeline verificationUnit, integration, and E2E pipeline verification
Description
Owner policy (2026-10-08): IBM is the reference; GnuCOBOL is the instrument.
- Where IBM documents a result under the estate's compile options (TRUNC, NUMPROC, ARITH, ZONEDATA, ...), the det port follows IBM. The oracle (cobc 3.1.2
-std=ibm) is configured to match through cobc options, config or a wrapper; if that's impossible, the shape is a declared oracle-vs-IBM difference the comparator expects. Proofs are never loosened. - Where IBM's result is undefined (e.g. non-digit data, divide by zero without ON SIZE ERROR, which can abend S0CB), the port refuses by name or follows cobc, and the register says so explicitly.
- GnuCOBOL stays the bulk oracle: free, in CI, reproducible by purchasers. A real z/OS (Enterprise COBOL) is a calibration oracle: run the probe and fuzz corpus there occasionally to replace "IBM side ASSUMED" with measured results. It is not in CI.
Part 1: audit register entries that chose "match GnuCOBOL"
For each entry: the IBM reference (cited), whether IBM documents it under which options, what cobc can be made to do, the chosen behaviour, and the register entry updated.
- C2 (det runtime: arithmetic intermediates are not truncated as the oracle's ARITHMETIC-OSVS (IBM's fixed-point decimal places) truncates them (register C2) #4287 / det runtime: truncate arithmetic intermediates as cobc's ARITHMETIC-OSVS does (#4287) #4654, merged): OSVS intermediate truncation, where the oracle departs from IBM's Appendix A rule; the 30-digit cap is not modelled.
- C4 (det runtime: a result overflowing a binary receiver's bytes (no ON SIZE ERROR) is stored unlike GnuCOBOL #4684 / det: an unsigned binary ADD / SUBTRACT wraps as cobc's native arithmetic does; lifted COMP-5 under TRUNC(STD) (#4684) #4689): unsigned binary ADD/SUBTRACT. Decided: IBM absolute value (on det: an unsigned binary ADD / SUBTRACT wraps as cobc's native arithmetic does; lifted COMP-5 under TRUNC(STD) (#4684) #4689).
- C11 (equivalence: LGTESTP4's add moves a space-filled CA-BROKERID / CA-PAYMENT to binary (GnuCOBOL 931773840, det port 0; C11) #4652 / equivalence: model the oracle's MOVE of a non-digit zoned item to a binary item (#4652) #4663 merged, equivalence: the rest of C11 -- non-digit zoned data in arithmetic, comparisons, edited and zoned MOVEs differs from the oracle #4662 / equivalence: non-digit zoned data as MOVE sender, operand, comparand; the oracle's sign rewrite (#4662) #4693): non-digit zoned data. Mostly undefined in IBM's docs; check ZONEDATA (Enterprise COBOL 6) and NUMPROC.
- C13 (det runtime: numeric-edited item compared with a numeric literal numerically; GnuCOBOL compares it as text #4665 / det: a numeric-edited item compared with a number is a text comparison (#4665) #4668, merged): numeric-edited vs numeric comparisons. The IBM side is ASSUMED; confirm against the Language Reference.
- C14 (det runtime: a zero divisor without ON SIZE ERROR throws in the port; the oracle leaves the receiver unchanged #4655 / det runtime: a zero divisor leaves the receivers unchanged, as the oracle (#4655) #4677, det runtime: a floating-point zero divisor still throws ArithmeticException (Hfp.divide) #4675 / det: a float zero divisor is libcob's NaN; a phrase binds to the innermost open statement (#4675, #4676) #4686): size errors and divide by zero (undefined or S0CB on IBM), and
0 ** -n(IBM says size error, the oracle returns 0). - Batch Sysout: DISPLAY of a hex-literal byte >= X'80' is not byte-identical under a non-latin-1 record charset (cp037/cp1047/cp1252) #4698: non-latin-1 batch DISPLAY bytes and line terminator.
Part 2: z/OS calibration oracle (blocked on access and legal)
- Candidates: IBM Wazi as a Service (z/OS dev/test on IBM Cloud), ZD&T (licensed dev/test emulation), IBM Z Xplore (free; its terms likely don't cover commercial validation), or a customer's or partner's mainframe. z/OS on Hercules is not an option (licence ties z/OS to IBM hardware).
- Legal questions for counsel first: do the licence terms allow using outputs to validate a commercial translator, and may results be published (relates to the publishing hold, legal Q16)?
- Deliverable: a probe corpus (the register shapes plus the det fuzz kits) runnable on Enterprise COBOL with recorded results, and a "z/OS-calibrated" marker per register entry and in the evidence report.
🤖 Generated with Claude Code
Remaining slices (as of 2026-10-18)
Done so far: 3 merged PRs (#5308, #5384, #5396).
- C11 leftovers: quote or settle the remaining ASSUMED bullets (P-scaled items, UNSTRING numeric INTO) from the 6.4 Language Reference (C11 register page,
cobolrt_rules.json). Check:register.py --check,test_cobolrt_rules.py. (1 PR, docs) (register: C11 UNSTRING / P-scaled bullets quoted from the 6.4 Language Reference (Part of #4702) #5488) - C2 "To settle": probe the 31+ digit intermediate on the Docker cobc and record it as matched or a declared difference. Check:
register.py --check+ the probe output quoted. (1 PR) (C2: probe the 31+ digit intermediate on the oracle (Part of #4702) #5502) - Batch Sysout: DISPLAY of a hex-literal byte >= X'80' is not byte-identical under a non-latin-1 record charset (cp037/cp1047/cp1252) #4698 / D2 re-check: non-latin-1 batch DISPLAY bytes and line terminator against D2 as updated in register: D2, F1 and F3 quote IBM's text and declare the oracle difference (Part of #4702) #5396. Check:
register.py --check; a behaviour change needs a golden bless. (1 PR) (D2: Sysout writes X'25' under IBM037 as its own byte; low bytes proven against cobc (Part of #4702) #5737) - (verify) ZWB/NOZWB (C13): only if a burned program needs it (register: C13, C14, C4 cite IBM's text instead of assuming it (Part of #4702) #5308 says none); else close as nothing to prove. (1 PR or none) (register: ZWB/NOZWB (C13) -- no burned program needs it, nothing to prove (Part of #4702) #5771)
- (verify) Packed/binary vs nonnumeric comparison (IBM rejects, the port compares digits): grep the burned corpora before any change, since refusing moves goldens. (1 PR or none) (det: a packed or binary item compared with a nonnumeric operand is refused, IBM rejects it (C13) (Part of #4702) #5797)
- Register sweep for other "match GnuCOBOL" / ASSUMED entries outside the C/D/F members done so far. Check:
register.py --check+ a list of entries with no IBM quote or declared difference. (1 PR) (register: strict IBM citation for X16, X23, X24; STRICT_BASELINE emptied (Part of #4702) #6044) - Part 2: z/OS calibration probe corpus and a "z/OS-calibrated" marker per register entry and in the evidence report. Blocked on access and legal; do not start.
Done when: every register entry that chose "match GnuCOBOL" cites IBM's text and matches it or declares the difference, and Part 2 has recorded z/OS results (or the owner descopes Part 2).
Owner decision needed: z/OS access (Wazi as a Service, ZD&T or a customer mainframe) and counsel on licence/publishing (Q16); and whether Part 2 stays here or splits off, since it blocks closure indefinitely.
Drafted 2026-10-18 by a Sonnet triage pass from this issue, its comments and the bodies of its "Part of" PRs; (verify) items were not checked against main. Tick boxes as slices merge; edit freely.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
claim:melekenhancementNew feature, sensor, or structural signatureNew feature, sensor, or structural signaturelegacy-modernizationCOBOL refractor, dead-code extraction, and JCL forgingCOBOL refractor, dead-code extraction, and JCL forgingneeds:corpusNeeds the large local source corpora (main box only)Needs the large local source corpora (main box only)needs:dockerNeeds Docker toolchain/oracle containersNeeds Docker toolchain/oracle containerspriority: highCore feature broken, but workarounds existCore feature broken, but workarounds existscope:coreBlocks a burned-estate program's next evidence rung, or the 4th-estate one-shot trialBlocks a burned-estate program's next evidence rung, or the 4th-estate one-shot trialtestingUnit, integration, and E2E pipeline verificationUnit, integration, and E2E pipeline verification
Activity
[-]oracle policy: make the comparator z/OS-like — audit register entries where the det port follows GnuCOBOL over IBM[/-][+]oracle policy: IBM is the reference, GnuCOBOL the instrument — audit register entries + z/OS calibration oracle[/+]det runtime: an unsigned binary ADD / SUBTRACT stores IBM's absolute …
det: an unsigned binary ADD / SUBTRACT wraps as cobc's native arithme…
det: NUMVAL in a fixed-point statement rounds its store; drop the per…
register: C13, C14, C4 cite IBM's text instead of assuming it (Part of …
register: C2 and C11 quote IBM's text instead of assuming it (Part of #…
register: D2, F1 and F3 quote IBM's text and declare the oracle diffe…
29 remaining items
squid-protocol commentedon Oct 22, 2026
Claimed by promoter-bot host
melek, lease renewed 2026-10-22T18:20Z. It lapses after 6 h without a renewal. To take it back, assign someone or remove theclaim:meleklabel.register: strict citation tier for entries that claim a match (Part of …
squid-protocol commentedon Oct 22, 2026
#6020 merged: a partial slice of [c:8980bf5e] "Register sweep for other "match GnuCOBOL" / ASSUMED entries outside the C/D/F members done so far. Check:
register.py --check+ a list of entries with no IBM quote or declared difference. (1 PR)"; left: 15 entries (F1 F2 I1 I3 I4 Q1a Q1b X1 X9 X13 X14 X15 X16 X23 X24) still name an IBM document only by name; each needs its document number/section or a declared difference, then removal fromSTRICT_BASELINE. (promoter-bot)register: cite IBM for I1 I3 I4 Q1a, shrink STRICT_BASELINE 11 -> 7 (…
squid-protocol commentedon Oct 22, 2026
#6036 merged: a partial slice of [c:8980bf5e] "Register sweep for other "match GnuCOBOL" / ASSUMED entries outside the C/D/F members done so far. Check:
register.py --check+ a list of entries with no IBM quote or declared difference. (1 PR)"; left: Q1b, X13, X14, X15, X16, X23, X24 still lack a strict cite (promoter-bot)register: cite IBM for F1 F2 X1 X9, shrink STRICT_BASELINE 15 -> 11 (…
register: strict IBM citation for Q1b, X13, X14, X15; STRICT_BASELINE…
squid-protocol commentedon Oct 22, 2026
#6043 merged: a partial slice of [c:8980bf5e] "Register sweep for other "match GnuCOBOL" / ASSUMED entries outside the C/D/F members done so far. Check:
register.py --check+ a list of entries with no IBM quote or declared difference. (1 PR)"; left: X16, X23, X24 still in STRICT_BASELINE (next slice, 5-file cap) (promoter-bot)register: strict IBM citation for X16, X23, X24; STRICT_BASELINE empt…
squid-protocol commentedon Oct 22, 2026
#6048 merged: a partial slice of [c:b5eee87e] "Part 2: z/OS calibration probe corpus and a "z/OS-calibrated" marker per register entry and in the evidence report. Blocked on access and legal; do not start."; left: probe corpus runnable on Enterprise COBOL and recorded z/OS results (blocked on z/OS access and counsel/Q16) (promoter-bot)
register: z/OS calibration probe corpus for C1, C3, C4, C13, C14 (Par…
squid-protocol commentedon Oct 22, 2026
#6052 merged: a partial slice of [c:b5eee87e] "Part 2: z/OS calibration probe corpus and a "z/OS-calibrated" marker per register entry and in the evidence report. Blocked on access and legal; do not start."; left: recorded z/OS results (blocked on z/OS access and counsel, Q16) (promoter-bot)
register: z/OS calibration probes for C2, C11, D2 (Part of #4702) (#6055
squid-protocol commentedon Oct 22, 2026
#6055 merged: a partial slice of [c:b5eee87e] "Part 2: z/OS calibration probe corpus and a "z/OS-calibrated" marker per register entry and in the evidence report. Blocked on access and legal; do not start."; left: recorded z/OS results (blocked on z/OS access and counsel, Q16) (promoter-bot)