Skip to content

det translator: model DECIMAL-POINT IS COMMA; document the refusals #4462 keeps (#4462) - #4666

Merged
squid-protocol merged 1 commit into
mainfrom
fix/4462-decimal-point-comma
Oct 8, 2026
Merged

squid-protocol merged 1 commit into
mainfrom
fix/4462-decimal-point-comma

Conversation

@squid-protocol

Copy link
Copy Markdown
Owner

Fixes #4462

What

Slice 5, the close-out of #4462: SPECIAL-NAMES DECIMAL-POINT IS COMMA is modelled. Every other remaining translator-refuses-* cause is kept on purpose, refused by name, and listed with its reason in docs/language_status/det_port_design.md.

Decisions per cause

cause decision
DECIMAL-POINT IS COMMA (ZINSBER) modelled (above). ZINSBER now stops at its next gap: a national letter in the data names GEBÜHR / BETRÄGE. It is refused by name, and #4664 is filed for it
national / DBCS text (KYUY*) kept. #4272 owns it. KYUYJP refuses by name with no UnicodeEncodeError (test_det_source_4462 pins it)
IDMS (LNIDMS01) kept, #4532
source defect (GenApp polloo2.cpy) kept: the source is defective
vendor copybooks (MQ CMQ*, LE CEEIGZCT) kept: the estate doesn't ship them
COPY ORDPRICE / COPY SHPRATE (ORDMAIN, SHPINQ, SHPINQO) a correct refusal by design. estate-crucible horror H-0053's key says "the estate holds no copybook ORDPRICE / SHPRATE, so no compiler finds it". Only a program source of that name exists. Engine copy resolution (#4468) reports the gap. The cause's side changes from translator to definitional

Ledger (fact_crosscheck.py update --corpus estate-crucible, then assign)

Evidence

  • New end-to-end program test_det_programs.py::DPCOMMA matches GnuCOBOL (cobc -std=ibm -fsign=EBCDIC) byte for byte in bytes, typed and groups modes. It runs ZINSBER's statements with ASCII names, plus zero suppression, a fixed and a floating sign, check protection, BLANK WHEN ZERO, de-editing, alphanumeric→zoned / packed / edited moves, NUMVAL and NUMVAL-C.
  • test_det_source_4462.py: unit tests for the literal rewrite and for layout and statements, plus the 1.5 refusal.
  • With EQUIVALENCE_E2E=1: test_det_programs + test_det_layout + test_det_translate gave 387 passed and 0 skipped. test_det_funcs gave 2 passed. test_det_sweep_fast, test_det_survey, test_det_port_check, test_det_parity, test_det_unmask and test_data_moves_decimal_comma_4355 all passed.
  • pr_gates.py --fast: 5/5 pass. pr_gates.py --ratchets: 7/7 pass, none skipped (cics-spec, ports, port-surface, estate, fact-crosscheck, completeness, ground-truth). Engine scans are untouched, so no golden master moves.

Found on the way

🤖 Generated with Claude Code

…4462 keeps

SPECIAL-NAMES DECIMAL-POINT IS COMMA (estate-crucible DEUT ZINSBER) was refused
whole. Now:
- source.comma_literals hands the grammar each numeric literal's decimal comma
  as a point, column for column (VALUE 1000,00, MOVE 0,5 TO T (2), -12,5);
  PICTUREs, literal text and names keep theirs. A `1.5` literal under the
  clause is refused by name.
- layout.Item.decimal_comma reads an edited PICTURE's `,` as its decimal point.
- gen emits Field...decimalComma(); the runtime's editing, de-editing and
  alphanumeric-to-numeric moves follow it (libcob's module decimal point);
  NUMVAL / NUMVAL-C read their argument with `.` and `,` swapped.

Proven against GnuCOBOL: test_det_programs DPCOMMA (bytes, typed, groups).
ZINSBER now stops at its next gap, a national letter in GEBUEHR's name (#4664,
refused by name). Ledger: ZINSBER's entry moves to that gap; ORDPRICE /
SHPRATE are refusals by design (H-0053): cause made definitional.
det_port_design.md lists the refusals kept deliberately.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

🐦‍⬛ Muninn Security Scan

✅ No security issues found.

🐦‍⬛ Powered by Muninn · Skald Lab

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant