Skip to content

fix(review): count only .xml entries toward the coverage artifact cap and disclose a refusal - #824

Merged
devops-thiago merged 7 commits into
mainfrom
fix/813-coverage-entry-cap
Sep 15, 2026
Merged

devops-thiago merged 7 commits into
mainfrom
fix/813-coverage-entry-cap

Conversation

@devops-thiago

Copy link
Copy Markdown
Owner

What type of PR is this?

  • 🐛 Bug fix
  • ✅ Test

Description

JacocoCoverageReport.walkRefused charged every file entry to MAX_ZIP_ENTRIES (512), not only the .xml entries that can carry a report, and an archive past the cap was refused whole. The usual coverage upload is the whole target/site/jacoco/ tree — one .html per class plus the stylesheet, images and script, with jacoco.xml beside them — so a project of a few hundred classes crossed the cap with one legitimate report inside. The result was EMPTY, no coverage section, and a Log.debugf line nobody runs production at.

Verified against main at 9ae348d before changing anything:

What changed:

  • Only .xml entries count toward the cap. Every other entry — the HTML report, a stylesheet, a directory name — is still drained in full through the counting copy against MAX_TOTAL_INFLATED_BYTES, and the archive is refused the moment the budget is blown, so the fix(review): harden the patch-coverage report reader (zip-bomb bound, cross-module attribution, failed-run, multi-module merge) #789 bound is exactly as strong. The directory branch and the file branch collapsed into one "not a report" branch, since a directory name ends in / and can never pass the .xml test; the reasoning about a bomb/ entry moved into the method javadoc. The entries left uncounted are bounded by ArtifactZipFetcher.MAX_BYTES.

  • Both refusals log at WARN with counts only (cap, entries walked, bytes inflated or .xml entries seen), never an entry name. An archive that breaks mid-walk logs at WARN too.

  • A refusal is disclosed in the review-scope note. The reader returns an empty report carrying a Refusal (ENTRY_CAP, INFLATION_BUDGET, UNREADABLE); PatchCoverageResolver.resolve answers a Resolution(section, artifactRefusal); ReviewContext carries coverageArtifactRefusal (new back-compat constructor, the same pattern as unmatchedIgnoreGlobs and carried); VerdictBuilder renders PatchCoverageResolver.formatScopeNote in the same blockquote as the unmatched-glob note, between it and the carry-over note:

    AI review scope: the configured coverage artifact was not read: it holds more than 512 .xml entries

    An artifact that was never found, or held nothing that parsed, is not a refusal and is not disclosed. That stays the designed quiet path for a repository that publishes nothing usable.

Still refused, on purpose: a target/ upload with more than 512 surefire XML reports beside jacoco.xml, since every .xml costs a slot (the cap bounds how many documents are parsed, not how many turn out to be JaCoCo). The disclosure now says so instead of going quiet.

Related Issues

Fixes #813

How Has This Been Tested?

  • Unit tests

Red first, against the unfixed reader:

