COBOL: a program's entry paragraph (reached by fall-through) is flagged unreferenced and drives the tech-debt score; the #3198 entry row was never fixed

Cerrado
#7,206 1 comentario 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Ya se ha fusionado un pull request relacionado.

  • #7241 de @squid-protocol — fusionado

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
30/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Estancado
Stack tecnológico
compilers, python
Área
compilers

Línea de trabajo

Start in detector.py at _is_orphan and the orphan/duplicate guard that exempts main_line since #7170; extend the same exemption to the first paragraph/section after PROCEDURE DIVISION. Check _calc_tech_debt in metrics/signal_processor.py and the ground-truth ledger dead cells. Done means entry paragraphs are not orphaned, tech-debt scores drop on the listed COBOL files, and golden masters update.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

bug claim:nyx core-engine lane:nyx

What happens. A COBOL program starts by falling into the first paragraph (or section) after its PROCEDURE DIVISION header, and nothing calls that unit by name. _is_orphan (detector.py) gives it usage_status = 1, and two scores read that verdict as a defect:

  • Tech debt: _calc_tech_debt (metrics/signal_processor.py) counts unreferenced_by_name as orphans and weights each ×2. In a typical COBOL file, the entry paragraph is the whole score.
  • The debt and dead-code signal families include unreferenced_by_name.

#3198 reported this as the first of three defects (its micro-repro's MAIN-PARA, "live: the entry, reached by fall-through, never PERFORMed"; zopeneditor's 000-MAIN ×4; CBSA's PREMIERE SECTION in 17 programs and A010 in 7). Its fix landed the other two (case-insensitive names, - as a name character; cobol.py identifier_case / identifier_extra_chars). The entry row is still open on main.

Since #7170 it is also asymmetric. A main line (statements before the first paragraph) is now a def_shape = "main_line" unit, exempt from the orphan verdict. So the same program scores 0 when written with a main line and a non-zero tech debt when written with an entry paragraph.

Evidence. The ten agentic-COBOL systems (acherm/agentic-*-cobol-*, MIT), engine with #7170:

  • Every flagged unit is an entry unit. Every usage_status = 1 COBOL paragraph in all ten systems, 10 of 10, is the first paragraph after a PROCEDURE DIVISION header.
  • That one paragraph is every non-zero tech-debt score. Every COBOL file with a non-zero risk_tech_debt has exactly one such paragraph and no TODO or duplicate markers. One file has one HACK marker.
file tech debt from
agentic-cobol-doom-cc walker.cob 37.8 the entry paragraph alone
agentic-cobol-pygame-cc imgtest.cob 47.6 entry paragraph + 1 HACK-style marker
agentic-cobol-sat-cc src/cobsat.cob 24.4 the entry paragraph alone
agentic-cobol-compress-cc src/crc32.cob 22.5 the entry paragraph alone
agentic-cobol-pygame-cc bounce.cob / demo.cob / flappy.cob 16.8 / 16.5 / 10.2 the entry paragraph alone
agentic-cobol-sat-codex src/cobsat.cob 10.7 the entry paragraph alone
Codex systems that open with a main line 0 no entry paragraph

Reproduce: agentic-cobol-pairs/scoring_checks.py in squid-protocol/gitgalaxy-population-analyses (PR #23) lists every unreferenced paragraph and whether it is an entry.

Expected. The unit a PROCEDURE DIVISION falls into is never an orphan or a duplicate:

  • the first paragraph after the header, when there is no main line;
  • or the first section and its first paragraph.

This is the same rule #7170 gives the main line (def_shape != COBOL_MAIN_LINE_SHAPE in the orphan/duplicate guard). Per program: nested and sibling programs each have their own entry. A paragraph that only falls through from its predecessor is out of scope here (#3198 noted that fall-through sections read 0 only via is_public). The entry is the one case that is always reached.

To check in the fix

  • Ground-truth ledger dead cells: the key's truth is reachability. Entry paragraphs counted dead should become matches; the engine_dead_is_unreferenced_by_name cause (#2806) stays for the rest.
  • The refraction pipeline's dead-code use (#3120/#3122).
  • Golden masters: tech-debt and dead-code exposure move on COBOL files.

Found by the agentic-COBOL structural comparison (DOOM study follow-up).

Lenguaje dominante
Python
Estrellas
57
Forks
11
Merge medio
1 h 32 min
PR fusionados (30 d)
974

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de squid-protocol/gitgalaxy

Todos los issues de squid-protocol/gitgalaxy

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.