From 0a049bb71f54f2cf2c9eae01e5fad2a3d4f741c7 Mon Sep 17 00:00:00 2001 From: squid-protocol Date: Fri, 6 Nov 2026 11:51:48 -0500 Subject: [PATCH 1/2] census: blockers and history name the copy members left out of the basis (Part of #7901, #7709) Co-Authored-By: Claude Sonnet 5.5 --- tests/tools/cics_census.py | 13 +++++++++ .../test_cics_census_copy_member_7901.py | 27 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/tests/tools/cics_census.py b/tests/tools/cics_census.py index 801ab3a1e..6e6e71026 100644 --- a/tests/tools/cics_census.py +++ b/tests/tools/cics_census.py @@ -623,6 +623,12 @@ def blockers(rows: dict[tuple[str, str], dict[str, Any]], only: set[tuple[str, s } +def note_copy_members(res: dict[str, Any], n: int) -> None: + """#7901: name the copy members the inventory listed and did not count (added only when there are some).""" + if n: + res["copy_members"] = n + + def non_burned_text(res: dict[str, Any]) -> str: """#6064: a --no-census run that counted no non-burned program (no local ones either) says `non-burned: not surveyed`, never `non-burned 0 / 0`.""" @@ -634,6 +640,9 @@ def non_burned_text(res: dict[str, Any]) -> str: def format_blockers(res: dict[str, Any], where: str, top: int = 0) -> str: out = [f"# blockers in {where}: {res['scope']}", f"translated whole: {res['whole']} / {res['programs']} ({non_burned_text(res)}); refused whole (no statements translated): {res['refused']}"] # fmt: skip + if res.get("copy_members"): + out.append(f"basis: {res['programs']} programs; {res['copy_members']} copy member(s) listed, not counted " + f"({COPY_MEMBER_REASON})") # fmt: skip if res.get("cics_programs_not_surveyed"): out.append( f"CICS programs with no survey row: {res['cics_programs_not_surveyed']} (a corpus left out of the run?)" @@ -681,6 +690,7 @@ def cmd_blockers(args: argparse.Namespace) -> int: res["census_surveyed"] = not args.no_census if only is not None: res["cics_programs_not_surveyed"] = len(only - set(rows)) + note_copy_members(res, len(load_copy_members(args.dir, args.label))) where = f"{args.dir}/{args.label}-*" if args.json: print(json.dumps(res, indent=1)) @@ -879,6 +889,7 @@ def baseline_blockers(d: Path, all_programs: bool = False, census: bool | None = res["census_surveyed"] = census if only is not None: res["cics_programs_not_surveyed"] = len(only - set(rows)) + note_copy_members(res, len(load_copy_members(d, "before"))) return res @@ -1062,6 +1073,8 @@ def history_entry(res: dict[str, Any], sha: str, date: str, pr: int, note: str | "refused_whole": res["refused"], "top_gaps": top, "scope": scope} # fmt: skip if res.get("census_surveyed") is False and not nb: # #6064: not 0 / 0 -- the census was not surveyed entry |= {"whole_non_burned": None, "total_non_burned": None, "census_surveyed": False} + if res.get("copy_members"): + entry["copy_members"] = res["copy_members"] if note: entry["note"] = note return entry diff --git a/tests/tools/test_cics_census_copy_member_7901.py b/tests/tools/test_cics_census_copy_member_7901.py index 69189a365..e3e5fb894 100644 --- a/tests/tools/test_cics_census_copy_member_7901.py +++ b/tests/tools/test_cics_census_copy_member_7901.py @@ -83,3 +83,30 @@ def test_program_without_program_id_keeps_a_program_row(): rows = {"c": [{"program": "B.cbl", "error": "UnitRefused: no PROGRAM-ID"}]} assert cc.copy_member_reason(NO_PROGRAM_ID) is None assert "| c | 1 | 0 | 0 | 1 |" in ds.markdown(rows) + + +def _copy_survey(tmp_path, with_copy=True): + d = tmp_path / "before-b" + d.mkdir() + rows = [{"program": "A.cbl", "statements": 1}] + if with_copy: + rows.append({"program": "REC.cbl", "copy_member": cc.COPY_MEMBER_REASON}) + (d / "survey.json").write_text(json.dumps({"c": rows}), encoding="utf-8") + return cc.blockers(cc.load_surveys(tmp_path, "before")) + + +def test_blockers_name_the_copy_member_basis(tmp_path): + res = _copy_survey(tmp_path) + cc.note_copy_members(res, len(cc.load_copy_members(tmp_path, "before"))) + res["scope"] = "every surveyed program" + assert res["programs"] == 1 and res["copy_members"] == 1 + assert "basis: 1 programs; 1 copy member(s) listed, not counted" in cc.format_blockers(res, "x") + assert cc.history_entry(res, "abc", "2026-11-06", 1, None, "s")["copy_members"] == 1 + + +def test_blockers_have_no_copy_member_key_when_none(tmp_path): + res = _copy_survey(tmp_path, with_copy=False) + cc.note_copy_members(res, len(cc.load_copy_members(tmp_path, "before"))) + res["scope"] = "every surveyed program" + assert "copy_members" not in res and "basis:" not in cc.format_blockers(res, "x") + assert "copy_members" not in cc.history_entry(res, "abc", "2026-11-06", 1, None, "s") From 5b4bf34aab979cda33c7ac71ebd83416752cccb5 Mon Sep 17 00:00:00 2001 From: squid-protocol Date: Fri, 6 Nov 2026 12:04:08 -0500 Subject: [PATCH 2/2] census: T9 re-survey on the 39 basis (Part of #7901, #7709) Co-Authored-By: Claude Sonnet 5.5 --- docs/language_status/blockers_history.jsonl | 1 + docs/language_status/gap_prevalence.md | 64 ++++---- .../gap_prevalence/census_summary.json | 152 +++++++++--------- 3 files changed, 109 insertions(+), 108 deletions(-) diff --git a/docs/language_status/blockers_history.jsonl b/docs/language_status/blockers_history.jsonl index 210b3d075..29e0f1a8c 100644 --- a/docs/language_status/blockers_history.jsonl +++ b/docs/language_status/blockers_history.jsonl @@ -14,3 +14,4 @@ {"pr": 4608, "main_sha": "f54d746d56dd1223eb2db7d365e3e2f90a5c3127", "date": "2026-10-07T19:57:59Z", "whole": 76, "total": 125, "whole_burned": 71, "total_burned": 104, "whole_non_burned": 5, "total_non_burned": 21, "refused_whole": 12, "top_gaps": [{"gap": "refused: LayoutError: source defect: source text past column N (…) cuts a literal open: fixed-form COBOL reads columns N", "only": 7, "only_burned": 0, "only_non_burned": 7, "refuses_program": true}, {"gap": "missing copybook CMQGMOV", "only": 2, "only_burned": 2, "only_non_burned": 0, "refuses_program": true}, {"gap": "EXEC CICS FORMATTIME RESP", "only": 1, "only_burned": 0, "only_non_burned": 1, "refuses_program": false}, {"gap": "missing copybook BAQRINFO", "only": 1, "only_burned": 0, "only_non_burned": 1, "refuses_program": true}, {"gap": "EXEC CICS (no reason given)", "only": 1, "only_burned": 1, "only_non_burned": 0, "refuses_program": false}], "scope": "burned + local + census corpora"} {"pr": 4627, "main_sha": "f8408bf6e4b3490fee2b0b9bda3de72ec07fb4fb", "date": "2026-10-07T19:58:16Z", "whole": 76, "total": 125, "whole_burned": 71, "total_burned": 104, "whole_non_burned": 5, "total_non_burned": 21, "refused_whole": 12, "top_gaps": [{"gap": "refused: LayoutError: source defect: source text past column N (…) cuts a literal open: fixed-form COBOL reads columns N", "only": 7, "only_burned": 0, "only_non_burned": 7, "refuses_program": true}, {"gap": "missing copybook CMQGMOV", "only": 2, "only_burned": 2, "only_non_burned": 0, "refuses_program": true}, {"gap": "EXEC CICS FORMATTIME RESP", "only": 1, "only_burned": 0, "only_non_burned": 1, "refuses_program": false}, {"gap": "missing copybook BAQRINFO", "only": 1, "only_burned": 0, "only_non_burned": 1, "refuses_program": true}, {"gap": "EXEC CICS (no reason given)", "only": 1, "only_burned": 1, "only_non_burned": 0, "refuses_program": false}], "scope": "burned + local + census corpora"} {"pr": 4636, "main_sha": "b72819c4099b8aafac4242f82a19385a7f43225b", "date": "2026-10-07T20:08:37Z", "whole": 78, "total": 125, "whole_burned": 73, "total_burned": 104, "whole_non_burned": 5, "total_non_burned": 21, "refused_whole": 12, "top_gaps": [{"gap": "refused: LayoutError: source defect: source text past column N (…) cuts a literal open: fixed-form COBOL reads columns N", "only": 7, "only_burned": 0, "only_non_burned": 7, "refuses_program": true}, {"gap": "missing copybook CMQGMOV", "only": 2, "only_burned": 2, "only_non_burned": 0, "refuses_program": true}, {"gap": "EXEC CICS FORMATTIME RESP", "only": 1, "only_burned": 0, "only_non_burned": 1, "refuses_program": false}, {"gap": "missing copybook BAQRINFO", "only": 1, "only_burned": 0, "only_non_burned": 1, "refuses_program": true}, {"gap": "EXEC CICS (no reason given)", "only": 1, "only_burned": 1, "only_non_burned": 0, "refuses_program": false}], "scope": "burned + local + census corpora"} +{"pr": 7901, "main_sha": "7dc1d01384cc3f2151378640581036ff9173108e", "date": "2026-11-06T16:46:19Z", "whole": 113, "total": 127, "whole_burned": 105, "total_burned": 106, "whole_non_burned": 8, "total_non_burned": 21, "refused_whole": 8, "top_gaps": [{"gap": "refused: LayoutError: source defect: source text past column N (…) cuts a literal open: fixed-form COBOL reads columns N", "only": 7, "only_burned": 0, "only_non_burned": 7, "refuses_program": true}, {"gap": "EXEC CICS WEB CONVERSE POST", "only": 1, "only_burned": 0, "only_non_burned": 1, "refuses_program": false}, {"gap": "missing copybook BAQRINFO", "only": 1, "only_burned": 0, "only_non_burned": 1, "refuses_program": true}, {"gap": "MOVE an alphanumeric literal holds a character beyond the single-byte code page (…): its bytes and length depend on how the source reached the compiler", "only": 0, "only_burned": 0, "only_non_burned": 0, "refuses_program": false}, {"gap": "STRING sender , PIC (…): a numeric item with a P or a decimal place is a compile error in Enterprise COBOL", "only": 0, "only_burned": 0, "only_non_burned": 0, "refuses_program": false}], "scope": "burned + local + census corpora", "copy_members": 1, "note": "T9 re-survey; census basis 40 -> 39 (copy member listed, not counted; owner ruling 2026-11-06, #7709)"} diff --git a/docs/language_status/gap_prevalence.md b/docs/language_status/gap_prevalence.md index adc18c103..bd25eb9fb 100644 --- a/docs/language_status/gap_prevalence.md +++ b/docs/language_status/gap_prevalence.md @@ -12,7 +12,7 @@ One ranking over both scopes, highest estate coverage first; estates and program | gap | scope | estates | programs | e0 | e1 | e2 | e3 | e4 | none | status | owner | |---|---|---|---|---|---|---|---|---|---|---|---| -| `: undeclared item` | C | 3 | 5 | 0 | 0 | 3 | 0 | 1 | 1 | named source defect | #7647 (source defect: no declaration in the member, its clone or a COPY) | +| `: undeclared item` | C | 2 | 4 | 0 | 0 | 3 | 0 | 0 | 1 | named source defect | #7647 (source defect: no declaration in the member, its clone or a COPY) | | `refused: generation: ISPF editor screen, not a COBOL program` | C | 2 | 2 | 0 | 0 | 0 | 0 | 0 | 2 | refused by name | #4735 (source defect: no COBOL in the estate) | | `refused: LayoutError: source defect: text past column 72` | C | 1 | 9 | 0 | 0 | 9 | 0 | 0 | 0 | refused by name | none (a source defect in the estate's own text, #4735; not an engine gap) | | `missing copybook: clone defect (not in the clone)` | C | 1 | 7 | 0 | 0 | 7 | 0 | 0 | 0 | named source defect | #7709 (source defect: the estate COPYs a member it never published, a fault of the clone, not the translator) | @@ -27,22 +27,21 @@ One ranking over both scopes, highest estate coverage first; estates and program | `EPSCSMRI: no service of its own, its translation is refused: epscsmrd.cbl:N: the PICTURE N (…) is not modelled (…): the translator reads one byte a character` | B | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | not modelled | #4272 | | `EPSCSMRO: no service of its own, its translation is refused: LE recovery point: SERVICE LABEL (…): the resume point after , not BLL addressing: not modelled` | B | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | not modelled | #5106 (le-condition-handling) | | `EXEC CICS SOAPFAULT CREATE` | B | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | not modelled | #4270 (cics-command-slice) | -| `EXEC CICS WEB CONVERSE URIMAP POST` | C | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | not modelled | #7525 | -| `EXEC CICS WEB WRITE HTTPHEADER SESSTOKEN` | C | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | not modelled | #7525 | +| `EXEC CICS WEB CONVERSE POST` | C | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | not modelled | #7525 | | `PERFORM: undeclared paragraph` | C | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | named source defect | #7647 (source defect: no such paragraph in the program or its clone) | | `SET TO ENTRY: procedure / function pointers are not modelled` | B | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | not modelled | #5106 | | `STRING: literal beyond the single-byte code page` | C | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | named source defect | #7526 (source defect: no single-byte EBCDIC code page holds the character, so the source as stored is no input an IBM compiler reads; the translator refuses the statement, register D4) | | `other` | C | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | not modelled | unowned | | `refused: ExprError: PROCEDURE DIVISION does not parse` | C | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | refused by name | #7709 (source defect: a comment banner whose asterisks start in column 8, not the indicator column 7, is text to a fixed-form compiler, so Enterprise COBOL rejects the program too; with the banner moved to column 7 the same procedure text parses, so the grammar is not at fault; census T4, #7847) | -Coverage if closed, programs that translate whole after the highest-ranked gaps (from 137 today): top 1: 139 / 168 (82.7%), top 3: 150 / 168 (89.3%, upper bound), top 5: 159 / 168 (94.6%, upper bound), top 10: 163 / 168 (97.0%, upper bound). +Coverage if closed, programs that translate whole after the highest-ranked gaps (from 137 today): top 1: 138 / 168 (82.1%), top 3: 149 / 168 (88.7%, upper bound), top 5: 158 / 168 (94.0%, upper bound), top 10: 162 / 168 (96.4%, upper bound). | top N gaps closed | programs whole | share | bound | |---|---|---|---| -| 1 | 139 / 168 | 82.7% | exact | -| 3 | 150 / 168 | 89.3% | upper | -| 5 | 159 / 168 | 94.6% | upper | -| 10 | 163 / 168 | 97.0% | upper | +| 1 | 138 / 168 | 82.1% | exact | +| 3 | 149 / 168 | 88.7% | upper | +| 5 | 158 / 168 | 94.0% | upper | +| 10 | 162 / 168 | 96.4% | upper | Close-next order (greedy: each step closes the gap that makes the most further programs whole, given the steps before it): @@ -50,13 +49,14 @@ Close-next order (greedy: each step closes the gap that makes the most further p |---|---|---|---|---|---|---|---|---|---|---|---| | 1 | `refused: LayoutError: source defect: text past column 72` | 9 | 0 | 0 | 9 | 0 | 0 | 0 | 146 / 168 | 86.9% | upper | | 2 | `missing copybook: clone defect (not in the clone)` | 7 | 0 | 0 | 7 | 0 | 0 | 0 | 153 / 168 | 91.1% | upper | -| 3 | `: undeclared item` | 2 | 0 | 0 | 0 | 0 | 1 | 1 | 155 / 168 | 92.3% | upper | -| 4 | `refused: generation: ISPF editor screen, not a COBOL program` | 2 | 0 | 0 | 0 | 0 | 0 | 2 | 157 / 168 | 93.5% | upper | -| 5 | `: is not defined in a record of file ` | 2 | 0 | 0 | 0 | 2 | 0 | 0 | 159 / 168 | 94.6% | upper | -| 6 | `missing copybook: z/OS Connect product` | 2 | 0 | 0 | 1 | 0 | 1 | 0 | 161 / 168 | 95.8% | upper | -| 7 | `EXEC CICS map: no field` | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 162 / 168 | 96.4% | upper | -| 8 | `PERFORM: undeclared paragraph` | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 163 / 168 | 97.0% | upper | -| 9 | `refused: ExprError: PROCEDURE DIVISION does not parse` | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 164 / 168 | 97.6% | upper | +| 3 | `refused: generation: ISPF editor screen, not a COBOL program` | 2 | 0 | 0 | 0 | 0 | 0 | 2 | 155 / 168 | 92.3% | upper | +| 4 | `: is not defined in a record of file ` | 2 | 0 | 0 | 0 | 2 | 0 | 0 | 157 / 168 | 93.5% | upper | +| 5 | `missing copybook: z/OS Connect product` | 2 | 0 | 0 | 1 | 0 | 1 | 0 | 159 / 168 | 94.6% | upper | +| 6 | `: undeclared item` | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 160 / 168 | 95.2% | upper | +| 7 | `EXEC CICS map: no field` | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 161 / 168 | 95.8% | upper | +| 8 | `EXEC CICS WEB CONVERSE POST` | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 162 / 168 | 96.4% | upper | +| 9 | `PERFORM: undeclared paragraph` | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 163 / 168 | 97.0% | upper | +| 10 | `other` | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 164 / 168 | 97.6% | upper | ## Burned estates (6 estates, 129 programs, 126 translate whole today) @@ -95,15 +95,15 @@ Needs several gaps together (1 program the order above leaves out: each turns wh Counted by tools only; non-burned estates keep their first-contact numbers. Aggregates under opaque `census-*` labels: no program, table or copybook name is kept, and a gap key that could carry one is collapsed to its class (`scrub_key`). -Coverage if closed, programs that translate whole after the highest-ranked gaps (from 11 today): top 1: 13 / 39 (33.3%), top 3: 24 / 39 (61.5%, upper bound), top 5: 32 / 39 (82.0%, upper bound), top 10: 35 / 39 (89.7%, upper bound). +Coverage if closed, programs that translate whole after the highest-ranked gaps (from 11 today): top 1: 12 / 39 (30.8%), top 3: 23 / 39 (59.0%, upper bound), top 5: 31 / 39 (79.5%, upper bound), top 10: 36 / 39 (92.3%, upper bound). Copy members: 1 listed, not counted in the 39 programs (no IDENTIFICATION / PROCEDURE DIVISION and no PROGRAM-ID: data description entries only; owner ruling 2026-11-06, #7709: the census basis is the programs alone). -Accounted today (whole, or every gap a named source defect): 36 / 39. +Accounted today (whole, or every gap a named source defect): 35 / 39. | gap | estates | programs | e0 | e1 | e2 | e3 | e4 | none | status | owner | |---|---|---|---|---|---|---|---|---|---|---| -| `: undeclared item` | 3 | 5 | 0 | 0 | 3 | 0 | 1 | 1 | named source defect | #7647 (source defect: no declaration in the member, its clone or a COPY) | +| `: undeclared item` | 2 | 4 | 0 | 0 | 3 | 0 | 0 | 1 | named source defect | #7647 (source defect: no declaration in the member, its clone or a COPY) | | `refused: generation: ISPF editor screen, not a COBOL program` | 2 | 2 | 0 | 0 | 0 | 0 | 0 | 2 | refused by name | #4735 (source defect: no COBOL in the estate) | | `refused: LayoutError: source defect: text past column 72` | 1 | 9 | 0 | 0 | 9 | 0 | 0 | 0 | refused by name | none (a source defect in the estate's own text, #4735; not an engine gap) | | `missing copybook: clone defect (not in the clone)` | 1 | 7 | 0 | 0 | 7 | 0 | 0 | 0 | named source defect | #7709 (source defect: the estate COPYs a member it never published, a fault of the clone, not the translator) | @@ -111,8 +111,7 @@ Accounted today (whole, or every gap a named source defect): 36 / 39. | `MOVE: literal beyond the single-byte code page` | 1 | 2 | 0 | 0 | 2 | 0 | 0 | 0 | named source defect | #7526 (source defect: no single-byte EBCDIC code page holds the character, so the source as stored is no input an IBM compiler reads; the translator refuses the statement, register D4) | | `STRING: numeric sender with P or a decimal place` | 1 | 2 | 0 | 0 | 2 | 0 | 0 | 0 | named source defect | #7523 (source defect: a numeric STRING sender must be an integer without a P, a compile error in Enterprise COBOL) | | `missing copybook: z/OS Connect product` | 1 | 2 | 0 | 0 | 1 | 0 | 1 | 0 | unknown | #7709 (product copybook frontier: no runtime modelled; IBM's copybooks are never shipped) | -| `EXEC CICS WEB CONVERSE URIMAP POST` | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | not modelled | #7525 | -| `EXEC CICS WEB WRITE HTTPHEADER SESSTOKEN` | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | not modelled | #7525 | +| `EXEC CICS WEB CONVERSE POST` | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | not modelled | #7525 | | `PERFORM: undeclared paragraph` | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | named source defect | #7647 (source defect: no such paragraph in the program or its clone) | | `STRING: literal beyond the single-byte code page` | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | named source defect | #7526 (source defect: no single-byte EBCDIC code page holds the character, so the source as stored is no input an IBM compiler reads; the translator refuses the statement, register D4) | | `other` | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | not modelled | unowned | @@ -120,10 +119,10 @@ Accounted today (whole, or every gap a named source defect): 36 / 39. | top N gaps closed | programs whole | share | bound | |---|---|---|---| -| 1 | 13 / 39 | 33.3% | exact | -| 3 | 24 / 39 | 61.5% | upper | -| 5 | 32 / 39 | 82.0% | upper | -| 10 | 35 / 39 | 89.7% | upper | +| 1 | 12 / 39 | 30.8% | exact | +| 3 | 23 / 39 | 59.0% | upper | +| 5 | 31 / 39 | 79.5% | upper | +| 10 | 36 / 39 | 92.3% | upper | Close-next order (greedy: each step closes the gap that makes the most further programs whole, given the steps before it): @@ -131,17 +130,18 @@ Close-next order (greedy: each step closes the gap that makes the most further p |---|---|---|---|---|---|---|---|---|---|---|---| | 1 | `refused: LayoutError: source defect: text past column 72` | 9 | 0 | 0 | 9 | 0 | 0 | 0 | 20 / 39 | 51.3% | upper | | 2 | `missing copybook: clone defect (not in the clone)` | 7 | 0 | 0 | 7 | 0 | 0 | 0 | 27 / 39 | 69.2% | upper | -| 3 | `: undeclared item` | 2 | 0 | 0 | 0 | 0 | 1 | 1 | 29 / 39 | 74.4% | upper | -| 4 | `refused: generation: ISPF editor screen, not a COBOL program` | 2 | 0 | 0 | 0 | 0 | 0 | 2 | 31 / 39 | 79.5% | upper | -| 5 | `missing copybook: z/OS Connect product` | 2 | 0 | 0 | 1 | 0 | 1 | 0 | 33 / 39 | 84.6% | upper | -| 6 | `EXEC CICS map: no field` | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 34 / 39 | 87.2% | upper | -| 7 | `PERFORM: undeclared paragraph` | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 35 / 39 | 89.7% | upper | -| 8 | `refused: ExprError: PROCEDURE DIVISION does not parse` | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 36 / 39 | 92.3% | upper | +| 3 | `refused: generation: ISPF editor screen, not a COBOL program` | 2 | 0 | 0 | 0 | 0 | 0 | 2 | 29 / 39 | 74.4% | upper | +| 4 | `missing copybook: z/OS Connect product` | 2 | 0 | 0 | 1 | 0 | 1 | 0 | 31 / 39 | 79.5% | upper | +| 5 | `: undeclared item` | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 32 / 39 | 82.0% | upper | +| 6 | `EXEC CICS map: no field` | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 33 / 39 | 84.6% | upper | +| 7 | `EXEC CICS WEB CONVERSE POST` | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 34 / 39 | 87.2% | upper | +| 8 | `PERFORM: undeclared paragraph` | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 35 / 39 | 89.7% | upper | +| 9 | `other` | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 36 / 39 | 92.3% | upper | +| 10 | `refused: ExprError: PROCEDURE DIVISION does not parse` | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 37 / 39 | 94.9% | upper | -Needs several gaps together (3 programs the order above leaves out: each turns whole only when every gap in its row is closed): +Needs several gaps together (2 programs the order above leaves out: each turns whole only when every gap in its row is closed): | gaps closed together | programs | estates | e0 | e1 | e2 | e3 | e4 | none | bound | |---|---|---|---|---|---|---|---|---|---| | `MOVE: literal beyond the single-byte code page`; `STRING: numeric sender with P or a decimal place` | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | exact | -| `EXEC CICS WEB CONVERSE URIMAP POST`; `EXEC CICS WEB WRITE HTTPHEADER SESSTOKEN`; `other` | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | exact | | `MOVE: literal beyond the single-byte code page`; `STRING: literal beyond the single-byte code page`; `STRING: numeric sender with P or a decimal place` | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | exact | diff --git a/tests/fixtures/gap_prevalence/census_summary.json b/tests/fixtures/gap_prevalence/census_summary.json index 0f2c664ac..3b9a1b3c0 100644 --- a/tests/fixtures/gap_prevalence/census_summary.json +++ b/tests/fixtures/gap_prevalence/census_summary.json @@ -1,5 +1,5 @@ { - "accounted_now": 36, + "accounted_now": 35, "by_era_programs": { "0": 0, "1": 1, @@ -46,10 +46,10 @@ "1": 0, "2": 0, "3": 0, - "4": 1, - "none": 1 + "4": 0, + "none": 2 }, - "gap": ": undeclared item", + "gap": "refused: generation: ISPF editor screen, not a COBOL program", "share": 0.7436, "upper_bound": true, "whole": 29 @@ -59,27 +59,42 @@ "gained_by_era": { "0": 0, "1": 0, - "2": 0, + "2": 1, "3": 0, - "4": 0, - "none": 2 + "4": 1, + "none": 0 }, - "gap": "refused: generation: ISPF editor screen, not a COBOL program", + "gap": "missing copybook: z/OS Connect product", "share": 0.7949, "upper_bound": true, "whole": 31 }, { - "gained": 2, + "gained": 1, + "gained_by_era": { + "0": 0, + "1": 0, + "2": 0, + "3": 0, + "4": 0, + "none": 1 + }, + "gap": ": undeclared item", + "share": 0.8205, + "upper_bound": true, + "whole": 32 + }, + { + "gained": 1, "gained_by_era": { "0": 0, "1": 0, "2": 1, "3": 0, - "4": 1, + "4": 0, "none": 0 }, - "gap": "missing copybook: z/OS Connect product", + "gap": "EXEC CICS map: no field", "share": 0.8462, "upper_bound": true, "whole": 33 @@ -89,12 +104,12 @@ "gained_by_era": { "0": 0, "1": 0, - "2": 1, + "2": 0, "3": 0, - "4": 0, + "4": 1, "none": 0 }, - "gap": "EXEC CICS map: no field", + "gap": "EXEC CICS WEB CONVERSE POST", "share": 0.8718, "upper_bound": true, "whole": 34 @@ -114,6 +129,21 @@ "upper_bound": true, "whole": 35 }, + { + "gained": 1, + "gained_by_era": { + "0": 0, + "1": 0, + "2": 0, + "3": 0, + "4": 1, + "none": 0 + }, + "gap": "other", + "share": 0.9231, + "upper_bound": true, + "whole": 36 + }, { "gained": 1, "gained_by_era": { @@ -125,36 +155,36 @@ "none": 1 }, "gap": "refused: ExprError: PROCEDURE DIVISION does not parse", - "share": 0.9231, + "share": 0.9487, "upper_bound": true, - "whole": 36 + "whole": 37 } ], "copy_members": 1, "coverage_if_closed": [ { - "share": 0.3333, + "share": 0.3077, "top": 1, "upper_bound": false, - "whole": 13 + "whole": 12 }, { - "share": 0.6154, + "share": 0.5897, "top": 3, "upper_bound": true, - "whole": 24 + "whole": 23 }, { - "share": 0.8205, + "share": 0.7949, "top": 5, "upper_bound": true, - "whole": 32 + "whole": 31 }, { - "share": 0.8974, + "share": 0.9231, "top": 10, "upper_bound": true, - "whole": 35 + "whole": 36 } ], "estates": [ @@ -176,21 +206,21 @@ "1": 0, "2": 3, "3": 0, - "4": 1, + "4": 0, "none": 1 }, - "estates": 3, + "estates": 2, "estates_by_era": { "0": 0, "1": 0, "2": 2, "3": 0, - "4": 1, + "4": 0, "none": 1 }, "gap": ": undeclared item", "owner": "#7647 (source defect: no declaration in the member, its clone or a COPY)", - "programs": 5, + "programs": 4, "refuses_program": false, "status": "named source defect" }, @@ -380,31 +410,7 @@ "4": 1, "none": 0 }, - "gap": "EXEC CICS WEB CONVERSE URIMAP POST", - "owner": "#7525", - "programs": 1, - "refuses_program": false, - "status": "not modelled" - }, - { - "by_era": { - "0": 0, - "1": 0, - "2": 0, - "3": 0, - "4": 1, - "none": 0 - }, - "estates": 1, - "estates_by_era": { - "0": 0, - "1": 0, - "2": 0, - "3": 0, - "4": 1, - "none": 0 - }, - "gap": "EXEC CICS WEB WRITE HTTPHEADER SESSTOKEN", + "gap": "EXEC CICS WEB CONVERSE POST", "owner": "#7525", "programs": 1, "refuses_program": false, @@ -525,24 +531,6 @@ "programs": 1, "upper_bound": false }, - { - "by_era": { - "0": 0, - "1": 0, - "2": 0, - "3": 0, - "4": 1, - "none": 0 - }, - "estates": 1, - "gaps": [ - "EXEC CICS WEB CONVERSE URIMAP POST", - "EXEC CICS WEB WRITE HTTPHEADER SESSTOKEN", - "other" - ], - "programs": 1, - "upper_bound": false - }, { "by_era": { "0": 0, @@ -571,13 +559,13 @@ "1": 0, "2": 0, "3": 0, - "4": 1, + "4": 0, "none": 1 }, "gaps": [ ": undeclared item" ], - "programs": 2 + "programs": 1 }, { "by_era": { @@ -637,9 +625,7 @@ "none": 0 }, "gaps": [ - "EXEC CICS WEB CONVERSE URIMAP POST", - "EXEC CICS WEB WRITE HTTPHEADER SESSTOKEN", - "other" + "EXEC CICS WEB CONVERSE POST" ], "programs": 1 }, @@ -686,6 +672,20 @@ ], "programs": 2 }, + { + "by_era": { + "0": 0, + "1": 0, + "2": 0, + "3": 0, + "4": 1, + "none": 0 + }, + "gaps": [ + "other" + ], + "programs": 1 + }, { "by_era": { "0": 0,