Repository navigation
Description
Owner request 2026-11-04: treat the 40 census programs (9 public repos excluded from the blind study, never burned, counted by tools only under opaque labels) as a mock trial of the engine. Write-up: https://claude.ai/artifact/9CJkXtuprzxzRne4bty3dy
Baseline (last real survey 2026-10-24, 6758295 / #6361)
8 of 40 translate whole (20%). Of the 32 blocked: 13 only by source / clone problems (missing estate copybooks 9, undeclared items #7647, ISPF screens #7645), 17 only by translator gaps, 2 by both. On the 25 programs with no source or clone problem: 8 of 25 (32%).
Predictions (frozen before the first fix)
- Translator work alone takes the census to 25 whole (62%); the other 15 end as named source / clone problems: 40 of 40 accounted.
- The tool's coverage-if-closed (upper bounds; they count the missing-copybook gap as closable): top 1 -> 17, top 3 -> 20, top 5 -> 29, top 10 -> 32.
- Cost: 9 translator gap classes x ~4-5 PRs per class (calibrated on Siblings of #5042: cics-crucible programs that do not translate whole (17 programs, 8 hole classes) #6876: 17 programs, 8 classes, 35 PRs, 6 days) = 35-45 PRs, 6-9 days at two workers.
Protocol
- First (owner 2026-11-04): Translator consumes engine record layouts (fact_ownership.md follow-up): POINTER width as a parameter, shared stand-in copybooks, retire the duplicate layout computation #5649 -- the translator consumes the engine's record layouts (routed to nyx). The T0 re-survey waits until Translator consumes engine record layouts (fact_ownership.md follow-up): POINTER width as a parameter, shared stand-in copybooks, retire the duplicate layout computation #5649 has merged; T0 then measures main with Translator consumes engine record layouts (fact_ownership.md follow-up): POINTER width as a parameter, shared stand-in copybooks, retire the duplicate layout computation #5649 in, and the ledger notes it.
- T0: re-survey the census at current main with no census-targeted change (
cics_census.py surveyover the census repos, thengap_prevalence.py --census-survey ... --census-corpora ... --write); post the rate here. The 10-24 -> T0 delta is what the burned-estate work did for unseen code. - Nobody reads census source. A fix gets the gap label, the IBM manual page and the owning issue, and proves itself on our own test (a cics-crucible program or a fixture), never a census excerpt. Tightened by the owner 2026-11-06: no edited, patched or excerpted copy of census source either, even unprinted (no "move this line and re-parse" probes). Allowed: the tools run over the clone as is, with aggregate or scrubbed output. A finding that needs more than that is reported as "needs a fixture" and proven on one.
- Measure with the tool only (aggregates, opaque labels), after each fix merges; append one ledger row below.
- A gap that is the source's fault becomes a named source defect with its reason.
- L1 only (translates whole); no claim about L2+.
- Finish: 40 of 40 accounted (basis 39 since the owner ruling 2026-11-06: one of the 40 is a data-only copy member, census: ExprError is a named source defect, UnitRefused a copy member; both rows owned (Part of #7847, #7709) #7885 / census: inventory counts a data-only copy member as a program (basis 40 -> 39, #7709) #7901; report "of 39" from T9 on, with the change named) (whole or named), time box 14 days from T0; publish the ledger as it stands at the time box.
Gap classes (owners)
- Bare LayoutError, 9 programs (det translator: classify and close the census's bare refused: LayoutError (9 programs, 1 estate; #5865 rank 2) #7644; some may be source defects) (gap_prevalence: census LayoutError programs are source defects; regenerate census page (Part of #5865, #7644, #7709) #7714)
- No such item, 3 programs (no owner yet) (tests: pin the whole 'no such item' class (Part of #7709) #7730)
- Bytes overlap COMP-1/2/5, 3 programs (det translator: an item whose bytes overlap a COMP-1 / COMP-2 / COMP-5 item is refused (census: 2 programs; #5865 rank 4) #7646 slice 5; remaining work owned by det: COMP-5 in EXEC CICS PUT / GET CONTAINER areas under zos_comp5 (census: 3 programs, #7646 / #7709) #7845, COMP-5 in CICS containers): flip
translate()to defaultzos_comp5=True(owner ruling B, 2026-11-04; the v2.12.1 hold was lifted by the owner 2026-11-05, no release pending). Regenerate the affected goldens and re-prove the 5 burned COMP-5 programs (CardDemo PAUDBLOD / PAUDBUNL / DBUNLDGS, async ASYNCPNT / SEQPNT), then re-survey. T4 (2026-11-06): the default flip landed (det: translate() defaults to the z/OS COMP-5 order (Part of #7646, #7709) #7829) but frees none of the 3. Each keeps its COMP-5 item in an EXEC CICS PUT / GET CONTAINER (FROM / INTO) area, whichzos_comp5still refuses (_container_comp5), so the default falls back to the oracle's order. det: COMP-5 big-endian serves EXEC SQL and LINK COMMAREA over non-COMP-5 data (Part of #7646, #7709) #7841 (SQL + LINK COMMAREA) does not cover it. Remaining work: CICS channel containers carry COMP-5 bytes in z/OS order underzos_comp5, proven on a cics-crucible / fixture program (rule 2). (tests: pin the COMP-5 container boundary under zos_comp5 (Part of #7845, #7709) #7887) - STRING numeric sender with P or a decimal place, 2 programs (det: STRING sender / code-page gaps in CICS programs (census: 3 non-burned programs) #7523). T4: gap_prevalence reads it
named source defect(compile error in Enterprise COBOL), so these rows are accounted; ticked 2026-11-06. Re-opened 2026-11-05: tests: STRING / UNSTRING / INSPECT wide literal is a hole by name (Part of #7709) #7738 named the wide literal a hole, but T3 still shows this gap. (gap_prevalence: named source defects read as such, census counts accounted (Part of #7709, #7523) #7752) Re-opened again 2026-11-05 evening: no PR since T3 closed this gap. - EXEC CICS map: no such field, 2 programs (COBOL translator: CICS command breadth (START/RETRIEVE, channels/containers, GETMAIN, LOAD, CONVERSE, INQUIRE, ASSIGN, counters, HANDLE ABEND PROGRAM) #4270 closed; owned by det: EXEC CICS map field / symbolic map not resolved (census #7709, 2 programs) #7844) (tests: pin the 2 EXEC CICS map programs as accounted source defects (Part of #7844, #7709) #7891)
- JSON GENERATE / PARSE, 2 programs (det: JSON GENERATE / JSON PARSE not modelled (census #7709, 2 programs) #7524, reopened 2026-11-05 by the owner; work it there)
- Code-page literals (MOVE, STRING, UNSTRING / INSPECT beyond the single-byte code page), consolidated in det: MOVE literal beyond single-byte code page (census: 2 non-burned programs) #7526. T3: MOVE 2 programs, STRING 1. tests: STRING / UNSTRING / INSPECT wide literal is a hole by name (Part of #7709) #7738 names the wide-literal hole.
- EXEC CICS WEB CONVERSE / RECEIVE / HTTPHEADER, 1 program (det: EXEC CICS WEB CONVERSE / RECEIVE NOTRUNCATE / WRITE HTTPHEADER not modelled (census #7709, 2 programs) #7525, reopened 2026-11-05 by the owner; work it there)
- Missing copybooks, 9 programs: split clone defect vs IBM product copybook (owned by census: missing copybooks split into clone defect vs IBM product copybook (9 programs, #7709) #7846; T4 close-next step 1)
- Unowned whole-program refusals (ExprError, UnitRefused), 1 program each (owned by census: owners for the 2 unowned whole-program refusals (ExprError, UnitRefused) (#7709) #7847)
- EXEC SQL ROLLBACK in CICS, 1 program (det: EXEC SQL ROLLBACK in a CICS program (census: 1 non-burned program) #7527) (det: EXEC SQL COMMIT / ROLLBACK in a CICS program answer -925 / -926 (Part of #7709, #7527) #7727; the row is gone at T3)
- Tool: gap_prevalence names closed det/CICS: EXEC CICS WEB family (SEND, RECEIVE, EXTRACT, READ/WRITE HTTPHEADER, PARSE URL, OPEN, CONVERSE, CLOSE) -- zECS needs HTTP (design first) #4767 as the owner of the census EXEC CICS WEB rows. Point them at det: EXEC CICS WEB CONVERSE / RECEIVE NOTRUNCATE / WRITE HTTPHEADER not modelled (census #7709, 2 programs) #7525 (one-line owner-map fix). (gap_prevalence: census EXEC CICS WEB rows point at open #7525 (Part of #7709) #7754)
- Tool:
cics_census.py blockers --unmaskprints census repository and program names in its per-program rows. Scrub them as gap_prevalence's census half does (protocol rule 2). (cics_census: --unmask reports census programs as scrubbed aggregates (Part of #7709) #7755)
Owner rulings 2026-11-06: (1) code-page literals stay a named source defect as stored; #7526 closed as accounted. (2) The 2 IBM z/OS Connect programs (BAQ product copybooks) stay unaccounted: a product dependency is not a source or clone defect; frontier #7900. (3) Basis 39 (#7901). (4) Rule 2 tightened (above).
Ledger (one row per re-survey)
| date | main | whole / 40 | gap closed (PRs) | predicted vs actual | new gaps exposed | cost (PRs, worker-h, $) | named, not fixed |
|---|---|---|---|---|---|---|---|
| 2026-10-24 | 6758295 | 8 | baseline | - | - | - | - |
Related: #6064 (no current non-burned translation rate), #5865 (coverage-if-closed never validated against a run), #3803 (the real blind trial this rehearses).
Activity
squid-protocol commentedon Nov 4, 2026
T0 re-survey (owner 2026-11-04: run T0 now, ahead of #5649)
8 of 40 census programs translate whole (20.0%) at main
098ddd5d1, unchanged from the 2026-10-24 baseline (8 / 40 at6758295f2). So the 10-24 -> T0 delta, what the burned-estate work did for unseen code at L1, is 0 programs.Ledger row:
Census-targeted changes that merged before T0. Option 1 bent the T0-after-#5649 order to stop more of these leaking into the baseline:
text past column 72, det: name source defects (text past column 72 in EXEC SQL, ISPF screen captures, undeclared items) instead of 'no such item' / SystemExit #4735). This changes how they are named, not the whole count.translate(zos_comp5=True). The survey does not set the switch, sobytes overlap another itemstill blocks 2 programs.Coverage if closed at T0 (upper bounds, unchanged from the frozen predictions): top 1 -> 17, top 3 -> 20, top 5 -> 29, top 10 -> 32.
Method (tools only, no census source read):
cics_census.py survey --baseline --no-fetch --sha 098ddd5d1 --root <shared-scratch>(194 s).gap_prevalence.py --survey L --census-survey L --census-corpora <shared-scratch>/census --top 1 3 5 10, whereLis a temporary directory linking onlybefore-bandbefore-nb(the 9 provisioned census corpora). The cache'sbefore-nb-local(2 local non-burned corpora, 12 programs) was left out, as the 10-24 survey did.--write: the committed census page was regenerated by gap_prevalence: census LayoutError programs are source defects; regenerate census page (Part of #5865, #7644, #7709) #7714 today. Run--writewith the first fix row.The burned half of the same run: 126 of 129 burned programs translate whole.
🤖 Posted by Claude Code
det: IBM's default DFHCOMMAREA and DFHAID/DFHBMSCA constants leave th…
squid-protocol commentedon Nov 4, 2026
#7723 merged: a partial slice of [c:bced86e8] "No such item, 3 programs (no owner yet)"; left: the 3 programs leave the
no such itemclass, but none becomes whole: they still carry 36, 11 and 2 other holes, each in its own gap class (promoter-bot)squid-protocol commentedon Nov 4, 2026
T1 re-survey: first fix row
8 of 40 census programs translate whole (20.0%) at main
7f73c5700, unchanged from T0 (098ddd5d1).<name>: no such itemrow (3 programs, 1 estate) is gone from the census table. None of the 3 became whole, because each still carries at least one other gap.Method: identical to T0 (
cics_census.py survey --baselineat7f73c5700, 177 s;gap_prevalence.pyoverbefore-bandbefore-nbonly, the 9 census corpora). Tools only, no census source read.🤖 Posted by Claude Code
squid-protocol commentedon Nov 4, 2026
Unmasked survey at T1 (
7f73c5700): what the whole-program refusals hideWhole-program refusals stop the translator, so their programs' other gaps were invisible to T0 and T1, and coverage-if-closed counts them as upper bounds.
cics_census.py blockers --baseline --unmaskswitches one refusal check off in survey mode only. This is a what-if, not a translation. The run is the census survey only (whatif-nb). Aggregates only.LayoutError: source text past column(checkcut-literal): the switch reaches 7 of the class's 9 programs.missing copybook(checkmissing-copybook): the switch reaches 1 of the 9estate-ownedprograms; it takes only a single named member.LayoutDisagreesrefusal.What it changes for the trial:
Tool gap (sibling, for the class sweep):
blockers --unmaskprints census repository and program names in its per-program rows.gap_prevalence's census half scrubs these (scrub_key, opaquecensus-*labels), but unmask mode does not, so a run breaks protocol rule 2 by default. It should scrub census rows the same way. I did not record or repeat the names.🤖 Posted by Claude Code
docs: RT-SQL-UNIT-OF-WORK title and det_port_design note state CICS C…
squid-protocol commentedon Nov 4, 2026
#7728 merged: a partial slice of [c:4112a597] "EXEC SQL ROLLBACK in CICS, 1 program (#7527)"; left: proof case and census re-survey remain (promoter-bot)
squid-protocol commentedon Nov 4, 2026
Only-gap breakdown at T1 (
7f73c5700): census only, all 40 programscics_census.py blockers DIR --label before --all-programsover the census survey (before-nb) alone. Names are scrubbed.Distinct gap classes per program: 0: 8 (whole), 1: 26, 2: 1, 3: 3, 4: 1, 7: 1.
The 26 single-gap programs:
The 6 multi-gap programs (2-7 classes each) hold the long tail: JSON GENERATE / PARSE, the three EXEC CICS WEB forms, EXEC CICS map fields, EXEC SQL ROLLBACK, MOVE / STRING literals beyond the single-byte code page, a STRING numeric sender, SQLCA undeclared, PERFORM undeclared paragraph. One away: MOVE code-page literal 1, STRING numeric sender 1.
What it means for the PR estimate:
🤖 Posted by Claude Code
tests: pin the whole 'no such item' class -- modelled EIB fields, cen…
det: STRING refuses a numeric literal sender / delimiter by name (Par…
squid-protocol commentedon Nov 4, 2026
#7735 merged: a partial slice of [c:b383e52f] "STRING numeric / decimal sender, code-page gaps, 3 programs (#7523)"; left: the code-page row (register D4) is refused by design and has nothing to implement; numeric-sender and numeric-literal STRING operands are now refused by name. (promoter-bot)
87 remaining items
cics web: WEB WRITE HTTPHEADER SESSTOKEN translates on an assumed seq…
gap_prevalence: empty KNOWN_UNOWNED now that the census has no unowne…
census: --unmask runs skip a copy member; survey.md lists copy member…
det: JSON PARSE takes COMP / COMP-3 / COMP-5 numeric receivers (Part of
squid-protocol commentedon Nov 6, 2026
#7920 merged: a partial slice of [c:9bd1fd57] "JSON GENERATE / PARSE, 2 programs (#7524, reopened 2026-11-05 by the owner; work it there)"; left: JSON GENERATE exception JSON-CODE value (census GENERATE row), PARSE tables, JSON-CODE/JSON-STATUS after PARSE exception, CONVERTING, NAME OMITTED, OCCURS DEPENDING ON, SUPPRESS WHEN (#7905) (promoter-bot)
census: ExprError banner finding re-proved on an authored fixture (Pa…
cobolrt API manifest: add JsonParse.tryParse status overload as publi…
cobolrt API manifest: the emitter calls JsonParse.tryParse's six-argu…
census: gap_prevalence census half reports programs over the correcte…
harness: read the oracle's COMP-5 container bytes as z/OS holds them …
Merge origin/main into churn/7847-20261106T1234Z; regenerate the cens…
squid-protocol commentedon Nov 6, 2026
T9 re-survey (
7dc1d0138), basis 39Basis change: 40 -> 39 (owner ruling 2026-11-06, decision 3a). The 40th member is a data-only copy member (#7885); the inventory now lists it and does not count it (#7901, #7921, #7926).
11 of 39 census programs translate whole (28.2%); 35 of 39 accounted; ceiling under the rulings 37 of 39 (the 2 z/OS Connect programs excluded). Burned half: 126 of 129, unchanged.
WEB CONVERSE POSTgap, and one program moved fromundeclared itemtoother. Not attributed further.cics_census survey --baseline,blockers --baseline,gap_prevalence.blockersand the history line now printbasis: ... copy member(s) listed, not counted(PR census: T9 re-survey on the 39 basis; blockers and history name the copy members (Part of #7901, #7709) #7934). No census source read or copied.🤖 Posted by Claude Code
census: JSON PARSE / GENERATE refusals no longer collapse to the unow…
det: run a COMP-5 group through LINK CHANNEL between two translated p…
cobolrt API manifest: keep JsonParse.tryParse status overload public …