Repository navigation
equivalence: CALL USING items and COMMAREA trailing FILLER compared whole; BMS OCCURS refused (Fixes #4778) - #4780
Merged
Merged
Conversation
… table travels (Fixes #4765) The harness's record layout listed an OCCURS group's fields once (the first occurrence), so a COMMAREA's table was compared at occurrence 1 only: a cbsa-inqacccu port that never wrote account 3's type was PROVEN on main. - layout_fields(..., occurrences=True): every occurrence a field, by name and subscript (COMM-ACC-TYPE(3), nested CELL(2,4)), with its OCCURS DEPENDING ON constraints; a COMMAREA is read by it, each side by its own ODO count (active_fields). A file's record names each occurrence (they were compared only as "bytes outside the layout"). - a scenario's COMMAREA is the whole record (it was cut at the first occurrence's end: INQACCCU's EIBCALEN was 123 of 1985 bytes, accounts 2..N written past it), every occurrence INITIALIZEd. - a LINKed task gets its COMMAREA's bytes too (CicsTask.withLinkArea); a port that takes them (a det port) is read from them; a DTO's values are the first occurrence (first_occurrences), the rest absent -- compared. - det: a DTO whose OCCURS fields appear once spans its declared record with or without a POINTER (LINK span, EIBCALEN), and RETURN / XCTL pass its bytes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MQNoe4wPJgr7dbUvs3DG6D
…4765) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MQNoe4wPJgr7dbUvs3DG6D
# Conflicts: # tests/equivalence/det_sweep_coverage.json
…hole; BMS OCCURS refused (#4778) - compare_dto: a group USING item is read by its whole layout, every occurrence by subscript; a port taking the items' bytes (det: withCallAreas) gives them back and they are compared as bytes (each FILLER too); a DTO-only port has every named field compared and its unnamed bytes listed as not compared, with the reason. - det Dto.size spans the declared record when it ends in a FILLER (CBSA CUSTCTRL, GenApp LGICVS01/LGIPVS01/...); COMMAREA FILLER compared as bytes when both sides are bytes, declared not compared against a DTO. - screen_layout refuses a symbolic map with OCCURS by name. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MQNoe4wPJgr7dbUvs3DG6D
…LLER compare (#4778) Numbers unchanged; harness fingerprints and measured_at refreshed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MQNoe4wPJgr7dbUvs3DG6D
# Conflicts: # gitgalaxy/tools/cobol_to_java/det/cics.py # tests/equivalence/det_sweep_coverage.json # tests/tools/equivalence_cics.py
Contributor
Full det sweep on the merged tree: 77 proven, the 3 baseline cases not; numbers unchanged, harness / oracle fingerprints refreshed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MQNoe4wPJgr7dbUvs3DG6D
# Conflicts: # tests/equivalence/det_sweep_coverage.json
# Conflicts: # tests/equivalence/det_sweep_coverage.json
# Conflicts: # tests/equivalence/det_sweep_coverage.json
# Conflicts: # tests/equivalence/det_sweep_coverage.json
…-swept next) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n, as expected; coverage unchanged) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 9, 2026
…its full det sweep Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TBJdDBRtJis5hzE244NQKV
Owner
Author
|
CI shepherd: this PR conflicts with main, so no checks ran. Merge |
1 similar comment
Owner
Author
|
CI shepherd: this PR conflicts with main, so no checks ran. Merge |
… split --base + update from the sweep Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TBJdDBRtJis5hzE244NQKV
Owner
Author
|
CI shepherd: this PR conflicts with main, so no checks ran. Merge |
…e; ledger re-applied from its sweeps Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TBJdDBRtJis5hzE244NQKV
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #4778. (Was stacked on #4772; that has merged and origin/main is merged in, so the diff is now only #4778.)
What changed
1. CALL USING / LINKAGE compare (
tests/tools/equivalence_call.compare_dto→compare_item)layout_fields(..., occurrences=True)). Every field and every occurrence is compared by name and subscript (PARM-AMT(3)).withCallAreas(byte[]...)(det/program.py). The harness passes each item's bytes beforehandleCall, BY REFERENCE, and the port gives back what it left there. These are compared like a record (common.diff_records): every field by value and then by bytes, each FILLER as bytes (FILLER@<offset>), and any byte no field covers. When bytes are passed they are what the program runs over; the DTO is still filled on the way out.withCallAreasis added toproof_reach.PROOF_ROOTS, because the harness calls it.not_comparedwith that reason.2. Trailing FILLER
det.cics.Dto.sizenow covers the whole declared record whenever the record is longer than the DTO's properties reach. This is no longer limited to OCCURS DTOs. It affects CBSACustctrlDfhcommarea(42→259 bytes) andAcctctrlDfhcommarea(46→98), and GenAppLgicvs01/Lgsetup/Lgwebst5(24→84) andLgipvs01(32→90). With the full size, a LINK passes those bytes, a RETURN or XCTL hands them on (DetCics.commareaOut), and EIBCALEN matches the record length.decode_record(..., unnamed=True)reads each FILLER as hex. FILLER is compared when both sides give bytes: the COBOL side always does, and the Java side does for a det port LINKed with the area or a COMMAREA longer than its DTO. When the Java side gives back a DTO, FILLER is declarednot_comparedwith the reason. An all-LOW-VALUES FILLER in a task that has no COMMAREA is undefined storage (X12) and is masked, like the named fields.3. BMS OCCURS:
screen_layoutrefuses a symbolic map with OCCURS (Unsupported: BMS OCCURS), because its screen compare would read only the first occurrence.test_no_case_map_has_occurs_todaychecks every case's maps, so the first map with OCCURS fails that test.Mutation proof (the weakness, shown)
The mutant is the det port of
mortgage-nbrvl, changed in two ways:EPSPARM-RETURN-ERROR.'X'into that field's last byte after the program runs.Results:
EPSNBRVL CALLS: 15/15 calls equal, proven.0/15 calls equal,EPS-NUMBER-VALIDATION.EPSPARM-RETURN-ERROR: cobol ' …' java ' …X', caught.Re-sweeps (on the merged tree)
proof_sweep.py --det-only(Db2 local): 77/80 proven. The 3 that are not proven are the baseline's (carddemo-cardupdate,carddemo-intcalc-generated,mortgage-mpmt). Result: "sweep: as expected", no newly failing case. FILLER is now compared incbsa-custctrl,cbsa-dbcrfunandcarddemo-cardupdate.proof_sweep.py --model-only: 28/28 proven, "as expected".det_coverage_ledger.py update): the numbers did not change. Only fingerprints were refreshed: harness, oracle, and cbsa-inqacccu's case.evidence.py status --ci: rc 0, so no record is blocking-stale. A harness change makes records stale only through the scheduled refresh.Gates
pr_gates.py --fastpasses 5/5 and--ratchetspasses 7/7 (JDK 17).🤖 Generated with Claude Code
https://claude.ai/code/session_01MQNoe4wPJgr7dbUvs3DG6D