Skip to content

build(deps): refresh dependencies + build plugins to latest non-major - #73

Merged
astubbs merged 3 commits into
masterfrom
deps/cap-non-major-upgrades
Jul 28, 2026
Merged

astubbs merged 3 commits into
masterfrom
deps/cap-non-major-upgrades

Conversation

@astubbs

@astubbs astubbs commented Jul 28, 2026

Copy link
Copy Markdown
Owner

Ahead of the 0.6.0.0 patch release, this bumps every dependency and build plugin to its newest non-major version and deliberately caps every major - risk-averse for a fork patch release. Majors are reported, not taken.

How the cap is enforced

versions-maven-plugin with -DallowMajorUpdates=false, plus a committed ruleset (bin/deps-version-rules.xml) that also excludes:

  • pre-releases - alpha / beta / -Mn milestone / RC / snapshot (caught slf4j 2.1.0-alpha1, assertj 4.0.0-M1, the Maven-4 4.0.0-beta plugin line)
  • Confluent -ce/-ccs Kafka builds - without this, kafka's "latest" mis-resolves to 8.3.0-ce (a Confluent build) instead of Apache

Applied (non-major)

Dependencies: junit 5.10.2→5.14.4, junit-platform 1.10.2→1.14.4, mockito 5.12.0→5.23.0, truth 1.3.0→1.4.5, assertj 3.24.2→3.27.7 (not 4.0.0-M1), testcontainers 1.19.8→1.21.4, slf4j 2.0.13→2.0.18 (not 2.1.0-alpha1), reactor 3.6.2→3.8.6, mutiny 2.9.4→2.9.5, vertx 4.5.7→4.5.31, lombok 1.18.28→1.18.46, guava 33.2.0→33.6.0, commons-lang3 3.18.0→3.20.0, logback 1.6.0→1.6.1, postgres 42.7.12→42.7.13, plus zstd/snappy/threeten/podam/streamex/flogger/progressbar. Kafka stays at 3.9.1 (already latest 3.x).

Build plugins: compiler 3.12.1→3.15.0, surefire/failsafe 3.2.5→3.5.6, spotbugs 4.8.6→4.10.3, pitest 1.17.4→1.25.8, jacoco 0.8.11→0.8.15, enforcer/jar/javadoc/source/dependency/help/build-helper/install/resources/versions-plugin, and the release-path plugins release 3.0.1→3.3.1, gpg 3.1.0→3.2.8, central-publishing 0.10.0→0.11.0.

Deferred (recorded in docs/inflight.md)

  • Majors: kafka 4.3.1, junit 6.1.2, testcontainers-core 2.0.5, vertx 5.1.5, mutiny 3.3.0, wiremock 3.0.1 (Kafka/JUnit/Vert.x are tied to the Java-baseline move already tracked in the 0.7.x section).
  • Micrometer family (micrometer-core 1.13.0 + micrometer-registry-prometheus 1.12.2): verify caught a real break - Micrometer 1.13 renamed the Prometheus registry package io.micrometer.prometheus → io.micrometer.prometheusmetrics, so 1.17 fails to compile example-metrics/CoreApp.java. Both reverted (family kept aligned) and pinned with in-pom comments; the migration is a follow-up.
  • Maven-4 plugins available only as 4.0.0-beta/3.6.0-M1 (clean/deploy/install/jar/resources/source/compiler, surefire/failsafe, site-plugin M16) - held until GA.

Two things worth a look

  1. Release-path plugin bumps (release, gpg, central-publishing) go live in the very release being prepped. In scope here, but easy to revert to a follow-up if you'd rather not touch the publish path on this patch.
  2. Tests were not run here - verification was mvn -Dlicense.skip -DskipTests verify (all 11 modules compile + SpotBugs pass). CI runs the full suite on this PR.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Dvzjf3ismokntun3GHZzue

Bump every dependency and build plugin to its newest non-major release ahead of
the 0.6.0.0 patch release, capping all major bumps for a risk-averse fork patch.
Enforced via versions-maven-plugin -DallowMajorUpdates=false plus a ruleset
(bin/deps-version-rules.xml) that also excludes pre-releases (alpha/beta/-Mn/RC/
snapshot) and Confluent -ce/-ccs Kafka builds - without the -ce filter, kafka's
"latest" mis-resolves to 8.3.0-ce (a Confluent build) instead of Apache.

Notable deps: junit 5.10.2->5.14.4, junit-platform 1.10.2->1.14.4, mockito
5.12.0->5.23.0, truth 1.3.0->1.4.5, assertj 3.24.2->3.27.7, testcontainers
1.19.8->1.21.4, slf4j 2.0.13->2.0.18, reactor 3.6.2->3.8.6, vertx 4.5.7->4.5.31,
lombok 1.18.28->1.18.46, guava/commons-lang3/logback/postgres/others.
Plugins: compiler 3.12.1->3.15.0, surefire/failsafe 3.2.5->3.5.6, spotbugs
4.8.6->4.10.3, pitest 1.17.4->1.25.8, jacoco 0.8.11->0.8.15, enforcer/jar/
javadoc/source/dependency/help/build-helper/install/resources/versions, and the
release-path plugins release 3.0.1->3.3.1, gpg 3.1.0->3.2.8, central-publishing
0.10.0->0.11.0.

Micrometer held at 1.13.0 / 1.12.2: micrometer 1.13 renamed the Prometheus
registry package (io.micrometer.prometheus -> io.micrometer.prometheusmetrics),
which breaks example-metrics/CoreApp.java. Kept the family aligned and pinned
with in-pom comments. Deferred majors (kafka 4, junit 6, testcontainers 2, vertx
5, mutiny 3, wiremock 3), the micrometer migration, and the Maven-4 pre-release
plugins are all recorded in docs/inflight.md.

