Repository navigation
compile & runtime options as a first-class estate input: one resolver for oracle + det port, provenance, evidence fingerprint #4704
Copy link
Copy link
Closed
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 request (2026-10-08). Under the policy "IBM is the reference; GnuCOBOL is the instrument" (#4702), "IBM's result" means IBM's result under the compile and runtime options this estate actually uses. Today we capture only part of those options, and they don't flow through the system as one input.
What exists today (origin/main)
tests/tools/equivalence_common.py(Regional compiler and DB2 options not captured: INTDATE, YEARWINDOW, ARITH, TRUNC, NUMPROC, DSNHDECP DATE/TIME format, DECIMAL=COMMA #3828, Equivalence oracle runs IBM's default TRUNC(STD) as TRUNC(BIN) on both sides #4102, COBOL oracle/translator: floating point and compiler options (COMP-1/2 hex float, NUMPROC, ARITH(EXTEND), TRUNC(OPT), INTDATE, COMP-5 byte order) #4271) builds cobc flags from three sources:- the case's
compiler_options, standing in for the JCL PARM; - the program's own
CBL/PROCESScards, which override it (det/source.pyparses them; GnuCOBOL gets them blanked); - IBM defaults for anything unnamed (
DEFAULTS; TRUNC(STD), for example).
- the case's
- Only INTDATE, TRUNC, ARITH, NUMPROC are
SEMANTIC_OPTIONS. TRUNC(OPT), ARITH(EXTEND) and INTDATE(LILIAN) raiseUnsupportedOption. NUMPROC(MIG) resolves per case (numproc_mig). - The det translator reads some of the same facts separately: NUMPROC in
det/source.py/Codec.java, ARITH indet/program.py/expr.py, DECIMAL-POINT from SPECIAL-NAMES, code pages from the estate manifest (code_pages,--source-encoding), andrecord_charsetin the forges. - Only mortgage-mpmt records the compiler product and version, with provenance (
case.json→compiler: {product, version, evidence}, from BLDMORT.jcl).
Gaps
- Options not captured or modelled, for each: does it change results, can cobc do it, and what does the det port do?
- Compiler:
- ZONEDATA (Enterprise COBOL 6.x; INVDATA in 6.4+): how invalid zoned/packed data behaves (C11);
- CODEPAGE;
- NSYMBOL / DBCS;
- DISPSIGN;
- AFP / FLOAT;
- SSRANGE and NUMCHECK / INITCHECK (abends vs silent behaviour);
- OPTIMIZE (undefined-behaviour shapes such as C14 divide by zero);
- TRUNC(OPT);
- ARITH(EXTEND).
- Compiler version (6.1 vs 6.3 vs 6.4 change defaults and behaviour) and the shop's installation defaults (IGYCDOPT). A program with no PARM gets the shop's defaults, not IBM's.
- Language Environment runtime options:
- STORAGE(heap / stack init), which decides what uninitialised WORKING-STORAGE holds;
- TRAP / ABTERMENC (abend behaviour);
- the CEEOPTS / CEEUOPT source.
- Db2 precompile and bind:
- DATE / TIME format (ISO / USA / EUR / JIS / LOCAL), which affects every date string;
- DEC(15 / 31), DECPT;
- SQLCCSID / CCSID;
- ISOLATION.
- CICS: translator options, the region's code page (SIT / LOCALCCSID), and the abend and EIB conventions it relies on.
- Compiler:
- No single source of truth. The oracle side (
equivalence_common) and the port side (det translator / runtime) each read options their own way. They must resolve the same effective option set per program. - No provenance. We should know whether each option was found (JCL PARM, CBL card, installation defaults listing, LE options member) or assumed (IBM default or a declared assumption).
- Not in the evidence chain. A program's effective options aren't part of its evidence record's fingerprint, so a change to them doesn't make the proof stale. The evidence report doesn't show which options a level holds under.
Proposal
- An estate-level options file (e.g.
estate_options.jsonbeside the corpus pin or the case) with:- compiler product and version, and installation defaults;
- default PARM, plus per-program overrides;
- LE runtime options;
- Db2 precompile and bind options;
- CICS region options;
- for every value, its provenance (source file and line, or "assumed: IBM default" / "assumed: owner decision").
- One resolver (
effective_options(program)) combines the estate defaults, the JCL PARM and the program's CBL / PROCESS cards (IBM's precedence order). Both the oracle flag builder and the det translator / runtime consume it; drop the separate readers. - Per option, a row in a table (in
oracle_assumptions.mdor a newcompile_options.md):- does it change results;
- the cobc flag, config or wrapper that honours it;
- the det port's behaviour;
- otherwise: refuse by name / declared difference (per oracle policy: IBM is the reference, GnuCOBOL the instrument — audit register entries + z/OS calibration oracle #4702).
- Evidence: add
optionsto the evidence-record fingerprint as a BLOCKING input, so changed options make the proof stale (tests/tools/evidence.pyBLOCKING). Show the effective options and their provenance per program in the evidence report. - Intake: an estate checklist for asking a customer for the inputs we need: compile JCL / PARMs, IGYCDOPT listing, CEEOPTS / CEEUOPT, Db2 bind cards, CICS SIT. For the blind 4th estate, a list of what we assume when an input is missing.
- Calibration hook (oracle policy: IBM is the reference, GnuCOBOL the instrument — audit register entries + z/OS calibration oracle #4702 part 2): the z/OS probe corpus runs under the same effective options, so measured IBM results are tied to the options they hold under.
Acceptance
- An estate options file exists for each burned estate (CardDemo, CBSA, GenApp, mortgage, async credit-card, zecs). Each value carries provenance, and unknowns are explicitly marked "assumed".
- The oracle and the det port resolve identical effective options through one resolver; a test asserts it per program.
- Changing an estate's options makes the affected evidence records stale (CI fails), and the evidence report lists the options per program.
- The option table covers at least the options in Gap 1. Each one is modelled, honoured by cobc, refused by name, or a declared difference.
- The estate-intake checklist is documented.
Related: #4702 (IBM reference and z/OS calibration), #3828 / #4102 / #4271 (existing option handling), #4048 (evidence records), #4601 / #4703 (evidence report).
🤖 Generated with Claude Code
Remaining slices (as of 2026-10-18)
Done so far: 3 merged PRs (#4719, #5307, #5385).
- Compiler-option rows, group A (ZONEDATA/INVDATA, TRUNC(OPT), ARITH(EXTEND), INTDATE(LILIAN)): per option, changes results? cobc flag? det behaviour? else refuse by name or declared difference. Check: option-table tests + a burned-estate "no recorded value newly refuses" test. TRUNC(OPT) needs the Option table for compiler options not yet modelled (ZONEDATA/INVDATA, CODEPAGE, SSRANGE/NUMCHECK, OPTIMIZE, TRUNC(OPT), ARITH(EXTEND)...) (#4704) #4706 ruling first (CBSA builds with TRUNC(OPT), applied as STD today). (1 PR) (audit 2026-10-18: options: group A compile options have a fate; no burned-estate value newly refuses (Part of #4704) #5477, options: compiler option table -- result-changing options refused by name or declared (Part of #4706) #5088, det: TRUNC(OPT) as IBM defines it -- STD for conforming binary values, a named stop past the PICTURE (Part of #4706) #4746, det: ARITH(EXTEND) modelled -- an intermediate past 30 digits stops by name (Part of #4706) #5340, det: INTDATE(LILIAN) modelled in the det port (Part of #4706) #5413)
- Compiler-option rows, group B (CODEPAGE, NSYMBOL/DBCS, DISPSIGN, AFP/FLOAT, SSRANGE, NUMCHECK/INITCHECK, OPTIMIZE), same format; with group A closes Option table for compiler options not yet modelled (ZONEDATA/INVDATA, CODEPAGE, SSRANGE/NUMCHECK, OPTIMIZE, TRUNC(OPT), ARITH(EXTEND)...) (#4704) #4706. (1 PR) (options: audit Gap-1 options have a row and an intake question (Part of #4704) #6184)
- (moot, owner 2026-10-23: Option table for LE runtime, Db2 precompile/bind and CICS region options (#4704) #4707 closed; table covered by runtime options: judge Db2 DATE / TIME / DEC / DECPT / SQLCCSID / EBCDIC_CCSID for syntax (Part of #4707) #6182/runtime options: judge CICS region / program-definition values for syntax (Part of #4707) #6192, no provisional rows left in runtime_options.py) Option table for LE runtime, Db2 precompile/bind and CICS region options (#4704) #4707 follow-through: after the owner ruling, adjust the 23 provisional LE/Db2/CICS rows in
gitgalaxy/core/runtime_options.py(C18). Check:test_runtime_option_table.py. (1 PR, blocked on the owner) - (verify) Det port reads DECIMAL-POINT and code pages through the resolver instead of separate readers. Check: per-program oracle/det parity,
det_port.py checkunchanged on the burned estates. Only if a burned program needs it (Estate options: compiler version bounds which options exist; parity covers ARITH (Part of #4704) #5385 names only a non-burned crucible estate). (1 PR) (test: det translator reads compile options only through the one resolver (Part of #4704) #6195) - (verify) CEEOPTS/CEEUOPT reader: grep the burned corpora first; drop if nothing reads it (Runtime option table: LE, Db2 and CICS options refused, declared or no effect (Part of #4704) #5307 says none does). (audit 2026-10-18: Runtime option table: LE, Db2 and CICS options refused, declared or no effect (Part of #4704) #5307)
- Acceptance audit: every burned estate has an options file (CBSA, CardDemo, GenApp, mortgage, zecs, async credit-card) and the intake checklist covers every Gap-1 option. Check:
test_estate_options+ a table-coverage test listing any Gap-1 option with no row. (1 PR) (options: Gap-1 audit covers every table row and each burned estate's recorded-or-absent keys (Part of #4704) #6284)
Done when: every Gap-1 option has a row (modelled, honoured by cobc, refused by name, or declared difference) and oracle and det port resolve the same effective options through one resolver, with a per-program test, evidence staleness on option change, and an options file per burned estate.
Owner decision needed: (a) TRUNC(OPT) ruling (Option table for compiler options not yet modelled (ZONEDATA/INVDATA, CODEPAGE, SSRANGE/NUMCHECK, OPTIMIZE, TRUNC(OPT), ARITH(EXTEND)...) (#4704) #4706); (b) the provisional LE/Db2/CICS policies (Option table for LE runtime, Db2 precompile/bind and CICS region options (#4704) #4707); (c) does the cobolrt per-estate profile (cobolrt: take an explicit per-estate options profile instead of baked-in behaviour #4714) count here or stay separate?
Out of scope here: the calibration hook (oracle policy: IBM is the reference, GnuCOBOL the instrument — audit register entries + z/OS calibration oracle #4702 Part 2).
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
estate_options: a TEMPLATE of the file shape (writes the schema keys …
estate_options: read the options file through source_text (#3813 sour…
Estate compile/runtime options as one input: options files, one resol…
Runtime option table: LE, Db2 and CICS options refused by name, decla…
Estate options: compiler version bounds which options exist; parity c…
9 remaining items
squid-protocol commentedon Oct 22, 2026
Churn run
4704-20261022T1054Z(host melek) ended without a PR. #4704 group-B options already done by PR #5600 (178 tests pass on main); checkbox l.71 still unticked, siblings: acceptance audit (no burned program blocked), #4707 owner rulingsquid-protocol commentedon Oct 23, 2026
Churn run
4704-20261023T0045Z(host melek) ended without a PR. [c:2eaeaf68] already done by PR #5600 (merged 2026-10-19, 167 tests pass); second run to find this without a PR. Box still unticked: needs a manual tick by the owner/gate. Next slice: acceptance audit test.options: audit that every Gap-1 option has a row and an intake questi…
squid-protocol commentedon Oct 23, 2026
#6184 merged: a partial slice of [c:8fb0dc8e] "Acceptance audit: every burned estate has an options file (CBSA, CardDemo, GenApp, mortgage, zecs, async credit-card) and the intake checklist covers every Gap-1 option. Check:
test_estate_options+"; left: done: table-coverage test and intake coverage of Gap-1; the options file per burned estate is already pinned bytest_estate_options(every burned estate has one) (promoter-bot)test: pin that the det translator reads every compile option through …
squid-protocol commentedon Oct 23, 2026
Claimed by promoter-bot host
melek, lease renewed 2026-10-23T17:47Z. It lapses after 6 h without a renewal. To take it back, assign someone or remove theclaim:meleklabel.options: Gap-1 audit also covers the reverse (every table row classif…
squid-protocol commentedon Oct 23, 2026
All six slices are ticked and merged (#4719, #5307, #5385, #6184, #6195, #6284). Every Gap-1 option has a row, all six burned estates have an options file, and #6284 added the reverse table-coverage and per-estate disposition audit. The three owner questions in the slice list were mooted or answered (#4706 via group A/B, #4707 closed 2026-10-23); the calibration hook stays with #4702 part 2.