Repository navigation
det: LINK RESP2; RETURN/LINK COMMAREA LENGTH past the DTO passes the bytes; opaque bytes passed on (#4679) - #4694
Merged
Conversation
…ailed XCTL sets RESP2 (#4501) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…O passes the bytes; opaque bytes passed on (#4679) - LINK stores RESP2 from its condition (DetCics.linkResp2: LENGERR 11, PGMIDERR 1), as XCTL does since #4501. - RETURN TRANSID COMMAREA with a LENGTH past the DTO passes those bytes (DetCics.commareaOut), as XCTL; the equivalence harness reads a byte[] COMMAREA by the case's layout (equivalence_cics.java_commarea). - LINK with a LENGTH past the target's DTO lays that many bytes over the caller's storage (Cobol.commarea), capped at 32763. - A receiver keeps the bytes past its DFHCOMMAREA record (Storage.beyond); a further RETURN / XCTL / LINK of the area passes them on. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
…a-link-lengths undefined-program) (#4679) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rged) Conflicts resolved as a 3-way merge against #4678's own commit (c719d88, identical to its squash on main for these files): det/cics.py, DetCics.java, program.py and oracle_assumptions.md merge cleanly that way. Tests: keep this PR's RETURN-past-the-DTO assertion and #4679 tests next to main's new tests (integer literal vs alphanumeric; SQL ids). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MQNoe4wPJgr7dbUvs3DG6D
…COBOL side's (#4679 x #4635) #4635 (#4660) reads the COBOL side's RETURN COMMAREA exact (LOW-VALUES apart from spaces); #4679's Java byte[] COMMAREA went through decode_record without it, so COCRDLIC's MOVE LOW-VALUES TO WS-ALL-ROWS read as '' on the Java side against the COBOL side's NULs: cardlist, acctupdate, cotrtlic, cotrtupc not proven after the merge. Same bytes on both sides; now decoded the same way. Re-swept: as expected. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MQNoe4wPJgr7dbUvs3DG6D
squid-protocol
marked this pull request as ready for review
October 8, 2026 18:37
squid-protocol
added a commit
that referenced
this pull request
Oct 8, 2026
expr.py: keep this PR's NumLit (a numeric literal keeps its spelling) and main's module-level DFHRESP import; #4654's Lit.text (the literal as written, for det/osvs.py's literal identity) becomes a property read from the NumLit's spelling instead of a second copy of it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MQNoe4wPJgr7dbUvs3DG6D
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.
Stacked on #4678 -- merge that first (once it merges, a rebase drops its commit). Fixes #4679. Part of #4270.
Decisions (IBM refs)
DetCics.linkResp2(condition): LENGERR 11 (COMMAREA length < 0 or > 32763), PGMIDERR 1 (no installed definition, autoinstall off). IBM EXEC CICS LINK conditions. These are the only twoCicsTask.linkand the stub'sGGCLINK(ggcics.c) raise, with the same RESP2. The region never raises IBM's other LINK conditions (PGMIDERR 2/3, NOTAUTH 101, INVREQ, ROLLEDBACK, SYSIDERR, TERMERR), so they are not mapped. The XCTL mapping from det: XCTL COMMAREA LENGTH past the DTO passes those bytes; failed XCTL sets RESP2 (#4501) #4678 is reused, not duplicated.DetCics.commareaOut), as det: XCTL COMMAREA LENGTH past the DTO passes those bytes; failed XCTL sets RESP2 (#4501) #4678's XCTL does. IBM EXEC CICS RETURN: the next program's EIBCALEN is LENGTH. On the harness side,equivalence_cics.java_commareareads a byte[] COMMAREA (Jackson base64, CCSID 037) the way it reads the stub's RETURN area: in the case's data page, by the case's COMMAREA layout (decode_record). Bytes past the layout are compared on neither side. This is what broke the CardDemo ports in det: XCTL COMMAREA LENGTH past the DTO passes those bytes; failed XCTL sets RESP2 (#4501) #4678 (from_javacannot read a byte[]).Cobol.commarea, capped at 32763), not just the DTO's size. IBM EXEC CICS LINK: LENGTH is the COMMAREA length, passed by reference. Example: GenApp's LGxxVS01 LINKERROR-MSGLENGTH 101 to LGSTSQ, whose DTO is 99 bytes.undefined-program: CALINK -> CAGONE, not in the CSD) is no longer a hole. The COMMAREA travels as its bytes (DetCics.commareaBytes), so the case now proves PGMIDERR RESP2 1 end to end.Storage.beyond(from a byte[] COMMAREA or a LINK's area). A further RETURN, XCTL or LINK of that area with the LENGTH passes them on (commareaOut/Cobol.commarearead them). A LINK target's writes there go back by reference (Cobol.commareaBack, the receiver's caBack).oracle_assumptions.mdX10: the det: XCTL COMMAREA LENGTH past the DTO passes those bytes; failed XCTL sets RESP2 (#4501) #4678 note is extended with all of the above.Touched
det/cics.py(LINK branch,commarea_out),det/program.py(DFHCOMMAREA receiver),cobolrt/Storage.java(beyond),cobolrt/Cobol.java(beyond,commarea,commareaBack),cobolrt/cics/DetCics.java(linkResp2,commareaBytes,commareaOut),tests/tools/equivalence_cics.py(java_commarea),docs/language_status/oracle_assumptions.md, tests intest_det_translate.py(translator shapes plus a javac/java runtime test forbeyondpass-through and write-back) andtest_equivalence_cics.py.Evidence
det_port.py checkvsorigin/fix/4501-xctl-commarea-length: all 68 ports change (runtime files). Every one was re-proved withproof_sweep.py --det-only(Db2 included): 65 PROVED, "sweep: as expected". The 3 not proven are exactlydet_sweep_baseline.json: cardupdate (Porting loop at scale: baseline-reuse proofs, run-many, adopt; COCRDUPC recorded as not proven #4085, onlycommarea.CARD-UPDATE-CVV-CDdiffers), intcalc-generated (D1), mpmt (COBOL oracle/translator: floating point and compiler options (COMP-1/2 hex float, NUMPROC, ARITH(EXTEND), TRUNC(OPT), INTDATE, COMP-5 byte order) #4271).commareaByteshelper to these 68 ports (a seconddet_port.py checkshows no service change), so they were not re-swept.cics_case_ports.py+cics_crucible.py --sides cobol-stub java-ported): ca-link-lengths 8/8, 0 holes (was 1 hole and 1 fail), ca-xctl-versions 8/8, hc-abend-link 10/10.evidence.py status --cipasses. No record's port, case, pin or declared differences changed; harness/generator staleness is left to the scheduled refresh (An evidence record per ported program: the claim, the oracle, provenance, approval, staleness #4048).evidence_report.py --refreshproduced no diff,--checkpasses,test_evidence.py+test_evidence_report.py71 passed.test_det_translate.py260 passed (JDK 17, no skips);test_equivalence_cics.py102 passed, 2 skipped (E2E).pr_gates.py --fast5/5.--ratchets7 pass, 0 fail, 0 skipped (JDK 17 env).Overlaps
java_commareacallsdecode_record(data, ca_fields, enc)exactly as the COBOL side's RETURN/XCTL decode does. When equivalence: CICS proofs compare DISPLAY output and keep low-values apart from spaces (#4635) #4660 lands, give the byte[] path the sameexact=Trueso LOW-VALUES are not spaces and only trailing spaces drop. Expect a small textual conflict in_java_events.task.resp2()): LINK's RESP2 comes from its condition, as XCTL's does. If CicsTask grows a per-command RESP2, LINK can switch to it.byte[]fromhandleTransaction.🤖 Generated with Claude Code