Verified: mvn -Dlicense.skip -DskipTests verify (all 11 modules compile +
SpotBugs pass). Full test suite runs in CI.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dvzjf3ismokntun3GHZzue
@github-actions

github-actions Bot commented Jul 28, 2026 •

Copy link
Copy Markdown

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
  • ⚠️ 21 package(s) with unknown licenses.

View full job summary

@github-actions

Copy link
Copy Markdown

❌ 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

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

No new clones introduced by this PR.

❌ jscpd (language-agnostic)

PR Base Change
Clones 85 85 ➖ 0
Duplicated lines 1209 1209 ➖ 0
Duplication 4.18% 4.18% ➖ 0
Rule Limit Status
Max duplication 4% ❌ FAIL (4.18%)
Max increase vs base +0.1% ✅ Pass (+0.00%)

No new clones introduced by this PR.

Powered by astubbs/duplicate-code-cross-check

@github-actions

github-actions Bot commented Jul 28, 2026 •

Copy link
Copy Markdown

📌 Duplicate code detection tool report

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

✅ No new or increased file similarities introduced by this PR.

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 35.02
parallel-consumer-core/src/test/java/io/confluent/csid/utils/CollectionUtils.java 33.2
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.1
parallel-consumer-core/src/main/java/io/confluent/csid/utils/Java8StreamUtils.java 35.02
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 52.16 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 39.97
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PCRetriableException.java 36.4
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 35.76
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 33.81
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 32.37
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 31.89
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 31.89
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.51 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 52.11 ⚠️
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 38.56
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 34.51
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 30.86
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.51 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 47.71
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 34.15
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 30.07
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PCRetriableException.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 36.4
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 32.28
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 53.93 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 52.16 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 44.71
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 34.52
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 32.98
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 33.89
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/PartitionState.java 33.2
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 52.11 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 47.71
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 43.3
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 31.97
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 31.95
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 43.3
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 34.51
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 34.15
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 30.14
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/RecordContextInternal.java 33.91
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 33.79
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.79
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 31.97
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/RecordContextInternal.java 31.67
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 30.86
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.91
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 31.67
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.38
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 31.95
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/ProducerManager.java 30.16
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.38
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.14
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/offsets/EncodingNotSupportedException.java 59.8 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 53.93 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 49.78
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 46.49
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 39.97
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalRuntimeException.java 37.48
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 36.59
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PCRetriableException.java 32.28
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 31.38
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 31.38
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalRuntimeException.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 37.48
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 30.59
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.62
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 33.89
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 30.16
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 51.27 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 36.59
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 35.2
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 35.2
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 34.52
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 33.81
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 32.18
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/internal/InternalException.java 59.8 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 51.27 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 47.93
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 45.28
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 44.71
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 44.56
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 44.56
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 35.76
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalRuntimeException.java 30.59
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/internal/InternalException.java 46.49
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 45.28
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 43.12
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 35.16
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 35.16
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/internal/InternalException.java 49.78
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 47.93
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 43.12
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 32.98
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 32.37
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 32.18
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.87
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.87
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 58.45 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 44.56
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 35.2
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 35.16
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 31.89
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 31.38
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 58.45 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 44.56
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 35.2
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 35.16
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 31.89
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 31.38
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.2
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/PartitionStateManager.java 31.09
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.54
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/PartitionState.java 31.09
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.43
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.43
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.54
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 33.96
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.52 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 47.1
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 38.2
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.74
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 40.42
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 38.2
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.66
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.66
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 60.96 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 47.1
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 40.42
parallel-consumer-vertx/src/test-integration/java/io/confluent/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 30.14
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 60.96 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 55.52 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 43.74
parallel-consumer-vertx/src/test-integration/java/io/confluent/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 39.44
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.1
parallel-consumer-core/src/main/java/io/confluent/csid/utils/Java8StreamUtils.java 33.2
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 33.96
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.83 ⚠️
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyBatchTest.java 50.56 ⚠️
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/VertxBatchTest.java 44.57
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/MockConsumerTestWithCommitTimeoutException.java 55.58 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithEarlyClose.java 54.22 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithSaslAuthenticationException.java 44.91
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/MockConsumerTestWithEarlyClose.java 70.57 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java 55.58 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithSaslAuthenticationException.java 47.44
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/MockConsumerTestWithCommitTimeoutException.java 70.57 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java 54.22 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithSaslAuthenticationException.java 50.11 ⚠️
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 50.11 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithCommitTimeoutException.java 47.44
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java 44.91
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.84
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.84
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/ExceptionConstructorsTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/InternalRuntimeExceptionTest.java 31.35
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/InternalRuntimeExceptionTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/ExceptionConstructorsTest.java 31.35
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.62
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.16
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.16
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 53.54 ⚠️
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.46 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CoreBatchTest.java 50.56 ⚠️
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/VertxBatchTest.java 49.32
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.19 ⚠️
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.23
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.91
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 53.54 ⚠️
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.46 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CoreBatchTest.java 51.83 ⚠️
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/VertxBatchTest.java 50.55 ⚠️
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.19 ⚠️
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.23
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.91
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.44
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 38.56
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 37.99
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelStreamProcessor.java 33.69
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 30.07
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.99
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelStreamProcessor.java 37.29
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 30.14
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.07
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 40.44
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/ExternalEngine.java 39.14
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.07
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 37.29
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 33.69
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.44
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 30.14
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.55 ⚠️
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyBatchTest.java 49.32
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CoreBatchTest.java 44.57

@github-actions

Copy link
Copy Markdown

⚠️ SpotBugs Report

11 bug(s) found (new bugs only — baseline from base branch excluded). See the annotations on the Files Changed tab for details.

@github-actions

Copy link
Copy Markdown

❌ Mutation Testing (PIT) Report

PIT did not produce a report. Most commonly this means a test failed in the baseline (PIT runs all tests unmodified first to establish green) and PIT aborted before mutating. See the "Run PIT mutation testing" step logs for the failing test, then either fix it or add it to -DexcludedTestClasses in the workflow.

