fix: clj-holmes crash on large repos; make semgrep findings visible - #5
Merged
Conversation
Both found by the first real consumer run (cleancoders.com), and both are
regressions from replacing clj-holmes-action in this branch.
clj-holmes crashed with exit 255 and wrote no SARIF at all:
IllegalArgumentException: Value out of range for int: 35050732419
progrock.core$interval_str -> clj_holmes.logic.progress
Its progress bar overflows an int computing an ETA. Silent on small repos,
fatal on ~1300 Clojure files. The stock action always passed --no-verbose;
dropping that flag reintroduced the bug. With it, the same scan exits 0 and
reports 0 findings — so a progress-bar bug was blocking a production deploy.
Also guards a missing SARIF explicitly instead of letting jq fail obscurely.
semgrep found 5 blocking issues and the log said only 'Findings: 5'. With
--sarif --output the detail goes to the file, so --error produced a red job
with no indication of what or where. Now the findings print with severity,
rule, file and line, and the exit code is computed here.
Only error-level findings fail the job. Severity lives on the rule
(tool.driver.rules[].defaultConfiguration.level), not the result, so the jq
joins them — cc-path-traversal and cc-generic-catch are WARNING on purpose and
the README promises they do not block. Counting every result would have broken
that promise: cleancoders.com has 7 findings but only 3 blocking.
This was referenced Jul 28, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Two regressions from replacing
clj-holmes-action, both surfaced by the firstreal consumer run (cleancoders.com run 30379331916).
1. clj-holmes crashed and blocked a production deploy
Its progress bar overflows an int computing an ETA. Exit 255, no SARIF written
at all. Silent on small repos, fatal on ~1300 Clojure files. Those nonsense
ETA: 15823642:26values in every clj-holmes log were this bug not yet tippingover.
The stock
clj-holmes-actionalways passed--no-verbose; dropping that flagwhen replacing the action reintroduced it. With the flag, the same scan on
cleancoders.com exits 0 with 0 findings — so a progress-bar bug, not a
security finding, blocked a deploy.
Also guards a missing SARIF explicitly rather than letting
jqfail obscurelyon a file that was never created.
2. semgrep findings were invisible
The job went red and the log said, in full:
Five findings, no indication what or where. With
--sarif --outputthe detailgoes to the file, so
--errorgave a red job and an unactionable log — the samedefect fixed for clj-holmes in the previous PR and missed for semgrep in the
same commit.
Now prints severity, rule, file and line, and computes the exit code here:
Only error-level findings fail the job. Severity lives on the rule
(
tool.driver.rules[].defaultConfiguration.level), not the result — semgrepleaves
results[].levelnull — so the jq joins them.cc-path-traversalandcc-generic-catchareWARNINGon purpose and the README promises they do notblock; counting every result would have broken that promise. cleancoders.com has
7 findings but only 3 blocking.
Verification
Reproduced both against cleancoders.com locally: without
--no-verbose, exit 255and no SARIF; with it, exit 0 and a valid report. The new jq was validated
against the actual SARIF artifact from the failing run.
v1needs retagging after merge — cleancoders.com deploys stay blocked until itmoves.
🤖 Generated with Claude Code