Skip to content

ci: tiered PR builds + performance test infrastructure#34

Open
astubbs wants to merge 42 commits intomasterfrom
dev/ci-tweak
Open

ci: tiered PR builds + performance test infrastructure#34
astubbs wants to merge 42 commits intomasterfrom
dev/ci-tweak

Conversation

@astubbs
Copy link
Copy Markdown
Owner

@astubbs astubbs commented Apr 14, 2026

Summary

depends on #25

  • Restructure PR CI into 4 tiers with needs: dependencies for fast feedback
  • Add performance test infrastructure (@Tag("performance"), scripts, docs)
  • Document -Dlicense.skip usage in AGENTS.md

PR build tiers

Tier What Waits for ~Time
1 Unit tests (no Docker) ~3 min
2 Integration tests (TestContainers) Tier 1 ~10 min
3 Kafka matrix (2.8.1 + 3.9.1) Tier 2 ~10 min
4 Performance tests Tier 2 ~15 min

Tiers 3 and 4 run in parallel after Tier 2 passes.

Push builds (master)

Full Kafka matrix: 2.8.1, 3.1.0, 3.7.0, 3.9.1 + experimental [3.9.1,5) range for 4.x compatibility.

Changes

  • Dropped AK 3.5.0 from matrix (EOL Aug 2025)
  • Updated experimental range from [3.1.0,4) to [3.9.1,5) to catch Kafka 4.x
  • Tagged volume tests with @Tag("performance") so they're excluded from regular CI
  • Added bin/performance-test.sh and bin/performance-test.cmd
  • Added docs/SELF_HOSTED_RUNNER.md for future dedicated runner setup

Test plan

  • Unit tests pass locally
  • Verify tiered PR jobs run in correct order on this PR
  • Verify Tier 3 and Tier 4 run in parallel (both depend on Tier 2)

🤖 Generated with Claude Code

astubbs and others added 9 commits April 14, 2026 20:19
Adds a separate performance test suite that runs on dedicated hardware
via a self-hosted GitHub Actions runner, so the volume tests don't
slow down or destabilize regular CI.

Test changes:
- Tag VeryLargeMessageVolumeTest, LargeVolumeInMemoryTests, and
  MultiInstanceHighVolumeTest with @tag("performance")
- Failsafe now reads excluded.groups (defaults to "performance") and
  included.groups (defaults to empty), so the performance group is
  excluded by default. Override with -Dincluded.groups=performance to
  run only perf, or -Dexcluded.groups= to run everything.

Scripts:
- bin/performance-test.sh and bin/performance-test.cmd run the perf
  suite locally (.cmd for Windows since the runner is on Windows)

Workflow:
- .github/workflows/performance.yml targets a self-hosted runner
  labelled [self-hosted, windows, performance]
- Triggers: workflow_dispatch (manual) + weekly schedule
- Never runs on PRs (security: self-hosted + untrusted code = bad)

Documentation:
- docs/SELF_HOSTED_RUNNER.md walks through one-time runner setup on
  Windows with Docker Desktop and the WSL2 backend
- README template and AGENTS.md mention the performance suite and
  link to the runner setup doc
- Fix a stale link in README to the renamed VolumeTests file

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add a "License headers" section to AGENTS.md explaining how to skip
the Mycila license-maven-plugin check. This avoids two recurring
problems:
- The plugin's git-derived copyright years break inside git worktrees
- It auto-bumps years on every touched file, creating noise in
  git status that distracts from real changes

The bin/build.sh and bin/ci-build.sh scripts already pass the flag.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
PR builds now run in tiers, each gated on the previous:
  Tier 1: Unit tests (no Docker, ~3 min)
  Tier 2: Integration tests (TestContainers, ~10 min)
  Tier 3: Kafka version matrix (2.8.1 + 3.9.1 only)
  Tier 4: Performance tests (@tag("performance"))

Tiers 3 and 4 run in parallel after Tier 2 passes.

Push builds (master) still run the full Kafka matrix (2.8.1,
3.1.0, 3.7.0, 3.9.1) plus an experimental [3.9.1,5) range
to catch Kafka 4.x compatibility.