@astubbs astubbs left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

lgtm, @claude how about you?

@claude

claude Bot commented Jul 28, 2026 •

Copy link
Copy Markdown

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


Review complete ✅

  • Gather context (PR body, comments, changed files list)
  • Fetch and review actual diff against origin/master
  • Check version-rules ruleset (bin/deps-version-rules.xml) logic
  • Check docs/inflight.md deferrals for accuracy
  • Check pom.xml changes for correctness

Overall

Agreed, this looks good to merge — the non-major-only discipline is well executed, the deferrals in docs/inflight.md are accurate and well-reasoned, and the micrometer revert-and-pin (parallel-consumer-examples/parallel-consumer-example-metrics/pom.xml:26-33, pom.xml:118-121) is exactly the right call given the Prometheus package rename breaks compilation. One real gap worth fixing, plus a couple of things to keep an eye on before merging.

One actionable finding

bin/deps-version-rules.xml isn't wired into the build anywhere. I checked pom.xml's versions-maven-plugin config (pom.xml:997-999) and every script in bin/ — nothing references deps-version-rules.xml, no rulesUri/maven.version.rules anywhere in the repo. So the ruleset that excludes pre-releases and Confluent -ce/-ccs builds only took effect because it was passed manually on the CLI during this session — the next mvn versions:display-dependency-updates (or CI job, if one exists) run without -Dmaven.version.rules=file:./bin/deps-version-rules.xml won't respect it, and could re-suggest 8.3.0-ce or an alpha build. Worth adding a <rulesUri>${project.basedir}/bin/deps-version-rules.xml</rulesUri> to the plugin config (or at least a comment/README note on the required flag) so the cap is actually enforced next time, not just this once.

Things to double-check before merging (not blockers from this diff, but flagged by the automated checks above)

  • SpotBugs: 11 new bugs reported. Given spotbugs jumped 4.8.6 → 4.10.3, it's worth a quick look at whether these are genuinely new findings on the changed dep versions or just new checks in the newer SpotBugs release firing on existing code — the fix differs (suppress vs. actually fix).
  • PIT mutation report failed to generate — "test failed in the baseline" per the tool's own note. Since mvn -Dlicense.skip -DskipTests verify was used for local verification (tests skipped), this is the first signal that something in the bumped test stack (mockito 5.23, junit 5.14.4, testcontainers 1.21.4, etc.) may actually break a test at runtime. Worth checking the "Run PIT mutation testing" step logs once the Build and Test workflow finishes (it was still running as of this review) before merging.
  • jscpd duplication is at 4.18% against a 4% repo-wide limit, but it's a pre-existing condition (+0.00% change vs. base, no new clones) — not something this PR introduced, just noting it's a pre-existing red X unrelated to this change.

On the two questions you raised in the PR body

  1. Release-path plugin bumps (maven-release-plugin, maven-gpg-plugin, central-publishing-maven-plugin) — I'd keep them in this PR rather than deferring. They're non-major, and testing the publish path now (ahead of, not during, the actual release) is lower risk than discovering an issue mid-release.
  2. Tests not run locally — reasonable given the scope, but see the PIT note above; I'd wait for the full Build and Test CI run to go green before merging given it was still pending at review time.

@codecov-commenter

codecov-commenter commented Jul 28, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 78.12%. Comparing base (fefdb9f) to head (8f615f2).

Additional details and impacted files
@@             Coverage Diff              @@
##             master      #73      +/-   ##
============================================
+ Coverage     77.67%   78.12%   +0.44%     
- Complexity       75     1072     +997     
============================================
  Files            82       81       -1     
  Lines          4220     4014     -206     
  Branches        386      372      -14     
============================================
- Hits           3278     3136     -142     
+ Misses          760      705      -55     
+ Partials        182      173       -9     
Flag Coverage Δ
default ?
integration 67.89% <ø> (?)
performance 56.11% <ø> (?)
unit 75.63% <ø> (?)

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

☔ View full report in Codecov by Harness.
📢 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.

…o pom

Two follow-ups after PR #73 CI went red and Claude's review:

1. Pin net.bytebuddy:byte-buddy + byte-buddy-agent to 1.17.7 (the version
   mockito 5.23 ships) in dependencyManagement. The mockito 5.12->5.23 bump
   needs a byte-buddy with the JAVA_V21 field, but wiremock-jre8 2.35.2
   transitively pins byte-buddy 1.12.18, which wins the version conflict and
   lacks it -> every Mockito unit test failed with
   MockitoInitializationException. Local "verify -DskipTests" missed it (tests
   skipped); the full unit suite is now green across all modules. Remove the
   pin when wiremock 3.x (a deferred major) drops the stale transitive.

2. Wire bin/deps-version-rules.xml into the versions-maven-plugin config via
   <rulesUri>, using ${maven.multiModuleProjectDirectory} so it resolves at the
   reactor root (not per-module), so the pre-release / Confluent -ce cap is
   enforced on every run, not only when passed on the CLI. Addresses the review
   finding. Verified: versions:display-dependency-updates now reports kafka
   3.9.1->4.3.1 (Apache) instead of 8.3.0-ce with no CLI flag.