Test Verbatim failure before the fix
readsTheReportOutOfAnHtmlSiteTreeLargerThanTheEntryCap (600 .html + one jacoco.xml) 600 .html entries beside one jacoco.xml is the ordinary target/site/jacoco upload and must be read ==> expected: <false> but was: <true>
refusesAnArchiveWithMoreXmlEntriesThanTheCapAndSaysSoAtWarn (513 .xml) a refusal nobody runs production at DEBUG to see is a coverage section that went quiet for no written reason: [INFO Read patch coverage from artifact entry module0/jacoco.xml, … followed by the 512 INFO/DEBUG lines that were captured and no WARN line

Also added: refusesABombWearingAReportName (the aggregate budget refuses from inside an .xml entry, which was the one uncovered branch of the new walk), the Refusal asserted on every refused shape (entry cap, bomb, truncated download) and its absence on a read archive and on an archive with nothing usable, disclosesAnArtifactTheReaderRefusedInsteadOfGoingQuiet and formatsARefusalAsAReviewScopeNoteAndNothingOtherwise in PatchCoverageResolverTest, aRefusedCoverageArtifactReachesTheContextForTheSummaryToDisclose in ReviewContextLoaderTest, and aRefusedCoverageArtifactIsDisclosedInTheReviewScopeNote plus everyScopeNoteSharesOneBlockquoteInAFixedOrder in VerdictBuilderTest.

The existing bomb tests (refusesAnArchiveThatInflatesPastTheAggregateCap, refusesABombCarriedUnderADirectoryName, carriesNoPartialAnswerOutOfAnArchiveItRefused) pass with their assertions unchanged; the first additionally asserts the WARN line and the refusal. The three entry-cap tests that padded with .txt now pad with .xml, because .txt padding is exactly what stopped being counted.

Gates on JDK 25:

./mvnw -B clean compile spotbugs:check spotless:check   → BugInstance size is 0, BUILD SUCCESS
./mvnw -B clean test                                    → Tests run: 3639, Failures: 0, Errors: 0, Skipped: 0

Every added line and branch of the src/main diff is covered, checked against target/site/jacoco/jacoco.xml.

Checklist

  • My code follows the project's coding standards
  • I have performed a self-review of my own code
  • I have added tests that prove my fix is effective or that my feature works
  • New and existing unit tests pass locally with my changes
  • I have updated the documentation accordingly
  • My changes generate no new warnings or errors

Screenshots / Logs

The two WARN lines, with the counts substituted at runtime:

Coverage artifact holds more than %d .xml entries (%d entries walked, %d bytes inflated); refusing it rather than merging the prefix that fit
Coverage artifact inflates past the %d-byte aggregate cap (%d entries walked, %d of them .xml); refusing it as a zip bomb

Additional Notes

README.md's patch-coverage section now says the target/site/jacoco/ upload is fine and that a refused artifact is named in the summary; CHANGELOG.md has the entry under Unreleased. Latent in production until thrillhousebot.review.patch-coverage.enabled is turned on.

… and disclose a refusal

JacocoCoverageReport.walkRefused charged every file entry to
MAX_ZIP_ENTRIES (512), not only the .xml entries that can carry a
report, and an archive past the cap was refused whole. The usual
coverage upload is the whole target/site/jacoco/ tree, one .html per
class beside jacoco.xml, so a project of a few hundred classes crossed
the cap with a single legitimate report inside and got no coverage
section, with a DEBUG line as the only trace (#813).

Only .xml entries count toward the cap now. Every other entry is still
drained in full against the 128 MB aggregate budget from #789 and the
archive is refused the moment it is blown, so the zip-bomb bound is
unchanged; the entries left uncounted are bounded by the download
ceiling. Both refusals are logged at WARN with counts only, and the
reason rides the empty report out as a Refusal, through the resolver's
Resolution and the review context, to the summary's review-scope note,
which says the configured coverage artifact was not read and why, the
way an ignore glob that matched nothing is disclosed (#481).

walkRefused's javadoc describes what the code does.
@devops-thiago devops-thiago added this to the v0.6.8 milestone Sep 7, 2026
@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Dependency Review

✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.

Scanned Files

None

@thrillhousebot

thrillhousebot Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

🤖 ThrillhouseBot PR Summary

What this PR does

The coverage artifact walk now charges only .xml-named entries toward the MAX_ZIP_ENTRIES (512) refusal cap, draining all other entries (HTML, CSS, JS, directories) solely against the aggregate inflated-byte budget, so a whole target/site/jacoco/ upload with hundreds of HTML files and one jacoco.xml is read. Refusal reasons (entry cap, inflation budget, unreadable archive) travel as a Refusal on the empty report, are logged at WARN with counts only, and are disclosed to maintainers through PatchCoverageResolver.Resolution, ReviewContext.coverageArtifactRefusal, and the VerdictBuilder review-scope blockquote.

Description vs. Implementation

No mismatch found between the PR description and the change.

Control-Flow Diagram

🔀 Show diagram
flowchart TD
  A["fromArtifactZip: walkRefused loops over entries"] --> B{"entry name ends with .xml?"}
  B -- "no" --> C["drain entry vs 128 MB aggregate budget"]
  C --> D{"aggregate budget blown?"}
  D -- "no" --> B
  D -- "yes" --> E["log WARN with counts; Refusal.INFLATION_BUDGET"]
  B -- "yes (.xml)" --> F{"512 .xml already counted?"}
  F -- "no" --> G["readReportInto: parse and merge report"]
  G --> B
  F -- "yes" --> H["log WARN with counts; Refusal.ENTRY_CAP"]
  B -- "end of archive" --> I["merged report or EMPTY, refusal null"]
  E --> J["refused(): empty report carrying Refusal"]
  H --> J
  I --> K["PatchCoverageResolver: section, no note"]
  J --> L["PatchCoverageResolver: empty section + refusal reason"]
  K --> M["ReviewContext / VerdictBuilder summary & prompt"]
  L --> M
Loading

Changes Overview

  • Files changed: 11
  • Lines added: +651
  • Lines removed: -124

Changed Files

File Change Summary
CHANGELOG.md Modified Adds Unreleased fixed entry describing the .xml-only cap counting and the WARN/scope-note disclosure.
README.md Modified Documents that whole target/site/jacoco uploads are fine (only .xml counts to the cap) and refused artifacts are named in the review scope note.
src/main/java/dev/thiagogonzaga/thrillhousebot/review/JacocoCoverageReport.java Modified Counts only .xml entries toward the 512 cap, drains the rest on the aggregate budget, and returns Refusal (ENTRY_CAP/INFLATION_BUDGET/UNREADABLE) on refused archives, logged at WARN.
src/main/java/dev/thiagogonzaga/thrillhousebot/review/PatchCoverageResolver.java Modified resolve() now returns Resolution(section, artifactRefusal); refused artifacts yield an empty section plus a formatted scope-note reason.
src/main/java/dev/thiagogonzaga/thrillhousebot/review/ReviewContextLoader.java Modified ReviewContext gains coverageArtifactRefusal with a back-compat constructor; loader threads the resolver section and refusal into the context.
src/main/java/dev/thiagogonzaga/thrillhousebot/review/VerdictBuilder.java Modified Adds the refused-coverage-artifact note to the review-scope blockquote, between unmatched globs and superseded-run carry-over.
src/test/java/dev/thiagogonzaga/thrillhousebot/review/JacocoCoverageReportTest.java Modified Tests 600-HTML tree read, 513-.xml refusal with WARN and Refusal, budget refusal inside an .xml-named bomb, and refusal presence/absence across archive shapes.
src/test/java/dev/thiagogonzaga/thrillhousebot/review/PatchCoverageResolverTest.java Modified Asserts refused artifacts produce Resolution('', reason), quiet paths stay Resolution.NONE, and formatScopeNote renders reasons only.
src/test/java/dev/thiagogonzaga/thrillhousebot/review/ReviewContextLoaderTest.java Modified Verifies a refused artifact's reason reaches ReviewContext while a read report discloses nothing; stubs Resolution.NONE as quiet default.
src/test/java/dev/thiagogonzaga/thrillhousebot/review/ReviewOrchestratorTest.java Modified Replaces the bare PatchCoverageResolver mock with quietPatchCoverage() stubbing Resolution.NONE so the loader never dereferences null.
src/test/java/dev/thiagogonzaga/thrillhousebot/review/VerdictBuilderTest.java Modified Asserts a refused coverage artifact appears in the AI review scope note and that all scope notes share one blockquote in fixed order.

Risk Assessment

Risk Count
🔴 Critical 0
🟠 High 0
🟡 Medium 0
🔵 Low 0

No new issues found in this PR, but the review cannot be approved until required CI is confirmed green.

⚠️ Required CI Checks Status

Some required checks are still pending or have failed:

Check Type Status Detail
frontend check-run ⏳ Pending -
test check-run ⏳ Pending -
trivy check-run ⏳ Pending -
format check-run ⏳ Pending -
dependency-review check-run ⏳ Pending -

Automated review by ThrillhouseBot. Reply with /review to re-run.

@thrillhousebot thrillhousebot Bot added bug Something isn't working java Pull requests that update java code labels Sep 7, 2026
@codecov

codecov Bot commented Sep 7, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@devops-thiago

Copy link
Copy Markdown
Owner Author

/review

@thrillhousebot

thrillhousebot Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

🤖 ThrillhouseBot — changes since the last review

  • New findings this round: 1
  • Previous findings resolved: 0
  • Previous findings still open: 0

Comment thread src/main/java/dev/thiagogonzaga/thrillhousebot/review/JacocoCoverageReport.java Outdated
@thrillhousebot thrillhousebot Bot added the testing Test coverage and test quality label Sep 7, 2026
…s own empty report

The constant's javadoc still called it the value every failure path
degrades to, which stopped being true when fromArtifactZip began
answering a refusal with a separate empty report carrying the reason.
It now says which reads degrade to EMPTY and that isEmpty(), not
identity with the constant, is the test for "no coverage".
@thrillhousebot

thrillhousebot Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

🤖 ThrillhouseBot — changes since the last review

  • New findings this round: 0
  • Previous findings resolved: 1
    • src/main/java/dev/thiagogonzaga/thrillhousebot/review/JacocoCoverageReport.java:111 — EMPTY javadoc says every failure path degrades to EMPTY, but refusal paths now return refused(Refusal)
  • Previous findings still open: 0

@thrillhousebot thrillhousebot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ThrillhouseBot found no issues in this PR, but some checks are still pending or failed:

  • Check test is pending
  • Check format is pending
  • Check trivy is pending
  • Check frontend is pending
  • Check dependency-review is pending

ThrillhouseBot closed 1 previous finding(s) this round:

  • src/main/java/dev/thiagogonzaga/thrillhousebot/review/JacocoCoverageReport.java:111 — EMPTY javadoc says every failure path degrades to EMPTY, but refusal paths now return refused(Refusal)

@devops-thiago

Copy link
Copy Markdown
Owner Author

/review

@thrillhousebot

thrillhousebot Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

🤖 ThrillhouseBot — changes since the last review

  • New findings this round: 1
  • Previous findings resolved: 0
  • Previous findings still open: 0

@thrillhousebot thrillhousebot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ThrillhouseBot noted 1 lower-confidence item(s) under Things to double-check in the PR summary (not posted as inline threads):

  • LOW: README claim that a configured artifact never goes quiet contradicts the designed quiet path (README.md:758)
    The README paragraph added by this PR ends: "nothing is, so a configured artifact never goes quiet without saying why." This overstates the actual behavior, which the same PR documents in JacocoCoverageReport.Refusal's javadoc: "An archive that was merely unhelpful — no {@code .xml} entry, nothing that parsed as JaCoCo — is not refused and carries no reason: that is the designed quiet path for a repository publishing nothing usable." Likewise, PatchCoverageResolver.resolve() returns Resolution.NONE (silent) when a configured artifact is never found (download cannot be followed) or parses to nothing usable. The scope-note disclosure fires only for the reader's refusals (ENTRY_CAP / INFLATION_BUDGET / UNREADABLE). A maintainer who configured an artifact whose job never uploads it — or that only ever publishes non-coverage files — would, per the README, expect a scope note that by design never comes. The PR's own description confirms the intended behavior: "An artifact that was never found, or held nothing that parsed, is not a refusal and is not disclosed. That stays the designed quiet path."

…graph

The sentence added for the refusal disclosure ended by promising that a
configured artifact never goes quiet without saying why. Only an archive
the reader refused is disclosed; one that was never uploaded, has
expired or holds no JaCoCo XML is still the designed quiet case the
paragraph above it describes. The paragraph now says so.
@devops-thiago

Copy link
Copy Markdown
Owner Author

@thrillhousebot resolved README.md:758 — README claim that a configured artifact never goes quiet contradicts the designed quiet path

Agreed: only a refused archive is disclosed, and an artifact that was never uploaded, has expired, or holds no JaCoCo XML stays the designed quiet path. Fixed in 4dfdbd4, where the paragraph now ends: "An artifact that was never uploaded, has expired, or holds no JaCoCo XML is still the quiet case above: nothing was refused, so nothing is disclosed."

@thrillhousebot

thrillhousebot Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

The next review will close every previous finding this comment names by its path:line and title; anything it does not name stays open.

@thrillhousebot

thrillhousebot Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

🤖 ThrillhouseBot — changes since the last review

  • New findings this round: 0
  • Previous findings resolved: 1
    • README.md:758 — README claim that a configured artifact never goes quiet contradicts the designed quiet path
  • Previous findings still open: 0

@thrillhousebot thrillhousebot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ThrillhouseBot found no issues in this PR, but some checks are still pending or failed:

  • Check trivy is pending
  • Check frontend is pending
  • Check format is pending
  • Check test is pending
  • Check dependency-review is pending

ThrillhouseBot closed 1 previous finding(s) this round:

  • README.md:758 — README claim that a configured artifact never goes quiet contradicts the designed quiet path

@devops-thiago

Copy link
Copy Markdown
Owner Author

/review

thrillhousebot[bot]
thrillhousebot Bot previously approved these changes Sep 7, 2026

@thrillhousebot thrillhousebot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Everything's coming up Thrillhouse! 🎉

No issues found in this PR.

@thrillhousebot thrillhousebot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ThrillhouseBot found no issues in this PR, but some checks are still pending or failed:

  • Check format is pending
  • Check test is pending
  • Check trivy is pending
  • Check frontend is pending
  • Check dependency-review is pending

⚠️ Large PR — partial review. 11 file(s) were only partially reviewed because the model's response was cut at its length cap (max-output-tokens) — findings up to the cut were kept (src/main/java/dev/thiagogonzaga/thrillhousebot/review/JacocoCoverageReport.java, src/test/java/dev/thiagogonzaga/thrillhousebot/review/JacocoCoverageReportTest.java, src/test/java/dev/thiagogonzaga/thrillhousebot/review/VerdictBuilderTest.java, src/main/java/dev/thiagogonzaga/thrillhousebot/review/ReviewContextLoader.java, src/test/java/dev/thiagogonzaga/thrillhousebot/review/PatchCoverageResolverTest.java, src/main/java/dev/thiagogonzaga/thrillhousebot/review/PatchCoverageResolver.java, src/test/java/dev/thiagogonzaga/thrillhousebot/review/ReviewContextLoaderTest.java, src/test/java/dev/thiagogonzaga/thrillhousebot/review/ReviewOrchestratorTest.java, src/main/java/dev/thiagogonzaga/thrillhousebot/review/VerdictBuilder.java, README.md, +1 more); the findings and verdict below cover only the reviewed portion.

@devops-thiago

Copy link
Copy Markdown
Owner Author

/review

thrillhousebot[bot]
thrillhousebot Bot previously approved these changes Sep 9, 2026

@thrillhousebot thrillhousebot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Everything's coming up Thrillhouse! 🎉

No issues found in this PR.

devops-thiago added a commit that referenced this pull request Sep 12, 2026
## What type of PR is this?

- [x] 🚀 Performance
- [x] 🔧 Refactor
- [x] ✅ Test

## Description

`ArtifactZipFetcher.transfer` built an `HttpClient` for every
coverage-artifact download and closed it in the same try-with-resources:
a selector thread created and torn down, a connection pool that never
held anything, and a fresh TLS handshake per call, for a client with no
per-call state. Verified against `main` at 9ae348d: the builder, the
`ProxySelector.getDefault()` read and the `try (var client =
builder.build())` were all inside `transfer`, and the only per-request
setting, the 30 s timeout, was already on the `HttpRequest`. The issue
is right on every point, including that this was not a leak.

What changed:

- **One client per bean.** The client is a `final` field built in the
constructor of the `@ApplicationScoped` bean; `transfer` only builds the
request. `HttpClient` is thread-safe and pools connections, so the
second download of a deployment reuses the first one's connection.
- **No credential, restated on the field.** The field's javadoc says no
default header, authenticator or cookie handler may ever be attached,
and why: on a long-lived shared client a default `Authorization` header
would carry the installation token to every blob host the client is ever
pointed at. That is also why following redirects stays safe.
- **`ProxySelector.getDefault()` is read once, at construction.** Stated
on the field rather than assumed: a proxy configured through JVM system
properties at startup is unaffected; a selector swapped at runtime is no
longer followed. The null guard stays, since `Builder.proxy(null)`
throws.
- **`@PreDestroy shutdown()`** releases the selector thread and pooled
connections when the application stops, through `shutdownNow` rather
than `close` so a download still in flight cannot hold the shutdown
open. A download that reaches a shut-down client degrades to no bytes
like every other failure.

Behaviour otherwise unchanged: https-only through `fetch`, the
`MAX_BYTES` reject-not-truncate bound, connect and request timeouts,
redirect following, and the fail-soft empty array on every error path.
The existing `transfer` tests pass unchanged against the loopback
server.

Nothing leaks a real client into unit tests: `PatchCoverageResolverTest`
and `ReviewOrchestratorTest` use `mock(ArtifactZipFetcher.class)`, and
Mockito's inline mock maker never runs the constructor.
`ArtifactZipFetcherTest` builds real fetchers and now shuts each one
down in `@AfterEach`.

## Related Issues

Fixes #478

## How Has This Been Tested?

- [x] Unit tests

Red first. The reuse is observed on the wire rather than by object
identity: a client that outlives the call keeps its HTTP/1.1 connection
pooled, so a second download to the loopback server arrives on the same
TCP connection, which a per-call client cannot do.

| Test | Verbatim failure before the fix |
| --- | --- |
| `twoDownloadsShareOneClientAndItsPooledConnection` | `a second
download on the same bean must reuse the first one's pooled connection,
which only a client that outlives the call can hold ==> expected:
<57541> but was: <57542>` (the server saw two different remote ports) |

`aDownloadAfterShutdownDegradesInsteadOfPropagating` covers the
`@PreDestroy` path (no bytes, no exception, a second shutdown is
harmless); it has no red form because there was nothing to shut down
before. `worksWhenTheJvmHasNoDefaultProxySelector` now builds the
fetcher inside the null-selector window, since the read moved to
construction; against a fetcher built at field-init time it would have
stopped exercising the guard.

Gates on JDK 25:

```
./mvnw -B clean compile spotbugs:check spotless:check   → BugInstance size is 0, BUILD SUCCESS
./mvnw -B clean test                                    → Tests run: 3633, Failures: 0, Errors: 0, Skipped: 0
```

Every added line and branch of the `src/main` diff is covered, checked
against `target/site/jacoco/jacoco.xml`.

## Checklist

- [x] My code follows the project's coding standards
- [x] I have performed a self-review of my own code
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [x] I have updated the documentation accordingly
- [x] My changes generate no new warnings or errors

## Screenshots / Logs

N/A

## Additional Notes

Independent of #824 (branched from `main`). Both add a `CHANGELOG.md`
entry under Unreleased, so whichever merges second needs a trivial
conflict resolution there.
…y-cap

# Conflicts:
#	CHANGELOG.md
#	src/main/java/dev/thiagogonzaga/thrillhousebot/review/VerdictBuilder.java
#	src/test/java/dev/thiagogonzaga/thrillhousebot/review/VerdictBuilderTest.java

@thrillhousebot thrillhousebot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ThrillhouseBot found no issues in this PR, but some checks are still pending or failed:

  • Check frontend is pending
  • Check format is pending
  • Check test is pending
  • Check trivy is pending
  • Check dependency-review is pending

@thrillhousebot thrillhousebot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ThrillhouseBot found no issues in this PR, but some checks are still pending or failed:

  • Check format is pending
  • Check test is pending
  • Check frontend is pending
  • Check trivy is pending
  • Check dependency-review is pending

@devops-thiago

Copy link
Copy Markdown
Owner Author

/pause

@thrillhousebot

Copy link
Copy Markdown
Contributor

⏸️ ThrillhouseBot is now paused on this PR — automatic and manual reviews are silenced. Comment /resume to re-enable.

@sonarqubecloud

Copy link
Copy Markdown

@devops-thiago
devops-thiago merged commit a014fea into main Sep 15, 2026
19 checks passed
@devops-thiago
devops-thiago deleted the fix/813-coverage-entry-cap branch September 15, 2026 13:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working java Pull requests that update java code testing Test coverage and test quality

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Coverage artifact entry cap counts every file, so a normal HTML+XML report upload is refused whole and silently

1 participant