Dropped 3.5.0 from the matrix (EOL Aug 2025). Updated the
experimental range from [3.1.0,4) to [3.9.1,5) to cover 4.x.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Push events on feature branches were triggering the full Kafka matrix
build intended for master. Restrict on.push to master only.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Retry failing tests up to 2 times to handle known flaky tests
(queuedMessagesNotProcessedOrCommittedIfSubmittedDuringShutdown,
JStreamParallelEoSStreamProcessorTest timing issues).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The unit/integration split added overhead without real benefit.
Simplified to:
  1. Build & Test: full verify (unit + integration), default Kafka
  2. Kafka Matrix (2.8.1 + 3.9.1) — after Build & Test
  3. Performance Tests — after Build & Test

Matrix and performance fan out in parallel after the main build passes.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Use bin/ci-build.sh instead of raw mvnw to match existing CI setup
(includes -Pci profile). Add -Dexcluded.groups=performance and
-Dsurefire.rerunFailingTestsCount=2 to the script.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Ensures -Pci profile is used for compilation consistency.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add [3.9.1,5) range to the PR kafka-matrix with continue-on-error
so we get early visibility into 4.x compatibility without blocking PRs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Comment thread .github/workflows/maven.yml
Comment thread .github/workflows/maven.yml
Comment thread docs/SELF_HOSTED_RUNNER.md Outdated
@astubbs
Copy link
Copy Markdown
Owner Author

astubbs commented Apr 14, 2026

@claude check review

@claude
Copy link
Copy Markdown

claude bot commented Apr 14, 2026

Claude finished @astubbs's task in 1m 31s —— View job


Review complete

  • Read trigger comment and review comments
  • Diff maven.yml vs origin/master — assessed m2 cache and test reports
  • Remove docs/SELF_HOSTED_RUNNER.md — committed and pushed
  • Commit and push

maven.yml — m2 cache and test reports (no changes needed)

m2 cache — no regression. In origin/master the explicit actions/cache@v2.1.7 block was already commented out with the note # done automatically now. All jobs (before and after this PR) use actions/setup-java@v5 with cache: 'maven', which handles Maven repo caching automatically. Nothing was removed.

Test reports — also no regression. The Archive test results / Archive surefire test results steps in origin/master were already fully commented out and never active on this branch. This PR just cleaned up those dead comment blocks. Coverage tracking was not functioning before this PR and is not made worse by it.

Line 71 "Check"performance-tests job uses actions/setup-java@v5 with cache: 'maven' — looks correct.


docs/SELF_HOSTED_RUNNER.md — removed

Deleted and pushed in commit 50d024c.
| Branch

Co-authored-by: Antony Stubbs <astubbs@users.noreply.github.com>
@astubbs
Copy link
Copy Markdown
Owner Author

astubbs commented Apr 14, 2026

@claude check action run code review failure

@claude
Copy link
Copy Markdown

claude bot commented Apr 14, 2026

Claude finished @astubbs's task in 1m 12s —— View job


CI Action Run — Code Review Failure Analysis

  • Get CI status for this PR
  • Identify failing jobs
  • Analyze failure logs
  • Report findings

Root Cause