Also record in docs/inflight.md the byte-buddy pin rationale and a second
JUnit 6 blocker: archunit-junit5 has no JUnit 6 engine yet (TNG/ArchUnit#1556).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dvzjf3ismokntun3GHZzue
@astubbs

astubbs commented Jul 28, 2026

Copy link
Copy Markdown
Owner Author

Thanks @claude - pushed 13a90ac2 addressing the review and the red CI.

Red required gates (Unit / Integration / Performance) - root-caused and fixed. As you predicted, verifying with -DskipTests hid a real runtime break: every Mockito test failed with MockitoInitializationException / NoSuchFieldError: JAVA_V21. Cause: mockito 5.12 -> 5.23 needs a newer Byte Buddy, but the ancient wiremock-jre8 2.35.2 transitively pins byte-buddy 1.12.18, which wins the conflict and lacks JAVA_V21. Fix: pin byte-buddy/byte-buddy-agent to 1.17.7 (mockito's version) in dependencyManagement, test-scoped. The full unit suite is now green locally across all modules (257 + 14 + 11 + ... , 0 failures/errors). Documented in docs/inflight.md to remove the pin when wiremock 3.x (a deferred major) lands.

Actionable finding (ruleset not wired in) - fixed. Added <rulesUri> to the versions-maven-plugin config, using ${maven.multiModuleProjectDirectory} so it resolves at the reactor root (not per-module). Verified: versions:display-dependency-updates with no CLI flag now reports kafka 3.9.1 -> 4.3.1 (Apache) instead of 8.3.0-ce.

Watch-items:

  • SpotBugs 11 new findings - these are new checks in SpotBugs 4.10 firing on existing code (local verify SpotBugs check passed, build didn't fail); will confirm suppress-vs-fix, not a blocker for this PR.
  • PIT - cascaded from the failing unit tests; should clear now that they pass.
  • jscpd 4.18% - pre-existing (+0.00% vs base), unrelated to this PR.

Release-path plugins: keeping them in, per your reasoning (test the publish path ahead of the release). Waiting on the CI re-run to confirm green before merge.

@claude

claude Bot commented Jul 28, 2026 •

Copy link
Copy Markdown

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


Tasks

  • Gather context (trigger comment, prior review, changed files)
  • Verify byte-buddy pin fix for Mockito/wiremock conflict
  • Verify rulesUri wiring in versions-maven-plugin
  • Check docs/inflight.md updates for accuracy
  • Check CI status for this commit
  • Post final verdict

Verified 13a90ac2

Byte-buddy pin (pom.xml:113-121, pom.xml:400-414) — root-cause diagnosis checks out. mockito-core and wiremock-jre8 are both declared <scope>test</scope> in dependencyManagement (pom.xml:350-355, pom.xml:519-524), and the new byte-buddy/byte-buddy-agent entries don't override scope — so they correctly inherit test from whichever parent pulls them in transitively (mockito). "Test/provided only, not shipped" is accurate. Pinning to 1.17.7 (mockito 5.23's own byte-buddy version) is the right fix for a nearest-wins conflict against wiremock's stale 1.12.18. Good catch, and good that it surfaced via full-suite CI rather than shipping silently — this is exactly the failure mode -DskipTests verification can't see.

rulesUri wiring (pom.xml:1015-1023) — file://${maven.multiModuleProjectDirectory}/bin/deps-version-rules.xml is the correct variable (resolves to the reactor root regardless of which module the plugin runs from; ${project.basedir} would've broken for child-module invocations). This closes the gap from the earlier review — the pre-release/Confluent--ce cap is now enforced by default, not just when passed on the CLI.

docs/inflight.md — both additions read correctly: the byte-buddy pin is documented with removal criteria (drop when wiremock 3.x lands), and the new ArchUnit/JUnit 6 blocker (no archunit-junit6 engine yet, TNG/ArchUnit#1556) is a legitimate additional reason to defer that major, independent of the Java-baseline reasoning already there.

No new issues found in this diff.

CI status

Build and Test and Claude Code Review are still in progress as of this comment — the earlier red run was on the prior commit (42a642f), so this is the first real signal on whether the byte-buddy fix actually turns the required gates green. Worth confirming those finish successfully before merging, but nothing in the diff itself gives reason to expect otherwise given the stated local verification (full unit suite green, 0 failures/errors).
· branch

…ollow-up

The spotbugs 4.8.6->4.10.3 bump in this branch expands the AT_* multithreading
detectors, so the SpotBugs PR job reports 11 "new" findings. They are
pre-existing, not introduced here: this PR changes no src/main java, and the CI
baseline was generated with the old 4.8.6, so 4.10.3's new detectors fire on
existing code. All are atomicity / thread-visibility observations in
parallel-consumer-core (AbstractParallelEoSStreamProcessor, ConsumerManager,
RetryQueue). Documented with locations and a fix plan; not a blocker - master's
push build regenerates the baseline with 4.10.3 after merge.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dvzjf3ismokntun3GHZzue
@astubbs

astubbs commented Jul 28, 2026

Copy link
Copy Markdown
Owner Author

SpotBugs 4.10 "11 new bugs" - looked into it, written up in docs/inflight.md.

They are not introduced by this PR - it changes no src/main/**/*.java. The CI SpotBugs baseline was generated with the old 4.8.6, but the PR analyzes with the bumped 4.10.3, whose expanded multithreading (AT_*) detectors fire on pre-existing code. All 11 are in parallel-consumer-core:

  • AT_NONATOMIC_OPERATIONS_ON_SHARED_VARIABLE (8) - non-atomic read-modify-write on a shared field:
    • AbstractParallelEoSStreamProcessor.numberOfAssignedPartitions (420, 448, 463)
    • ConsumerManager counters noWakeups (143, 226), erroneousWakups (201, 233), correctPollWakeups (111)
  • AT_STALE_THREAD_WRITE_OF_PRIMITIVE (3) - primitive written in one thread may not be visible to another (missing volatile/sync):
    • AbstractParallelEoSStreamProcessor.lastWorkRequestWasFulfilled (979)
    • ConsumerManager.commitRequested (287)
    • RetryQueue.closed (287)

These are genuine-looking thread-visibility/atomicity observations worth fixing as their own task - several sit in the poll/control-thread coordination that the confluentinc#857 single-thread refactor is already reworking, so patching piecemeal now could conflict. Not a blocker for this deps PR: after merge, master's push build regenerates the SpotBugs baseline with 4.10.3 and they drop out of "new". Fix plan (make the counters Atomic*, mark flags volatile, or fold into confluentinc#857) tracked in docs/inflight.md. (Bonus: ConsumerManager.erroneousWakups is a pre-existing typo worth fixing while there.)

@astubbs
astubbs merged commit 6b59dde into master Jul 28, 2026
15 of 18 checks passed
@astubbs
astubbs deleted the deps/cap-non-major-upgrades branch July 28, 2026 23:53
astubbs added a commit that referenced this pull request Jul 29, 2026
…fresh)

Clean auto-merge (no conflicts). Brings in #73's non-major dependency + build-plugin
bumps (junit 5.14.4, testcontainers 1.21.4, mockito 5.23.0, byte-buddy 1.17.7 pin,
surefire/spotbugs/pitest plugin bumps). #69's unit-suite forking and the module-local
jackson pin are preserved.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Jul 29, 2026
…elog entries (#74)

* docs(changelog): list the pre-release dependency refresh; refine the no-bumps note

The 2022 upstream-era "dependency version bumps are not listed here" convention
fits routine Dependabot noise, but for a library the runtime dependency versions
(above all the Kafka client) affect the transitives and compatibility consumers
inherit. Refine the note: still skip routine/automated bumps, but summarise
notable/coordinated refreshes and user-facing runtime deps under the version.

Add an Unreleased "Dependencies" entry for the #73 non-major refresh, calling out
that the Kafka client stays on 3.9.1 with all majors deliberately deferred.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dvzjf3ismokntun3GHZzue

* docs(agents): require agents to add CHANGELOG entries for user-visible changes

AGENTS.md had no changelog guidance, so agents (and contributors) had no cue to
update CHANGELOG.adoc. Add a Changelog section mirroring the refined policy:
add entries for behavioural/API changes, new features/modules, user-affecting
fixes, and notable/coordinated dependency refreshes or user-facing runtime-dep
changes (esp. the Kafka client); skip routine Dependabot bumps, internal
refactors, test-only changes, CI/tooling and docs. Notes README.adoc is
generated from CHANGELOG.adoc and the fork's #NN reference convention.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dvzjf3ismokntun3GHZzue

* docs(changelog): move deps + self-hosted-tests entries under 0.6.0.0

These landed on master before 0.6.0.0 was cut and ship in it, so they belong in
the 0.6.0.0 release notes, not Unreleased (which is now empty and removed).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dvzjf3ismokntun3GHZzue

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Jul 29, 2026
…needs a plugin)

#73 bumped pitest 1.17.4 -> 1.25.8. In 1.25.x the `-DwithHistory` shorthand requires
the commercial arcmutate history plugin and hard-fails without it:
  "History has been enabled but no history plugin has been installed/activated"
- which is why the PIT job started failing in ~48s (not the #69 excludedTestClasses
change, which PIT accepted fine).

Switch to the built-in file-based incremental history via explicit
-DhistoryInputFile/-DhistoryOutputFile at a fixed /tmp path (no plugin needed), and
cache that exact file. Keeps incremental analysis; drops the plugin dependency.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Jul 29, 2026
…tructure)

#74 removed the `== Unreleased` section and folds pending work into `== 0.6.0.0`
(still -SNAPSHOT), and added a =Dependencies= entry for #73. Resolved the CHANGELOG
conflict by following that structure: dropped Unreleased, folded #69's user-facing
entries into 0.6.0.0 (StreamsApp DI under a new =Examples=; a concise forked-unit-suite
+ ArchUnit test-placement line under =Build & CI=), and dropped #69's now-duplicate
Self-Hosted Tests entry (already in master's 0.6.0.0).

Regenerated README.adoc from the merged CHANGELOG so the two stay consistent (also
fixes the pre-existing README/CHANGELOG drift #74 left on master).

#74 is docs-only; no code changed, so no test rerun needed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Jul 29, 2026
…s shelved

Capture the escalation path for PIT speed: pitest 1.25.x (from #73) needs the paid
arcmutate history plugin for incremental analysis (free for OSS, but needs manual
signup + a licence file at repo root + a commercial-plugin dep). Shelved because the
no-history + excludedTestClasses approach should stay under the cap; revisit only if
PIT's full-sweep time creeps toward the timeout.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Jul 29, 2026
…t-feedback + config cleanups

Optional Mac fast-feedback (pr-mac-fast-feedback.yml): runs the forked unit/integration
suites (and PIT) on the self-hosted mac-laptop for fast feedback on a multi-core box (forked
unit ~1:39 vs GitHub's 2-core ~5:49). Non-gating (continue-on-error, not required) so the
laptop being offline never blocks a merge; the required gate stays on GitHub-hosted infra.
SECURITY: guarded to SAME-REPO pull requests (head.repo == this repo) so a fork PR's untrusted
code never runs on the home machine (RCE); uses pull_request (no secrets), never
pull_request_target. The suites are a matrix so they can run concurrently given 2+ runner
instances. Declares the macOS runner label for actionlint.

Mutation testing (PIT) moved off GitHub's 2-core runner onto the self-hosted Mac:
- PIT is CPU-bound and process-parallel across minion JVMs, so it scales with cores. On the
  2-core runner a full internal.* sweep was impractically slow (threads maxed the cores; 17+ min
  without finishing). New bin/ci-mutation-test.sh runs it with -Dthreads defaulting to the box's
  core count (override PIT_THREADS; RAM = threads x 2g), so ~12 threads on the Mac is ~5-6x faster.
  Removed the GitHub-hosted mutation-testing job entirely.
- Scope: targetClasses stays internal.* (the engine); -DexcludedTestClasses=integrationTests.*
  stops per-mutant runs re-running the slow Docker integration tests (which had blown the 300-min
  cap). Note this restricts which TESTS run per mutant, NOT which classes are mutated - it's still
  a full sweep. Coverage-minion heap is -Xmx2g (1g OOM'd, 4g completes on the heavy PC classes).
- No incremental history: #73 bumped pitest 1.17.4 -> 1.25.8, which dropped built-in file-based
  history entirely - -DwithHistory AND explicit -DhistoryInputFile now both hard-fail without the
  commercial arcmutate history plugin. Removed all history flags. The changed-classes-only speedup
  (arcmutate git plugin, free for OSS) is tracked as the escalation path in docs/inflight.md.

Config:
- jscpd duplicate-code absolute cap 4% -> 5% (matches PMD CPD). The repo baseline is already ~4.2%,
  so a 4% cap failed on every PR including the base branch; the real regression guard is the
  per-engine "max increase vs base" check.
- Disable the experimental "Kafka Compat (experimental 4.x)" job (if: false) - it's continue-on-error
  so never gated, but showed a red X on every PR; re-enable when the Kafka 4.x migration begins.
astubbs added a commit that referenced this pull request Jul 29, 2026
…t-feedback + config cleanups

Optional Mac fast-feedback (pr-mac-fast-feedback.yml): runs the forked unit/integration
suites (and PIT) on the self-hosted mac-laptop for fast feedback on a multi-core box (forked
unit ~1:39 vs GitHub's 2-core ~5:49). Non-gating (continue-on-error, not required) so the
laptop being offline never blocks a merge; the required gate stays on GitHub-hosted infra.
SECURITY: guarded to SAME-REPO pull requests (head.repo == this repo) so a fork PR's untrusted
code never runs on the home machine (RCE); uses pull_request (no secrets), never
pull_request_target. The suites are a matrix so they can run concurrently given 2+ runner
instances. Declares the macOS runner label for actionlint.

Mutation testing (PIT) moved off GitHub's 2-core runner onto the self-hosted Mac:
- PIT is CPU-bound and process-parallel across minion JVMs, so it scales with cores. On the
  2-core runner a full internal.* sweep was impractically slow (threads maxed the cores; 17+ min
  without finishing). New bin/ci-mutation-test.sh runs it with -Dthreads defaulting to the box's
  core count (override PIT_THREADS; RAM = threads x 2g), so ~12 threads on the Mac is ~5-6x faster.
  Removed the GitHub-hosted mutation-testing job entirely.
- Scope: targetClasses stays internal.* (the engine); -DexcludedTestClasses=integrationTests.*
  stops per-mutant runs re-running the slow Docker integration tests (which had blown the 300-min
  cap). Note this restricts which TESTS run per mutant, NOT which classes are mutated - it's still
  a full sweep. Coverage-minion heap is -Xmx2g (1g OOM'd, 4g completes on the heavy PC classes).
- No incremental history: #73 bumped pitest 1.17.4 -> 1.25.8, which dropped built-in file-based
  history entirely - -DwithHistory AND explicit -DhistoryInputFile now both hard-fail without the
  commercial arcmutate history plugin. Removed all history flags. The changed-classes-only speedup
  (arcmutate git plugin, free for OSS) is tracked as the escalation path in docs/inflight.md.

Config:
- jscpd duplicate-code absolute cap 4% -> 5% (matches PMD CPD). The repo baseline is already ~4.2%,
  so a 4% cap failed on every PR including the base branch; the real regression guard is the
  per-engine "max increase vs base" check.
- Disable the experimental "Kafka Compat (experimental 4.x)" job (if: false) - it's continue-on-error
  so never gated, but showed a red X on every PR; re-enable when the Kafka 4.x migration begins.
astubbs added a commit that referenced this pull request Jul 29, 2026
Bring #57 current with master (release-notes #72, deps refresh #73/#74, unit-suite
parallelisation #68, refactoring backlog #67, self-hosted CI, etc.). Only
CHANGELOG.adoc conflicted: the 0.6.0.0 Fixes now lists master confluentinc#892 (per-commit
OffsetMapCodecManager fix) alongside this PR confluentinc#859 (List->Set + assignment-path
caching) and confluentinc#893 - complementary, kept all three. Regenerated README.adoc from the
merged CHANGELOG via the asciidoc-template plugin.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Jul 29, 2026
…nores

Our dependabot.yml had no grouping, so every dependency opened its own PR -
which is how jackson-databind arrived as a standalone PR (#76) rather than
being part of the curated versions-maven-plugin dependency sweep (#73).

- Add a `maven-non-major` group so routine minor/patch bumps collapse into one
  reviewable PR per run instead of a swarm of one-per-dependency PRs. The
  curated sweep remains the real driver; this is just a low-noise heads-up.
- Declare `ignore:` rules for deps we manage by hand or that are deferred
  majors (jackson-databind, micrometer family, kafka/junit/testcontainers/
  vertx/mutiny/wiremock). Declaring these in version control is better than
  `@dependabot ignore` PR comments, whose ignore conditions live invisibly in
  Dependabot's server-side state with no in-repo explanation.
- Record the jackson-databind hold in docs/inflight.md - a module-local,
  test-scoped pin coupled to WireMock's Jackson (global pinning breaks
  VertxTest with HTTP 500); bump it in the next sweep with an example-metrics
  integration-test check.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Jul 30, 2026
…nores (#78)

* ci(dependabot): group non-major maven bumps + declare hand-managed ignores

Our dependabot.yml had no grouping, so every dependency opened its own PR -
which is how jackson-databind arrived as a standalone PR (#76) rather than
being part of the curated versions-maven-plugin dependency sweep (#73).

- Add a `maven-non-major` group so routine minor/patch bumps collapse into one
  reviewable PR per run instead of a swarm of one-per-dependency PRs. The
  curated sweep remains the real driver; this is just a low-noise heads-up.
- Declare `ignore:` rules for deps we manage by hand or that are deferred
  majors (jackson-databind, micrometer family, kafka/junit/testcontainers/
  vertx/mutiny/wiremock). Declaring these in version control is better than
  `@dependabot ignore` PR comments, whose ignore conditions live invisibly in
  Dependabot's server-side state with no in-repo explanation.
- Record the jackson-databind hold in docs/inflight.md - a module-local,
  test-scoped pin coupled to WireMock's Jackson (global pinning breaks
  VertxTest with HTTP 500); bump it in the next sweep with an example-metrics
  integration-test check.

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

* ci(dependabot): also ignore net.bytebuddy (frozen workaround pin)

byte-buddy is deliberately held at mockito's version to override the ancient
byte-buddy wiremock-jre8 2.35.2 drags in (which breaks mockito with
MockitoInitializationException). A Dependabot bump buys nothing and risks
re-breaking that; the pin is meant to be removed entirely when wiremock moves to
3.x, not bumped independently. Ignore it until then (covers PR #81).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019r7Lis8xMdwczrFLrYNRbj

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Aug 4, 2026
…dy said otherwise

The automated reviewer flagged this contradiction on five consecutive passes
and it kept being deferred. It was right, and it was not a nitpick: the plan
doc asserted "the basic history file is free in OSS pitest, confirm whether the
free tier covers what we want", while docs/inflight.md records the opposite as
an already-verified PR #69 finding - 1.25.x dropped file-based history when #73
bumped 1.17.4 -> 1.25.8.

Settled by running it rather than by choosing which document to believe:

  [ERROR] History has been enabled but no history plugin has been installed/activated.
  [ERROR] If you are using https://www.arcmutate.com remember to activate the history plugin

So there is no free tier to check. History lives entirely in arcmutate, and the
work item is obtaining and wiring a licence - free for OSS, but needing
maintainer signup and a licence file at the repo root, which on a public repo
means a committed key or a CI secret. The existing shelved plan in inflight.md
covers that; §4.2 now points at it rather than duplicating it.

The correction is written in place, with the reproduction, rather than the
section being quietly rewritten - the same treatment as the other two
corrections in this doc. inflight.md gains the re-verification date so the next
reader finds agreement instead of a contradiction to arbitrate.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Aug 6, 2026
…e's blind spot

Review found the fourth instance of the pattern a few lines below the
third fix. Swept the whole file this time instead of catching one more
instance, using the gate's own stripQualified() so "unqualified" means
exactly what CI means by it.

Twenty-four references in the closed-upstream-PR catalogue were bare and
are now written out and hyperlinked. The trap that makes this worth the
verbosity: upstream #356's own title is "fixes #29: Faster record
producing", and a bare #29 here autolinks to FORK #29, which is the
paused-consumption-after-rebalance fix. Same number, unrelated work.

Three more the review did not spot, found by sweeping:

- L132, L144: "#200" means upstream #200 (shared-nothing), but fork #200
  exists - it is docs(build) #180 about ManagedTruth. The gate passes
  this, because the number resolves. It just resolves to the wrong
  issue.
- L224: "#233" means upstream #233; no fork #233 exists, so the gate
  would have caught this one had it been an added line.

That asymmetry is now documented in AGENTS.md: the gate flags bare
numbers that FAIL to resolve, so a wrong reference that happens to
resolve sails through, and looks fine. As fork numbering grows the
collisions increase, so this gets worse rather than better.

Verified the remaining bare numbers in the file (#143, #131, #101, #73,
#57, #110, #117, #142, #40) are all genuine fork references.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QqHpNSXC39ANv9kG1ZvUzn
astubbs added a commit that referenced this pull request Aug 14, 2026
…correct the survey it was wrong about

Review findings on this branch, all four verified by running before and after.

CORRECTION TO THE PREVIOUS COMMIT ON THIS BRANCH. Its message says "18 owner
LGTMs" in one place and "sixteen" in another. Both are wrong, and so was every
copy of that claim in the tree. The real figure, re-derived from
repos/astubbs/parallel-consumer/pulls/<n>/reviews over all 181 PRs, is 50 owner
LGTM reviews across 38 PRs, from #63 to #292. That commit cannot be rewritten,
so this one states the correction.

1. THE SELF-TEST COULD NOT SEE A DISABLED STEP, ONLY A DELETED ONE

The four coupling cases were `grep -F` substring searches over the workflow
TEXT, and a substring search cannot tell a step that RUNS from one that merely
APPEARS. Measured on a scratch copy: `if: false` on the step, `|| true` on its
pipeline, `; true`, `set +e`, `continue-on-error: true`, and commenting the
entire step out ALL left the suite green at 42/42. One case - `grep -F
'bin/check-human-lgtm.sh'` - was satisfied by two header comments alone, so it
stayed green with the step deleted outright.

That is the failure class in
docs/solutions/workflow-issues/a-check-that-reports-success-without-having-run.md
occurring inside the guard written to prevent it, which is why it is worth more
than its blast radius suggests.

The coupling section now parses the step out of the workflow - comments dropped
first, so a commented-out step reads as an absent one - and asserts on its
structure: it exists, it reads the reviews endpoint, its marker matches, its
`if:` is neither a never-true constant nor changed from the intended guard,
nothing in it swallows the checker's exit status, and the checker invocation is
its last command. All eight sabotages above now go red; the unsabotaged copy
stays green.

Deliberately awk rather than python3 + PyYAML, though PyYAML does import here.
This suite runs as a step of a REQUIRED check, ahead of the gate it protects,
so a dependency of it is a thing that can brick every open PR by being absent
from a runner image. The indentation rules it needs are the only YAML involved.

2. THE EMPIRICAL CLAIM JUSTIFYING CASE-INSENSITIVITY WAS FALSE, IN FOUR PLACES

Claimed: 18 LGTMs, #210 to #292, all the lower-case bare word. Actual: 50,
across 38 PRs, #63 to #292. Forty-nine are `lgtm`; ONE, on #84, is `Lgtm`.
Forty-six are the bare word alone on a line; four carry a trailing clause, one
of which - #73's "lgtm, @claude how about you?" - ends in a question mark.

The true data argues for the design harder than the false data did. `Lgtm`
is a live counterexample proving case-insensitivity is load-bearing rather
than merely generous: without it this repo has a stamp on record that the
checker would call missing. #73 is a real passing body containing a `?`, which
is why the `?` clause rejects only a `?` touching the token. Both are now self-
test cases (8c, 8d). The one clause that WAS true and is load-bearing - all 50
are COMMENTED reviews, not approvals - is kept.

The count also sat inside an assertion LABEL, so a passing test printed a false
claim on every run. Labels now name the PR the body came from instead.

3. README DROPPED `claude-review` FROM "JOB NAMES ARE AN API"

That list named only the new job, while `claude-review` is the context ruleset
15055005 actually requires throughout cutover steps 1-3. Someone reading it
before performing step 5 could conclude the old name is no longer an API and
delete the transitional job BEFORE the ruleset swap - the exact bricking the
workflow header warns about, arrived at by following the docs. Restored, marked
transitional, with the ordering spelled out.

4. THE CANONICAL CONTRACT WAS OWNED TWICE

docs/ci.md declares itself canonical and says everything else links to it; this
branch then added a seven-clause restatement of a rule bin/check-human-lgtm.sh
heads "THE MATCHING RULE, IN FULL". Both cannot own it, and the drift was not
hypothetical - the false survey above was pasted into four files and rotted in
all four inside one PR.

Split by altitude: docs/ci.md owns the GATE contract (what satisfies the gate),
bin/check-human-lgtm.sh owns the MATCHING RULE (what satisfies the human half).
The script wins the second because it is the executable truth - its prose sits
beside the awk implementing it, and prose and code in one file cannot drift
unnoticed. AGENTS.md's substantive clause, which sat two lines above the
sentence forbidding exactly that, is reduced to rule-plus-pointer.

FOUR CHECKER BUGS, EACH PINNED BY A CASE PROVEN TO FAIL WITHOUT THE FIX

- A marker line bearing this run's token but a lost field was read as more of
  the PREVIOUS review's body, merging the next reviewer's words into the
  previous segment. A six-field marker for `mallory` after an `astubbs` segment
  reported "astubbs submitted a review containing LGTM". Not reachable from
  today's --jq, but one `; next` removes the forgery path. (21c)
- scan() advanced PAST each token it examined, discarding the character the
  next candidate needs to see, so glued repeats walked through the whole-word
  guard: `LGTMLGTM` passed a rule under which neither half of it does, and
  `xLGTMLGTM` passed one that refuses `xLGTM`. (11b, 11c)
- A trailing `\r` defeated the fence-close test, so a CRLF body never closed a
  fence and swallowed every LGTM after it. Not live - 0 of 365 owner bodies
  carry a CR - which is why it needed a case rather than a wait. (12f)
- Three clauses survived deletion with the suite green: the marker NAME check,
  the fence info-string clause, and the fence-character clause (no `~~~` fence
  appeared anywhere in the suite). Inputs added that flip under each. (21b,
  12d, 12e)

Also: docs/ci.md said there were three human-half reds when there are four -
the catch-all "Could not scan this PR's reviews" does not start with NO HUMAN
LGTM ON THIS PR, which defeated the "tell them apart without opening the job"
promise in the same paragraph. The fourth is now listed, and named as the one
that means the instrument broke rather than the work is outstanding.

DELIBERATELY NOT CHANGED. `not LGTM/LGTM` returns 0. The negator rule considers
only the word TOUCHING the token, and the second token's preceding character is
a slash; making it 1 needs a negation detector that reads past an intervening
token, which is the unbounded cleverness the script refuses by name. Pinned as
case 10e so nobody widens it while fixing the glued-repeat bug beside it.

VERIFIED. 55 self-test cases green. Both gate self-tests, check-shell-sigpipe,
check-copyright-headers, check-issue-refs, check-docs-data, check-action-
versions: all pass. Eight workflow sabotages red after, six of them green
before. Seven checker mutations each turn exactly the intended new case red.
Replayed against live API data for all 78 PRs carrying reviews: 38 green, zero
false positives, zero false negatives against an independently written matcher.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BhF637Ywr7MiKkxaR11Up3
astubbs added a commit that referenced this pull request Aug 14, 2026
593 lines of checker and 855 of self-test, to answer "did Antony say
lgtm". It parsed code fences, blockquotes, negation forms, glued repeats,
CRLF line endings and typographic apostrophes - defences against an
attacker who is also the only person the check protects. The last thing
the previous round was doing was widening a bracket class because a
typographic apostrophe is three UTF-8 bytes.

The rule as stated: a review by the owner whose body contains lgtm, any
case, anywhere. That is now what the code says.

The marker machinery went with it, and that is the interesting part. It
existed because the workflow streamed every review as flat text - marker
line, body, marker line, body - so a body could forge a segment header and
mint an owner LGTM out of a stranger's comment. Hence an unguessable token
per run. Filtering on .user.login with jq BEFORE any text is looked at
removes the attack, so the token defends nothing and is gone. The reviews
endpoint gives "a review, not a comment" for free.

Behaviour is unchanged where it matters: case-insensitive, anywhere in the
body, submitted reviews only, and still not head-sensitive - review state
is not consulted, because the ruleset dismisses stale reviews on push and
consulting state would silently un-stamp a PR the owner had already
stamped.

Verified against the real data rather than fixtures alone: PR #206
reads LGTM-present, #298 and #299 read absent, which is
correct in all three cases. The self-test keeps the two real spellings the
repo's history contains - Lgtm on #84, and the mid-sentence form
ending in a question mark on #73 - plus a negative control proving
the check can fail at all.

15 lines and 11 cases, from 593 and ~55.
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.

2 participants