Skip to content

Commit 9d48c7e

Browse files
committed
Normalize LCOV line data records
1 parent 692acf8 commit 9d48c7e

2 files changed

Lines changed: 70 additions & 1 deletion

File tree

.agents/sow/done/SOW-0013-20260603-codacy-metrics-investigation.md

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
Status: completed
66

7-
Sub-state: LCOV parser regression repaired locally; remote workflow validation is the post-push verification path.
7+
Sub-state: LCOV `DA:` checksum regression repaired locally; remote workflow validation is the post-push verification path.
88

99
## Requirements
1010

@@ -533,3 +533,70 @@ Artifact updates:
533533
- SOW lifecycle: reopened from `done/` to `current/` for this parser
534534
regression, then completed and moved back to `done/` with the repair.
535535
- Specs/docs/skills: no protocol/API/operator behavior changes expected.
536+
537+
## Regression - 2026-06-03 - Codacy LCOV DA Checksums
538+
539+
What broke:
540+
541+
- GitHub Actions run `26879604593`, job `79275935075`, passed coverage
542+
generation, artifact upload, and `CODACY_API_TOKEN` verification.
543+
- The first real upload step, `Upload C coverage to Codacy`, still failed.
544+
- Codacy reporter 14.1.3 again logged `Could not parse report, unrecognized
545+
report format (tried: LCOV)` for `coverage/codacy/c-lcov.info`.
546+
547+
Evidence:
548+
549+
- Downloaded artifact `codacy-coverage-reports` from run `26879604593`.
550+
- The repaired C LCOV artifact no longer contained `VER:` records.
551+
- C `DA:` line records still had the gcovr checksum extension shape:
552+
`DA:line,count,checksum`.
553+
- Rust `DA:` line records used the simpler shape `DA:line,count`.
554+
- A local reporter parse test using the downloaded C artifact reproduced the
555+
parser failure with the original file.
556+
- The same local reporter parse test accepted a copy of the C LCOV with only
557+
the third `DA:` checksum field removed; it generated a Codacy coverage JSON
558+
report before failing later because the local test intentionally used a dummy
559+
token.
560+
561+
Why previous validation missed it:
562+
563+
- The validation checked for unsupported record labels and missing
564+
`end_of_record` separators, but did not check whether Codacy accepts optional
565+
checksum fields inside otherwise standard `DA:` records.
566+
567+
Repair plan:
568+
569+
- Strip the optional third field from `DA:` records during the existing LCOV
570+
normalization step.
571+
- Keep line number and hit count coverage data unchanged.
572+
- Re-run script lint, SOW audit, local coverage generation, local reporter parse
573+
against the generated C report, and GitHub Actions `Codacy Coverage`.
574+
575+
Validation:
576+
577+
- `bash -n tests/generate-codacy-coverage.sh` passed.
578+
- `shellcheck --severity=error tests/generate-codacy-coverage.sh` passed.
579+
- `actionlint .github/workflows/codacy-coverage.yml` passed.
580+
- `git diff --check` passed.
581+
- `tests/generate-codacy-coverage.sh /tmp/plugin-ipc-codacy-coverage` passed
582+
end to end.
583+
- Generated C and Rust LCOV reports contain no `VER:` records.
584+
- Generated C and Rust LCOV `DA:` records all use two fields:
585+
`DA:line,count`.
586+
- Generated report path scan found no workstation absolute paths and no Go
587+
module-prefix paths.
588+
- Generated C LCOV syntax scan found no records outside the normalized LCOV
589+
shape needed by Codacy.
590+
- Local Codacy reporter 14.1.3 parse test against the generated C report used
591+
the LCOV parser and generated the Codacy coverage JSON payload. The test then
592+
failed at upload because it intentionally used a dummy token; that is outside
593+
the parser path being validated locally.
594+
- GitHub Actions `Codacy Coverage` will run again after this repair is pushed.
595+
If the remote reporter rejects another report format issue, this SOW will be
596+
reopened again as a regression with the new evidence.
597+
598+
Artifact updates:
599+
600+
- SOW lifecycle: reopened from `done/` to `current/` for this parser
601+
regression, then completed and moved back to `done/` with the repair.
602+
- Specs/docs/skills: no protocol/API/operator behavior changes expected.

tests/generate-codacy-coverage.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ rewritten = []
7373
for line in report.read_text(encoding="utf-8").splitlines():
7474
if line.startswith("VER:"):
7575
continue
76+
if line.startswith("DA:"):
77+
line = ",".join(line.split(",", 2)[:2])
7678
if line.startswith(prefix):
7779
line = "SF:" + line[len(prefix):]
7880
rewritten.append(line)

0 commit comments

Comments
 (0)