Job: Claude Code Review (run #24396513814)
Failed step: Run Claude Code Review (step 3)
Error:

Action failed with error: Workflow initiated by non-human actor: claude (type: Bot).
Add bot to allowed_bots list or use '*' to allow all bots.

What happened: Every time claude[bot] pushes a commit to this PR (e.g. deleting SELF_HOSTED_RUNNER.md), it triggers the synchronize event on pull_request, which fires claude-code-review.yml. The anthropics/claude-code-action@v1 has a built-in guard against bot-initiated runs to prevent infinite loops — so it rejects itself when github.actor is claude[bot].

This is expected/harmless — it's the action protecting against recursion — but it shows up as a red X on the PR.


Fix

Add a bot-exclusion guard to .github/workflows/claude-code-review.yml job condition:

jobs:
  claude-review:
    if: github.event.sender.type != 'Bot'

This skips the review job entirely when the synchronize event was triggered by a bot push, while still running the review for human-pushed commits.

Note: I cannot modify .github/workflows/ files directly due to GitHub App permission restrictions. You'll need to apply this one-line change manually. Fix this →


Build and Test is still in_progress — that's the normal Maven build and is unrelated to this failure.
| Branch

astubbs and others added 8 commits April 14, 2026 23:36
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The integration tests were hardcoded to cp-kafka:7.6.0 (Kafka 3.6)
regardless of the -Dkafka.version override from the CI matrix. This
caused 2.8.1 client to talk to a 3.6 broker, producing BrokerPollSystem
errors.

Now derives the CP Kafka Docker image version from the actual client
version at runtime (CP major = AK major + 4, CP minor = AK minor).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ssigned

With Kafka 2.x's eager rebalance protocol, poll() can return records for
a partition before onPartitionsAssigned() has fired, leaving the epoch
map empty. This caused a NullPointerException in EpochAndRecordsMap.

Fix: skip records for partitions with no epoch yet. These records are
safe to skip — they haven't been committed, so Kafka will re-deliver
them on the next poll after the assignment callback completes.

Includes lifecycle test proving: skip on first poll → assignment fires →
re-poll succeeds with correct epoch → work created.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Kafka 2.8.1 is end-of-life (released April 2021, no security patches).
The upstream never ran integration tests against 2.x either.

Keep the defensive null-epoch handling and dynamic broker version
matching as they're good practice regardless.

PR matrix: 3.9.1 + experimental [3.9.1,5) for 4.x visibility
Push matrix: 3.1.0, 3.7.0, 3.9.1 + experimental [3.9.1,5)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
All three test suites now start simultaneously on PRs. If unit tests
fail (~5 min), GitHub cancels integration and performance immediately.
Kafka version matrix is gated on all tests passing.

Replaces the sequential Build & Test → fan out approach.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The default Kafka version (3.9.1) is already tested by the three
parallel test suites. The kafka-matrix was duplicating this work.
Multi-version testing is covered by the push-to-master matrix.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Upload JaCoCo reports to Codecov from all test suites and push builds.
Fail PRs if overall coverage drops by more than 1% from the base branch.
Patch coverage is reported but informational only.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Codecov requires a token when branch protection is enabled. Added
token reference to both PR and push upload steps. Documented the
secret and coverage setup in AGENTS.md.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@codecov-commenter
Copy link
Copy Markdown

codecov-commenter commented Apr 15, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
⚠️ Please upload report for BASE (master@4f5eb21). Learn more about missing BASE report.
⚠️ Report is 604 commits behind head on master.

Additional details and impacted files
@@            Coverage Diff            @@
##             master      #34   +/-   ##
=========================================
  Coverage          ?   77.18%           
  Complexity        ?     1154           
=========================================
  Files             ?       82           
  Lines             ?     4190           
  Branches          ?      386           
=========================================
  Hits              ?     3234           
  Misses            ?      765           
  Partials          ?      191           
Flag Coverage Δ
integration 67.89% <20.00%> (?)
performance 75.85% <100.00%> (?)
unit 74.55% <100.00%> (?)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

astubbs and others added 6 commits April 15, 2026 15:22
Added prepare-agent-integration and report-integration executions
to JaCoCo plugin so failsafe (integration test) coverage is captured.
Updated Codecov upload to include jacoco-it reports.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Runs in parallel with test suites. Reports duplicate Java code blocks
across all source including tests. No failure threshold yet — reporting
only to establish a baseline.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… testing

Three new parallel CI jobs for PRs:
- SpotBugs: static analysis for null derefs, concurrency bugs, resource leaks
- Dependency Vulnerabilities: OSS Index audit for known CVEs
- Mutation Testing (PIT): verifies test assertions are meaningful

All run in parallel with existing test suites. SpotBugs and PIT are
reporting-only for now (no build failure). Dependency scan uses the
existing ossindex plugin config.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
SpotBugs failed on vertx module due to Jabel cross-compilation. Restrict
to parallel-consumer-core for now. OSS Index audit gets 401s from the
API intermittently — make it continue-on-error.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Create bin/ci-unit-test.sh and bin/ci-integration-test.sh so all CI
  jobs use scripts with consistent -Pci flags instead of inline commands
- Add timeout-minutes to all jobs (30 for tests, 10 for SpotBugs,
  5 for duplicate/dependency checks, 15 for PIT)
- Restore all modules for integration and performance tests (reverts
  the -pl restriction — slow tests should be investigated, not removed)
- Cherry-pick Mutiny release.target=9 fix for full module compilation
- Revert performance-test.sh -pl restriction
- Document new scripts in README

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- jscpd: posts summary table + duplicate block list as PR comment
- SpotBugs: uses spotbugs-github-action for inline PR annotations
- PIT: posts mutation score summary as PR comment with artifact link

All comments are updated in-place on subsequent runs (no spam).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 15, 2026

✅ Duplicate Code Report

Two engines run in parallel for cross-validation. Each has its own thresholds tuned to its baseline - the real safety net is the per-engine "max increase vs base" check.

✅ PMD CPD (Java-aware)

PR Base Change
Clones 36 36 ➖ 0
Duplicated lines 1125 1125 ➖ 0
Duplication 3.94% 3.94% ➖ 0
Rule Limit Status
Max duplication 5% ✅ Pass (3.94%)
Max increase vs base +0.1% ✅ Pass (+0.00%)

No new clones introduced by this PR.

✅ jscpd (language-agnostic)

PR Base Change
Clones 56 56 ➖ 0
Duplicated lines 713 713 ➖ 0
Duplication 2.65% 2.67% 🙂 -0.02%
Rule Limit Status
Max duplication 4% ✅ Pass (2.65%)
Max increase vs base +0.1% ✅ Pass (-0.02%)

No new clones introduced by this PR.

Powered by astubbs/duplicate-code-cross-check

astubbs and others added 3 commits April 15, 2026 21:01
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
GitHub's own action is more reliable (no external API auth issues),
posts a summary comment on the PR, and uses GitHub's advisory database.
Fails on high/critical severity CVEs in new dependencies.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 15, 2026

Dependency Review

The following issues were found:
  • ✅ 0 vulnerable package(s)
  • ✅ 0 package(s) with incompatible licenses
  • ✅ 0 package(s) with invalid SPDX license definitions
  • ⚠️ 4 package(s) with unknown licenses.
See the Details below.

License Issues

.github/workflows/performance.yml

PackageVersionLicenseIssue Type
actions/checkout6.*.*NullUnknown License
actions/setup-java5.*.*NullUnknown License
actions/upload-artifact7.*.*NullUnknown License

pom.xml

PackageVersionLicenseIssue Type
com.github.spotbugs:spotbugs-maven-plugin4.8.6.6NullUnknown License

OpenSSF Scorecard

PackageVersionScoreDetails
actions/actions/checkout 6.*.* 🟢 5.7
Details
CheckScoreReason
Maintained⚠️ 00 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
Code-Review🟢 10all changesets reviewed
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Fuzzing⚠️ 0project is not fuzzed
Packaging⚠️ -1packaging workflow not detected
License🟢 10license file detected
Signed-Releases⚠️ -1no releases found
Pinned-Dependencies🟢 3dependency not pinned by hash detected -- score normalized to 3
Security-Policy🟢 9security policy file detected
Branch-Protection🟢 5branch protection is not maximal on development and all release branches
SAST🟢 8SAST tool detected but not run on all commits
actions/actions/setup-java 5.*.* 🟢 5.6
Details
CheckScoreReason
Maintained🟢 57 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 5
Code-Review🟢 10all changesets reviewed
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Packaging⚠️ -1packaging workflow not detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Pinned-Dependencies⚠️ 0dependency not pinned by hash detected -- score normalized to 0
Fuzzing⚠️ 0project is not fuzzed
License🟢 10license file detected
Signed-Releases⚠️ -1no releases found
Security-Policy🟢 9security policy file detected
Branch-Protection⚠️ 0branch protection not enabled on development/release branches
SAST🟢 9SAST tool is not run on all commits -- score normalized to 9
actions/actions/upload-artifact 7.*.* 🟢 6
Details
CheckScoreReason
Binary-Artifacts🟢 10no binaries found in the repo
Maintained🟢 88 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 8
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Code-Review🟢 10all changesets reviewed
Packaging⚠️ -1packaging workflow not detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Pinned-Dependencies⚠️ 1dependency not pinned by hash detected -- score normalized to 1
Fuzzing⚠️ 0project is not fuzzed
License🟢 10license file detected
Signed-Releases⚠️ -1no releases found
Security-Policy🟢 9security policy file detected
Branch-Protection⚠️ 0branch protection not enabled on development/release branches
SAST🟢 10SAST tool is run on all commits
maven/com.github.spotbugs:spotbugs 4.8.6 🟢 6.2
Details
CheckScoreReason
Code-Review🟢 6Found 6/10 approved changesets -- score normalized to 6
Maintained🟢 1030 commit(s) and 8 issue activity found in the last 90 days -- score normalized to 10
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Security-Policy⚠️ 0security policy file not detected
License🟢 10license file detected
Signed-Releases🟢 64 out of the last 5 releases have a total of 4 signed artifacts.
Fuzzing⚠️ 0project is not fuzzed
Pinned-Dependencies🟢 6dependency not pinned by hash detected -- score normalized to 6
Branch-Protection🟢 6branch protection is not maximal on development and all release branches
Packaging🟢 10packaging workflow detected
Binary-Artifacts⚠️ 0binaries present in source code
SAST🟢 7SAST tool is not run on all commits -- score normalized to 7
maven/com.github.spotbugs:spotbugs-maven-plugin 4.8.6.6 🟢 6.1
Details
CheckScoreReason
Code-Review⚠️ 0Found 0/1 approved changesets -- score normalized to 0
Maintained🟢 1030 commit(s) and 10 issue activity found in the last 90 days -- score normalized to 10
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Binary-Artifacts🟢 10no binaries found in the repo
Pinned-Dependencies🟢 10all dependencies are pinned
Security-Policy⚠️ 0security policy file not detected
Fuzzing⚠️ 0project is not fuzzed
License🟢 10license file detected
Signed-Releases⚠️ -1no releases found
Branch-Protection⚠️ -1internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
Packaging🟢 10packaging workflow detected
SAST🟢 10SAST tool is run on all commits
maven/org.pitest:pitest-junit5-plugin 1.2.2 🟢 3.5
Details
CheckScoreReason
Code-Review🟢 3Found 7/18 approved changesets -- score normalized to 3
Maintained⚠️ 00 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Pinned-Dependencies⚠️ 0dependency not pinned by hash detected -- score normalized to 0
Binary-Artifacts🟢 10no binaries found in the repo
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Security-Policy⚠️ 0security policy file not detected
Fuzzing⚠️ 0project is not fuzzed
License🟢 10license file detected
Signed-Releases⚠️ -1no releases found
Packaging🟢 10packaging workflow detected
Branch-Protection⚠️ 0branch protection not enabled on development/release branches
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
maven/org.pitest:pitest-maven 1.17.4 🟢 4.9
Details
CheckScoreReason
Code-Review⚠️ 2Found 2/10 approved changesets -- score normalized to 2
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Maintained🟢 1020 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Binary-Artifacts🟢 9binaries present in source code
Pinned-Dependencies🟢 10all dependencies are pinned
Security-Policy⚠️ 0security policy file not detected
License🟢 10license file detected
Fuzzing⚠️ 0project is not fuzzed
Branch-Protection⚠️ 0branch protection not enabled on development/release branches
Signed-Releases⚠️ -1no releases found
Packaging🟢 10packaging workflow detected
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0

Scanned Files

  • .github/workflows/performance.yml
  • pom.xml

astubbs and others added 2 commits April 16, 2026 12:28
…tect latch

The test stalled for 50+ minutes on CI because:
1. The 20s wait for 50 concurrent requests was too short for
   resource-constrained runners
2. If the wait failed, the WireMock threads were orphaned blocking
   on an unreleased latch, each waiting 30s before timing out

Fixes:
- Increase wait-for-requests from 20s to 120s
- Add @timeout(5 minutes) to the test method
- Move latch release into a finally block so threads are always
  unblocked, even on test failure

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add comprehensive Agent Rules section covering git safety, development
discipline, code quality, test discipline, CI/automation, documentation,
communication, rule sync, and working directory conventions.

Update CI section to reflect current parallel build setup with SpotBugs,
PIT mutation testing, jscpd duplicate detection, and dependency scanning.

These rules were previously scattered across global Claude config and
memory files. Consolidating into AGENTS.md ensures all contributors
and agents working on this project follow the same standards.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Comment thread .github/workflows/maven.yml Fixed
Comment thread .github/workflows/maven.yml Fixed
Comment thread .github/workflows/maven.yml Fixed
Comment thread .github/workflows/maven.yml Fixed
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Copy link
Copy Markdown
Owner Author

@astubbs astubbs left a comment

Choose a reason for hiding this comment

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

looks good to go

astubbs and others added 9 commits April 16, 2026 12:50
The Copilot Autofix commit added two top-level permissions blocks,
which is invalid YAML. Consolidate into a single top-level block
with contents:read, pull-requests:write, checks:write. Remove
redundant per-job permissions blocks. Fix em dash characters.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Run jscpd on both base and PR branches. PR comment now shows a
comparison table with delta. Fails if:
- Total duplication exceeds 3% (absolute ceiling)
- PR introduces more than 2 new duplicate blocks vs base (tolerance: 2)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ones

- Extract duplicate comparison logic to bin/ci-duplicate-report.js
- Fail condition: >3% total OR >0.5% increase vs base
- Always post PR comment with comparison table and pass/fail status
- Annotate new clones directly on the PR diff as review comments
- List new clones separately in the PR comment

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
0.5% was too generous - would allow ~135 new duplicated lines.
0.1% allows ~27 lines, roughly one small duplicated block.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Match clones by content hash (md5 of fragment) instead of file:line
  keys, so line number shifts from refactoring don't create false
  positives
- Use consistent terminology: "clones" everywhere
- Remove the "all duplicate blocks" section from PR comment - run
  jscpd locally if you want the full list
- Show "No new clones introduced" when clean
- Tighten tolerance to 0.1%

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds a parallel CI job that detects semantically similar files using
gensim TF-IDF analysis. Complements the existing jscpd block detection
with whole-file similarity scoring.

Uses our fork with base-vs-PR comparison to report new similarities
introduced by the PR. Fails if any file pair exceeds 80% similarity
or increases by more than 10%.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
PMD CPD has deep Java syntax understanding - fewer false positives
from imports, annotations, and literals. jscpd's language-agnostic
token matching was flagging Java boilerplate as duplication.

Changes:
- Install PMD 7.9.0 as a step in the duplicate-detection job
- Run CPD with --language java --minimum-tokens 70 --format xml
- Rewrite ci-duplicate-report.js to parse CPD XML instead of
  jscpd JSON
- Keep all existing features: base-vs-PR comparison with content
  hash matching, PR comment with delta table, diff annotations
  on new clones, fail conditions (>3% total or >0.1% increase)
- Update AGENTS.md CI section to reflect PMD CPD

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
PMD CPD is more aggressive at detecting Java duplication than jscpd
(3.94% baseline vs 2.65% with jscpd). Raise the absolute ceiling
to 5% so existing code passes. The +0.1% increase rule still
prevents regressions.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 16, 2026

📌 Duplicate code detection tool report

The tool analyzed your source code and found the following degree of similarity between the files:

🔺 Increased similarities

File A File B Base (%) PR (%) Change
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java parallel-consumer-vertx/src/test-integration/java/io/confluent/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 30.1 30.4 +0.3
parallel-consumer-vertx/src/test-integration/java/io/confluent/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 30.1 30.4 +0.3
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 47.2 47.4 +0.2
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 47.2 47.4 +0.2
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 33.2 33.4 +0.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 33.2 33.4 +0.1
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 47.3 47.5 +0.1
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 47.3 47.5 +0.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 58.1 58.3 +0.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 58.1 58.3 +0.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 34.8 34.9 +0.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 34.8 34.9 +0.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 34.8 34.9 +0.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 34.8 34.9 +0.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 30.5 30.6 +0.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 31.6 31.8 +0.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 30.5 30.6 +0.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 31.6 31.8 +0.1
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java parallel-consumer-vertx/src/test-integration/java/io/confluent/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 39.6 39.7 +0.1
parallel-consumer-vertx/src/test-integration/java/io/confluent/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 39.6 39.7 +0.1

...and 76 more

Full similarity report
parallel-consumer-core/src/main/java/io/confluent/csid/utils/Java8StreamUtils.java

📄 parallel-consumer-core/src/main/java/io/confluent/csid/utils/Java8StreamUtils.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/csid/utils/JavaUtils.java 34.93
parallel-consumer-core/src/test/java/io/confluent/csid/utils/CollectionUtils.java 33.14
parallel-consumer-core/src/main/java/io/confluent/csid/utils/JavaUtils.java

📄 parallel-consumer-core/src/main/java/io/confluent/csid/utils/JavaUtils.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/csid/utils/CollectionUtils.java 39.0
parallel-consumer-core/src/main/java/io/confluent/csid/utils/Java8StreamUtils.java 34.93
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 32.73
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 58.28 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 51.88 ⚠️
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 38.37
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 33.39
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 30.61
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 58.28 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 47.43
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 33.15
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 66.3 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 33.3
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 32.73
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerOptions.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerOptions.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/ProducerManager.java 34.3
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/PartitionState.java 33.82
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 51.88 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 47.43
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 41.98
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 32.06
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 31.76
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 41.98
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 33.39
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 33.15
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContext.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContext.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 33.95
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/RecordContextInternal.java 33.75
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContext.java 33.95
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 31.76
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/RecordContextInternal.java 31.51
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 30.61
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/RecordContextInternal.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/RecordContextInternal.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContext.java 33.75
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 31.51
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/BrokerPollSystem.java 33.66
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 32.06
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/ProducerManager.java 30.7
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/BrokerPollSystem.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/BrokerPollSystem.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 33.66
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/ExternalEngine.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/ExternalEngine.java

File Similarity (%)
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 39.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 66.3 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 42.79
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/PCModule.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/PCModule.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/PCModuleTestEnv.java 32.25
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/ProducerManager.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/ProducerManager.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerOptions.java 34.3
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 30.7
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 37.79
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 34.92
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 34.92
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 45.79
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 42.79
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 39.43
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 37.79
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 33.3
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 31.62
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 31.62
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 45.79
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 41.14
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 41.14
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 39.43
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetEncoder.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetEncoder.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetSimpleSerialisation.java 30.79
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetSimpleSerialisation.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetSimpleSerialisation.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetEncoder.java 30.79
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 78.32 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 34.92
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 31.62
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 78.32 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 34.92
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 31.62
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/PartitionState.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/PartitionState.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerOptions.java 33.82
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/PartitionStateManager.java 31.28
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/PartitionStateManager.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/PartitionStateManager.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/WorkManager.java 41.58
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/PartitionState.java 31.28
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/ProcessingShard.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/ProcessingShard.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/ShardManager.java 38.68
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/ShardManager.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/ShardManager.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/ProcessingShard.java 38.68
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/WorkManager.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/WorkManager.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/PartitionStateManager.java 41.58
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/KafkaSanityTests.java

📄 parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/KafkaSanityTests.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/csid/utils/LoopingResumingIteratorTest.java 34.0
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java

📄 parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 55.82 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 47.45
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 38.4
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java

📄 parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 43.99
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 40.62
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 38.4
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/RebalanceEoSDeadlockTest.java

📄 parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/RebalanceEoSDeadlockTest.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/RebalanceTest.java 36.92
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/RebalanceTest.java

📄 parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/RebalanceTest.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/RebalanceEoSDeadlockTest.java 36.92
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java

📄 parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 61.25 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 47.45
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 40.62
parallel-consumer-vertx/src/test-integration/java/io/confluent/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 30.42
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java

📄 parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 61.25 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 55.82 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 43.99
parallel-consumer-vertx/src/test-integration/java/io/confluent/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 39.72
parallel-consumer-core/src/test/java/io/confluent/csid/utils/CollectionUtils.java

📄 parallel-consumer-core/src/test/java/io/confluent/csid/utils/CollectionUtils.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/csid/utils/JavaUtils.java 39.0
parallel-consumer-core/src/main/java/io/confluent/csid/utils/Java8StreamUtils.java 33.14
parallel-consumer-core/src/test/java/io/confluent/csid/utils/LoopingResumingIteratorTest.java

📄 parallel-consumer-core/src/test/java/io/confluent/csid/utils/LoopingResumingIteratorTest.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/KafkaSanityTests.java 34.0
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CoreBatchTest.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CoreBatchTest.java

File Similarity (%)
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorBatchTest.java 51.85 ⚠️
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyBatchTest.java 50.58 ⚠️
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/VertxBatchTest.java 44.58
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithSaslAuthenticationException.java 67.64 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithCommitTimeoutException.java 56.47 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithEarlyClose.java 54.53 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithCommitTimeoutException.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithCommitTimeoutException.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithSaslAuthenticationException.java 73.05 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithEarlyClose.java 65.1 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java 56.47 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithEarlyClose.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithEarlyClose.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithSaslAuthenticationException.java 73.6 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithCommitTimeoutException.java 65.1 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java 54.53 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithSaslAuthenticationException.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithSaslAuthenticationException.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithEarlyClose.java 73.6 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithCommitTimeoutException.java 73.05 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java 67.64 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/ParallelEoSSStreamProcessorRebalancedTest.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/ParallelEoSSStreamProcessorRebalancedTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessorTest.java 34.57
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessorTest.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessorTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/ParallelEoSSStreamProcessorRebalancedTest.java 34.57
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/PCModuleTestEnv.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/PCModuleTestEnv.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/PCModule.java 32.25
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/offsets/OffsetEncodingBackPressureTest.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/offsets/OffsetEncodingBackPressureTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/offsets/OffsetEncodingBackPressureUnitTest.java 40.54
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/offsets/OffsetEncodingBackPressureUnitTest.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/offsets/OffsetEncodingBackPressureUnitTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/offsets/OffsetEncodingBackPressureTest.java 40.54
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/truth/CommitHistorySubject.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/truth/CommitHistorySubject.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/truth/LongPollingMockConsumerSubject.java 36.6
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/truth/LongPollingMockConsumerSubject.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/truth/LongPollingMockConsumerSubject.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/truth/CommitHistorySubject.java 36.6
parallel-consumer-mutiny/src/main/java/io/confluent/parallelconsumer/mutiny/MutinyProcessor.java

📄 parallel-consumer-mutiny/src/main/java/io/confluent/parallelconsumer/mutiny/MutinyProcessor.java

File Similarity (%)
parallel-consumer-reactor/src/main/java/io/confluent/parallelconsumer/reactor/ReactorProcessor.java 54.93 ⚠️
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyBatchTest.java

📄 parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyBatchTest.java

File Similarity (%)
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorBatchTest.java 79.49 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CoreBatchTest.java 50.58 ⚠️
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/VertxBatchTest.java 49.38
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyPCTest.java

📄 parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyPCTest.java

File Similarity (%)
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorPCTest.java 70.12 ⚠️
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyTest.java

📄 parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyTest.java

File Similarity (%)
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorTest.java 34.05
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyUnitTestBase.java

📄 parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyUnitTestBase.java

File Similarity (%)
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorUnitTestBase.java 31.16
parallel-consumer-reactor/src/main/java/io/confluent/parallelconsumer/reactor/ReactorProcessor.java

📄 parallel-consumer-reactor/src/main/java/io/confluent/parallelconsumer/reactor/ReactorProcessor.java

File Similarity (%)
parallel-consumer-mutiny/src/main/java/io/confluent/parallelconsumer/mutiny/MutinyProcessor.java 54.93 ⚠️
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorBatchTest.java

📄 parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorBatchTest.java

File Similarity (%)
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyBatchTest.java 79.49 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CoreBatchTest.java 51.85 ⚠️
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/VertxBatchTest.java 50.61 ⚠️
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorPCTest.java

📄 parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorPCTest.java

File Similarity (%)
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyPCTest.java 70.12 ⚠️
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorTest.java

📄 parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorTest.java

File Similarity (%)
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyTest.java 34.05
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorUnitTestBase.java

📄 parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorUnitTestBase.java

File Similarity (%)
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyUnitTestBase.java 31.16
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java

📄 parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java

File Similarity (%)
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 40.6
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 38.37
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 37.87
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelStreamProcessor.java 33.82
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java

📄 parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java

File Similarity (%)
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 37.87
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelStreamProcessor.java 37.22
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java

📄 parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java

File Similarity (%)
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelStreamProcessor.java 41.26
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 40.6
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/ExternalEngine.java 39.1
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelStreamProcessor.java

📄 parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelStreamProcessor.java

File Similarity (%)
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 41.26
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 37.22
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 33.82
parallel-consumer-vertx/src/test-integration/java/io/confluent/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java

📄 parallel-consumer-vertx/src/test-integration/java/io/confluent/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 39.72
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 30.42
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/VertxBatchTest.java

📄 parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/VertxBatchTest.java

File Similarity (%)
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorBatchTest.java 50.61 ⚠️
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyBatchTest.java 49.38
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CoreBatchTest.java 44.58

astubbs and others added 3 commits April 16, 2026 15:35
… report

Run both engines in the same job for cross-validation during evaluation.
Post one unified PR comment with side-by-side results from each engine.

Per-engine thresholds tuned to baseline:
- PMD CPD: 5% max, +0.1% increase (baseline ~3.94%)
- jscpd:   4% max, +0.1% increase (baseline ~2.65%)

The "max increase vs base" rule is the real safety net regardless of
absolute baseline. PR fails if either engine reports a regression.
Diff annotations use PMD CPD's more accurate clone locations.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Scale emoji reactions based on magnitude:
- Big decrease: heart (celebrate!)
- Modest decrease: thumbs up
- Tiny decrease: slight smile
- Tiny increase: diagonal mouth (hmm)
- Moderate increase: monocle (investigating)
- Big increase: raised eyebrow (concerned)

Makes the report more readable at a glance.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace the inline duplicate-detection job with the extracted, reusable
action. Removes ~55 lines of inline workflow steps and the local
bin/ci-duplicate-report.js script in favor of a single action call.

The action is at https://github.com/astubbs/duplicate-code-cross-check

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants