Skip to content

docs(build) astubbs#180: explain why ManagedTruth "cannot be found", and point the enforcer at the fix (confluentinc#861) - #200

Open
astubbs wants to merge 6 commits into
masterfrom
docs/180-build-recipe
Open

docs(build) astubbs#180: explain why ManagedTruth "cannot be found", and point the enforcer at the fix (confluentinc#861)#200
astubbs wants to merge 6 commits into
masterfrom
docs/180-build-recipe

Conversation

@astubbs

@astubbs astubbs commented Aug 5, 2026

Copy link
Copy Markdown
Owner

Description

Closes the diagnosis half of #180 (mirror of upstream #861): contributors try to run the tests, hit io.confluent.parallelconsumer.ManagedTruth.assertThat cannot be found, and reasonably conclude the build is broken. It isn't - they ran the wrong command, and nothing in the repo told them otherwise.

Root cause (verified on this branch, not inherited from triage)

ManagedTruth and its ~155-file *Subject family are generated, not source. truth-generator-maven-plugin writes them into parallel-consumer-core/target/generated-test-sources/ at the generate-test-sources phase, and target/ is git-ignored. Any invocation that doesn't reach that phase leaves them absent, and every test doing import static io.confluent.parallelconsumer.ManagedTruth.assertThat; fails to compile. The same phase runs build-helper's add-test-source, so the same mistake also produces package io.confluent.parallelconsumer.integrationTests does not exist.

Every row below was re-run for this PR (JDK 17). The compile rows were re-run a second time after review, against an isolated local repository containing none of this project's own snapshots - see the note under the table:

Command Outcome
./mvnw clean install -DskipTests BUILD SUCCESS, 155 files generated
./mvnw test-compile (root) BUILD SUCCESS, 11/11 modules
./mvnw -pl parallel-consumer-core -am test-compile BUILD SUCCESS
./mvnw -pl parallel-consumer-core test-compile BUILD FAILURE - enforcer ReactorModuleConvergence at validate
./mvnw compile (root), fresh .m2 BUILD FAILURE at parallel-consumer-vertx [3/11] - Could not find artifact ...:parallel-consumer-core:jar:tests:... in central
./mvnw compile (root), test-jar already cached BUILD SUCCESS and generates nothing - the quieter trap
./mvnw -pl parallel-consumer-core compiler:testCompile (IDE-shaped) the reported error, reproduced verbatim

This matches the prior triage pass on both claimed points, so nothing in the issue needed correcting.

Correction after review (acd176d7): the first pass recorded ./mvnw compile as a silent trap - BUILD SUCCESS, generating nothing. That was an artefact of the machine it ran on, whose ~/.m2 already held parallel-consumer-core-0.6.0.0-SNAPSHOT-tests.jar from an earlier install. On a genuinely fresh clone compile is not silent: it stops before test-compile, so core's tests classifier jar is never produced inside the reactor, and vertx's test-scoped dependency on it fails to resolve - which reads like a broken repository or a network outage. That makes it a worse trap than documented, and it is now documented as such, with both cache states and the literal error text. Re-verified by hard-linking a copy of ~/.m2/repository, deleting bz/stub/parallelconsumer from the copy, and building with -Dmaven.repo.local pointed at it - which leaves the shared repo intact and re-downloads nothing.

What changed, in decreasing order of how much it helps

  • AGENTS.md gains a Building and running the tests section: the fresh-clone recipe (./mvnw clean install -DskipTests), why the assertions aren't in source control, the literal error text so searching for ManagedTruth lands here, the invocation table above, and the IDE case. The old ## How to Build script list folds into it rather than sitting alongside as a second, competing answer to the same question.

  • pom.xml puts a <message> on the enforcer's reactorModuleConvergence rule. Its default text - "Module parents have been found which could not be found in the reactor" - is exactly what -pl <module> prints, and it names no fix. It now names -am and explains that a subset build is also how you reach the ManagedTruth error. Verified output:

    [ERROR] Rule 4: org.apache.maven.enforcer.rules.ReactorModuleConvergence failed with message:
    [ERROR] Module parents have been found which could not be found in the reactor.
    [ERROR] This build was invoked on a SUBSET of the reactor (e.g. `-pl <module>`), so the parent POM is not in it.
    [ERROR]   Build the whole reactor:      ./mvnw test-compile          (from the repo root)
    [ERROR]   ...or pull in dependencies:   ./mvnw -pl <module> -am test-compile
    [ERROR] A subset build also skips `generate-test-sources`, which is where the Google Truth assertion subjects
    [ERROR] (io.confluent.parallelconsumer.ManagedTruth and friends) are generated - so it is also how you end up with
    [ERROR] "cannot find symbol: class ManagedTruth". See "Building and running the tests" in AGENTS.md.
    

    The message body is left-aligned in the POM on purpose - Maven echoes it verbatim, one [ERROR] line per newline, so indenting it to match the surrounding XML reprints that indentation in the contributor's terminal. There's a comment saying so.

  • bin/build.sh's own usage example was bin/build.sh -pl parallel-consumer-core - precisely the broken invocation, documented as the way to do it. Now -am, with a note.

The code-side call

The brief asked whether a cheap code change could stop people hitting this at all. Two were worth doing and are in this PR: the enforcer message (the confusing failure now carries its own fix) and the bin/build.sh example (the repo was actively teaching the broken command). Both are a few lines, verified, and can't regress anything - the full reactor still builds green with them.

Three were considered and rejected, with reasoning recorded in docs/inflight/parked-generated-truth-build-traps.md:

  • A guard for the IDE path. This is the galling one: an IDE compiling test sources itself is the most likely way a newcomer meets this bug, and it's the one path still producing only a raw cannot find symbol. But an IDE never runs Maven's validate, so no enforcer rule (requireFilesExist on the generated dir, say) can reach it - it would add a failure mode for CLI users while doing nothing for the people who need it. A real fix is an IDE-specific run configuration or .idea/ pre-build step: per-IDE, unverifiable in CI, and gold-plating until someone reports the docs didn't land.
  • Checking the generated sources into git. Defeats the generator and lets them drift silently against the classes they assert on.
  • Flipping cleanTargetDir to true. It would wipe the truth-assertions-templates output on every build, and those templates are the half a human is meant to be able to extend.

That inflight note also records a reproducible footgun found while verifying: cleanTargetDir=false means the plugin doesn't repair a partially-deleted output dir. From a good build, rm -rf parallel-consumer-core/target/generated-test-sources then ./mvnw install -DskipTests regenerates only 135 of 155 files and fails with ~190 cannot find symbol errors inside the generated code itself (ManagedTruth.java referencing ParallelConsumerOptionsSubject, CommitModeSubject, ...). clean install is fine. Documented as "don't hand-delete parts of target/" rather than fixed, for the cleanTargetDir reason above.

The underlying test-jar coupling (astubbs#132 / confluentinc#162) is untouched - removing it means extracting the shared test fixtures into their own module, a real refactor rather than a doc fix. Worth noting that mirror's title: "mvn compile fails if test-jar of parallel-consumer-core was not previously installed" - the fresh-clone failure corrected below, filed from the other end and open since 2021. The docs now connect the two.

Rebased on master (#198, #211)

Merged origin/master. One conflict, in src/docs/development/upstream-map.yaml, resolved in master's favour - and it removes a change this PR previously made:

#211 mirrored all 78 open upstream issues into this fork and shrank that manifest to track upstream PRs only, deleting the whole UPSTREAM ISSUES block including the issue-162-861-906-build-friction entry this branch had been updating. AGENTS.md now states the rule directly: "If the work maps to an upstream issue, the fork mirror is where status goes". This work maps to confluentinc#861, whose mirror is #180 - so re-adding the entry would reintroduce exactly the duplication #211 removed. The manifest edit is therefore dropped, not restored. The upstream side of confluentinc#861 remains tracked on master under upstream-pr-901-licence-check.

#211 also made an unqualified #NN below 1000 a CI failure on added lines. This branch predated that. Running .github/scripts/issue-ref-gate.js over the diff flagged seven bare refs across AGENTS.md, bin/build.sh, pom.xml and the parked note; all now name their repo, fork first, hyperlinked where the format allows. The gate now reports zero.

While checking this branch's text still read correctly beside #211's new CI-list entry, found an unrelated stale one: AGENTS.md listed .github/workflows/shell-hygiene.yml, which no longer exists - 1b040cb0 folded it into repo-hygiene.yml and left the old bullet behind, so the list documented two workflows for one file. Removed it, folding into the survivor the two details only it carried (the SIGPIPE inversion needs >64 KiB after the match to bite; shellcheck does not catch it). Happy to split that out if you would rather it travelled separately.

Scope notes

README.adoc / src/docs/README_TEMPLATE.adoc and CHANGELOG.adoc are deliberately untouched - sibling branches own those this round. AGENTS.md is the contributor-facing home here (there is no CONTRIBUTING file).

Checklist

Refs #180, confluentinc#861.

🤖 Generated with Claude Code

…nt the enforcer at the fix

Contributors run the tests, hit
"io.confluent.parallelconsumer.ManagedTruth.assertThat cannot be found", and
reasonably conclude the build is broken. It is not - they ran the wrong command,
and nothing in the repo told them so.

ManagedTruth and its ~155-file *Subject family are GENERATED, not source:
truth-generator-maven-plugin writes them into
parallel-consumer-core/target/generated-test-sources at the generate-test-sources
phase, and target/ is git-ignored. Any invocation that does not reach that phase
leaves them absent, and every test that does
`import static io.confluent.parallelconsumer.ManagedTruth.assertThat;` fails to
compile. The same phase runs build-helper's add-test-source, so the same mistake
also yields "package io.confluent.parallelconsumer.integrationTests does not
exist".

Verified on this branch (JDK 17, offline):

  ./mvnw clean install -DskipTests            BUILD SUCCESS, 155 files generated
  ./mvnw test-compile                         BUILD SUCCESS, 11/11 modules
  ./mvnw -pl parallel-consumer-core -am \
         test-compile                         BUILD SUCCESS
  ./mvnw -pl parallel-consumer-core \
         test-compile                         BUILD FAILURE, enforcer
                                              reactorModuleConvergence at validate
  ./mvnw compile                              BUILD SUCCESS *and generates
                                              nothing* - the trap
  ./mvnw -pl parallel-consumer-core \
         compiler:testCompile                 the reported error, reproduced

Three changes, in decreasing order of how much they help:

- AGENTS.md gains "Building and running the tests": the fresh-clone recipe, why
  the assertions are not in source control, the literal error text (so searching
  for it lands here), a table of which invocations work and which fail, and the
  IDE case. The old "How to Build" script list folds into it rather than sitting
  alongside as a second, competing answer.

- pom.xml puts a <message> on the enforcer's reactorModuleConvergence rule. Its
  default text - "Module parents have been found which could not be found in the
  reactor" - is what `-pl <module>` prints, and it names no fix. It now names
  `-am`, and explains that a subset build is also how you arrive at the
  ManagedTruth error. The message body is left-aligned on purpose: Maven echoes
  it verbatim, one [ERROR] line per newline.

- bin/build.sh's own usage example was `bin/build.sh -pl parallel-consumer-core`
  - precisely the broken invocation, documented as the way to do it. Now `-am`.

Deliberately NOT done, with reasoning in
docs/inflight/parked-generated-truth-build-traps.md: no guard for the IDE path
(it skips validate, so an enforcer rule cannot reach it, and checking generated
sources into git defeats the generator), and no change to cleanTargetDir=false
(flipping it would wipe the user-extensible truth-assertions-templates output
every build). That note also records the reproducible partial-regeneration
footgun - hand-deleting generated-test-sources yields 135 of 155 files and ~190
cannot-find-symbol errors inside the generated code - and that the underlying
#132 / upstream #162 test-jar coupling is untouched.

Upstream-Issue: confluentinc#861
Forwarded: not-needed
Applied-Upstream: no

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

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown

Dependency Review

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

Scanned Files

None

@claude

claude Bot commented Aug 5, 2026

Copy link
Copy Markdown

Claude is reviewing this PR

Tasks

  • Gather context (PR body, diff, changed files)
  • Read AGENTS.md and repo guidelines
  • Review each changed file (AGENTS.md, bin/build.sh, pom.xml, docs/inflight/parked-generated-truth-build-traps.md, upstream-map.yaml)
  • Verify build/enforcer claims where feasible
  • Post final review

View job run

@github-actions

github-actions Bot commented Aug 5, 2026

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 28 28 ➖ 0
Duplicated lines 850 850 ➖ 0
Duplication 2.50% 2.50% ➖ 0
Rule Limit Status
Max duplication 5% ✅ Pass (2.50%)
Max increase vs base +0.1% ✅ Pass (+0.00%)

No new clones introduced by this PR.

✅ jscpd (language-agnostic)

PR Base Change
Clones 75 75 ➖ 0
Duplicated lines 1087 1087 ➖ 0
Duplication 3.24% 3.24% ➖ 0
Rule Limit Status
Max duplication 5% ✅ Pass (3.24%)
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 Aug 5, 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.32
parallel-consumer-core/src/test/java/io/confluent/csid/utils/CollectionUtils.java 33.26
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.51
parallel-consumer-core/src/main/java/io/confluent/csid/utils/Java8StreamUtils.java 35.32
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 54.27 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 40.23
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PCRetriableException.java 36.86
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 36.83
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 35.15
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 35.13
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 35.13
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 33.94
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 60.98 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 54.77 ⚠️
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 40.4
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 37.06
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 32.69
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 31.45
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 60.98 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 50.67 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 36.76
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 32.44
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 31.64
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 30.2
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.86
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 33.06
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/ExceptionInUserFunctionException.java 54.27 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 53.15 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 44.85
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 34.9
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 33.55
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 30.9
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 30.9
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalRuntimeException.java 30.85
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 32.25
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 54.77 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 50.67 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 45.51
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 33.94
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 33.02
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 31.13
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 45.51
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 37.06
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 36.76
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 32.63
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 35.45
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 32.33
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/ParallelEoSStreamProcessor.java 33.94
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/RecordContextInternal.java 33.12
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 32.69
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContext.java 32.33
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 31.64
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 35.45
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 33.12
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 33.02
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.55
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 60.5 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 53.15 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 50.84 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 48.73
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 40.23
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalRuntimeException.java 39.58
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 37.14
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 33.78
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 33.78
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PCRetriableException.java 33.06
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 39.58
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 31.5
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 30.85
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.87
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 32.25
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/ProducerManagerTest.java 30.55
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.59 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 37.51
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 37.51
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 37.14
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 35.15
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 34.9
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 32.75
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 60.5 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 51.59 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 48.33
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 47.19
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 47.19
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 46.67
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 44.85
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 36.83
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalRuntimeException.java 31.5
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 48.73
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 46.67
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 45.26
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 38.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 38.1
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 50.84 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 48.33
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 45.26
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 33.94
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 33.55
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 32.75
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 31.52
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 31.52
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 63.46 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 47.19
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 38.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 37.51
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 35.13
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 33.78
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 31.52
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 30.9
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 63.46 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 47.19
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 38.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 37.51
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 35.13
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 33.78
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 31.52
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 30.9
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/state/PartitionStateManager.java 30.46
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 39.62
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/PartitionState.java 30.46
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 36.7
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 36.7
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 39.62
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/BrokerIntegrationTest.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/state/LatestResetTailNudgeIT.java 30.64
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/DrainingMemberRebalanceIT.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/BrokerPollSystemDrainTest.java 31.37
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.02
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.48 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 46.95
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 38.65
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 44.15
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 41.11
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 38.65
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.44
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.44
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.67 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 46.95
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 41.11
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.67 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 55.48 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 44.15
parallel-consumer-vertx/src/test-integration/java/io/confluent/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 39.17
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 48.75
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java 35.63
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 48.75
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 38.01
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java 30.17
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkCooperativeIT.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java 49.17
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkCooperativeIT.java 49.17
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 35.63
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 30.17
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 38.01
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/state/LatestResetTailNudgeIT.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/BrokerIntegrationTest.java 30.64
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.51
parallel-consumer-core/src/main/java/io/confluent/csid/utils/Java8StreamUtils.java 33.26
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.02
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/BatchTestBase.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CoreBatchTest.java 30.61
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CheckQuarantineOwnersScriptTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/QuarantineLaneReportScriptTest.java 45.1
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/QuarantineRegistryScriptTest.java 44.29
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CommitRejectionTestBase.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java 32.51
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerCommitTimeoutTest.java 32.43
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 52.04 ⚠️
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyBatchTest.java 50.74 ⚠️
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/VertxBatchTest.java 44.86
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/BatchTestBase.java 30.61
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerCommitTimeoutTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerEarlyCloseTest.java 70.39 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java 56.99 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerSaslAuthenticationTest.java 49.53
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CommitRejectionTestBase.java 32.43
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerEarlyCloseTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerCommitTimeoutTest.java 70.39 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java 55.45 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerSaslAuthenticationTest.java 52.92 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerSaslAuthenticationTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerEarlyCloseTest.java 52.92 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerCommitTimeoutTest.java 49.53
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java 46.92
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/MockConsumerCommitTimeoutTest.java 56.99 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerEarlyCloseTest.java 55.45 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerSaslAuthenticationTest.java 46.92
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CommitRejectionTestBase.java 32.51
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.69
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.69
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/QuarantineLaneReportScriptTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CheckQuarantineOwnersScriptTest.java 45.1
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/QuarantineRegistryScriptTest.java 33.45
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/QuarantineRegistryScriptTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CheckQuarantineOwnersScriptTest.java 44.29
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/QuarantineLaneReportScriptTest.java 33.45
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/TestConventionsArchTest.java

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

File Similarity (%)
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/TestConventionsArchTest.java 90.33 ⚠️
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/TestConventionsArchTest.java 89.67 ⚠️
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/TestConventionsArchTest.java 89.67 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/BrokerPollSystemDrainTest.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/DrainingMemberRebalanceIT.java 31.37
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 30.06
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 30.06
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.87
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/ProducerManagerTest.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 31.13
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.02
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.02
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.44
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.44
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 52.21 ⚠️
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 78.98 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CoreBatchTest.java 50.74 ⚠️
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/VertxBatchTest.java 49.08
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 71.18 ⚠️
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 32.47
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 32.15
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/TestConventionsArchTest.java

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

File Similarity (%)
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/TestConventionsArchTest.java 91.12 ⚠️
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/TestConventionsArchTest.java 90.45 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/TestConventionsArchTest.java 89.67 ⚠️
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 52.21 ⚠️
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 78.98 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CoreBatchTest.java 52.04 ⚠️
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/VertxBatchTest.java 50.33 ⚠️
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 71.18 ⚠️
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 32.47
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 32.15
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/TestConventionsArchTest.java

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

File Similarity (%)
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/TestConventionsArchTest.java 91.12 ⚠️
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/TestConventionsArchTest.java 90.45 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/TestConventionsArchTest.java 89.67 ⚠️
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 41.54
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 40.4
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 39.88
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelStreamProcessor.java 35.45
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 32.44
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 39.88
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelStreamProcessor.java 39.32
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 32.63
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 31.45
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 30.2
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.7
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 41.54
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/ExternalEngine.java 39.55
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.7
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 39.32
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 35.45
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.17
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/TestConventionsArchTest.java

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

File Similarity (%)
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/TestConventionsArchTest.java 91.12 ⚠️
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/TestConventionsArchTest.java 91.12 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/TestConventionsArchTest.java 90.33 ⚠️
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.33 ⚠️
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyBatchTest.java 49.08
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CoreBatchTest.java 44.86

@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown

✅ SpotBugs Report

No bugs found (new bugs only — baseline from base branch excluded).

AGENTS.md requires the manifest to be updated at every lifecycle transition of
our own work, in the same commit that causes it. The PR number does not exist
until the PR is opened, so this is the first commit that can carry it.

status: in-progress -> pr-open, prs: [] -> [200].

Upstream-Issue: confluentinc#861
Forwarded: not-needed
Applied-Upstream: no

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

claude Bot commented Aug 5, 2026

Copy link
Copy Markdown

Claude finished @astubbs's task in 10m 24s —— View job


Claude finished reviewing this PR

Tasks

  • Gather context (PR body, diff, changed files)
  • Read AGENTS.md and repo guidelines (incl. docs/inflight/AGENTS.md conventions)
  • Review each changed file (AGENTS.md, bin/build.sh, pom.xml, docs/inflight/parked-generated-truth-build-traps.md, upstream-map.yaml)
  • Verify build/enforcer claims by actually running the commands (JDK/Maven present, network available)
  • Post final review

Summary

This is a well-scoped, well-reasoned docs PR, and most of its "verified" claims genuinely hold up — I reproduced them directly rather than trusting the table. One specific claim is wrong, though, and it's the one row of the table that matters most for the audience this doc targets.

Finding: the ./mvnw compile "silent trap" claim doesn't reproduce on a fresh checkout

AGENTS.md (new table, ~line 60) and docs/inflight/parked-generated-truth-build-traps.md both state:

./mvnw compile (root) → BUILD SUCCESS and generates nothing — "the trap"

I tested this directly, twice, from a state with no pre-existing ~/.m2 artifacts for this project (i.e. the actual "fresh clone" scenario the doc is written for):

$ ./mvnw compile
...
[INFO] Building Kafka Parallel Consumer Vert.x 0.6.0.0-SNAPSHOT          [3/11]
...
[ERROR] Failed to execute goal on project parallel-consumer-vertx: Could not resolve dependencies
for project bz.stub.parallelconsumer:parallel-consumer-vertx:jar:0.6.0.0-SNAPSHOT:
bz.stub.parallelconsumer:parallel-consumer-core:jar:tests:0.6.0.0-SNAPSHOT was not found in
https://repo1.maven.org/maven2/ ...
[INFO] BUILD FAILURE

It's not a silent success — it's an immediate, loud failure on module 3/11 (parallel-consumer-vertx), citing a missing dependency that looks like a network/repo problem. Root cause: compile stops before test-compile, so parallel-consumer-core's test classes never get built in this reactor run, and the in-reactor resolution vertx relies on for the test-scoped core:jar:tests dependency has nothing to point at (that classifier snapshot isn't on Central).

By contrast, I confirmed ./mvnw test-compile (root) genuinely does succeed 11/11 as claimed — the reactor runs core through test-compile before vertx needs it, so that row is accurate. The PR's own table says these rows were "re-run ... offline"; offline mode cannot possibly get a BUILD SUCCESS on compile unless parallel-consumer-core:jar:tests was already cached from an earlier install — which means that specific verification wasn't actually run against a fresh .m2, despite the framing.

Everything else checked out under the same direct reproduction:

  • Enforcer reactorModuleConvergence message (pom.xml:895-919) — reproduced verbatim, exact match to the PR body.
  • ./mvnw -pl parallel-consumer-core -am test-compile — BUILD SUCCESS, confirmed.
  • ./mvnw -pl parallel-consumer-core test-compile (no -am) — fails at validate with the enforcer message, confirmed.
  • 155 generated files under target/generated-test-sources, incl. ManagedTruth.java — exact count confirmed.
  • IDE-shaped ./mvnw -pl parallel-consumer-core compiler:testCompile — reproduces cannot find symbol: class ManagedTruth verbatim, confirmed (after clearing stale target/test-classes left over from an earlier run — worth knowing if you re-verify this one, stale compiled classes can mask the failure).

Suggested fix: update the AGENTS.md table row and the parked-doc's row to describe the real failure (DependencyResolutionException naming parallel-consumer-core:jar:tests, at the parallel-consumer-vertx module) instead of "BUILD SUCCESS ... the trap", and note that a silent success is only possible if that test-jar is already cached locally from a prior install.

Fix this →

Other notes (no changes needed)

  • docs/inflight/parked-generated-truth-build-traps.md follows the directory's own convention correctly (parked- prefix, per docs/inflight/AGENTS.md) and the fork/upstream #NN vs upstream #NN reference convention is applied consistently throughout.
  • src/docs/development/upstream-map.yaml entry format matches sibling entries; PR/branch/status fields correctly filled in.
  • pom.xml's enforcer <message> is left-aligned as documented, with a comment explaining why — parses fine, and I confirmed Maven echoes it exactly as intended.
  • No stale references to the old ## How to Build heading elsewhere in the repo.
  • Diff stat matches PR metadata exactly (5 files, +197/-5).

…h clone

Review caught the one row of the invocation table that mattered most, and it was
wrong. The table claimed `./mvnw compile` (root) is a *silent* trap - BUILD
SUCCESS while generating nothing. On a genuinely fresh clone it is not silent at
all: it dies on module 3/11.

  [ERROR] Failed to execute goal on project parallel-consumer-vertx: Could not
  resolve dependencies ...: Could not find artifact
  bz.stub.parallelconsumer:parallel-consumer-core:jar:tests:0.6.0.0-SNAPSHOT in
  central (https://repo1.maven.org/maven2/)

`compile` stops before `test-compile`, so core's `tests` classifier jar is never
produced inside that reactor run, and vertx's test-scoped dependency on it has
nothing to resolve against. Which makes it a worse trap than documented, not a
lesser one: it reads like a broken repository or a network outage.

The original "BUILD SUCCESS" observation was an artefact of the machine it was
run on - a developer ~/.m2 already holding
parallel-consumer-core-0.6.0.0-SNAPSHOT-tests.jar from an earlier install. Both
outcomes are now recorded, since both are real depending on cache state, and
neither generates anything.

Re-verified both, this time isolating the local repository so the fresh-clone
case is actually the fresh-clone case: hard-link a copy of ~/.m2/repository,
delete bz/stub/parallelconsumer from the copy, build with -Dmaven.repo.local
pointed at it. That leaves the shared ~/.m2 untouched and re-downloads nothing.

  ./mvnw compile, isolated repo  BUILD FAILURE at parallel-consumer-vertx [3/11]
  ./mvnw compile, cached repo    BUILD SUCCESS, and the truth-generator goal does
                                 not appear in core's goal list at all

AGENTS.md gets a short subsection spelling out both cases with the literal error
text, so someone who searches for the vertx dependency error also lands on the
answer. The parked note records the isolation technique, because the mistake it
prevents is one a future session would otherwise repeat.

Upstream-Issue: confluentinc#861
Forwarded: not-needed
Applied-Upstream: no

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

astubbs commented Aug 5, 2026

Copy link
Copy Markdown
Owner Author

Review response

Replying here rather than in-thread because the review landed as a single top-level comment - the PR has no inline review threads (reviewThreads is empty), so there is nothing to resolve.

The ./mvnw compile finding: correct, and worse than I wrote. Fixed in acd176d7

You were right, and the diagnosis of why I got the wrong answer was right too. Reproduced your failure verbatim:

[ERROR] Failed to execute goal on project parallel-consumer-vertx: Could not resolve dependencies
for project bz.stub.parallelconsumer:parallel-consumer-vertx:jar:0.6.0.0-SNAPSHOT: Could not find
artifact bz.stub.parallelconsumer:parallel-consumer-core:jar:tests:0.6.0.0-SNAPSHOT in central
(https://repo1.maven.org/maven2/)

Module 3/11, exactly as you described. And the cause of the bad row was precisely what you inferred - the machine's ~/.m2 already contained parallel-consumer-core-0.6.0.0-SNAPSHOT-tests.jar from an earlier install, so compile resolved vertx's test-scoped dependency out of cache and sailed through. I confirmed that file was sitting there before touching anything.

To re-verify without wrecking a shared ~/.m2 (nine sibling branches are building against it right now), I hard-linked a copy and deleted only this project's own snapshots from it:

cp -Rl ~/.m2/repository "$TMP/repository"
rm -rf "$TMP/repository/bz/stub/parallelconsumer"
./mvnw compile -Dmaven.repo.local="$TMP/repository"

Hard links mean the copy costs nothing and re-downloads nothing, and deleting from the copy leaves the original intact (verified after the fact). Both states now measured:

./mvnw compile (root) Result
isolated repo, no project snapshots BUILD FAILURE at parallel-consumer-vertx [3/11], DependencyResolutionException
normal cached repo BUILD SUCCESS, and truth-generator does not appear in core's goal list at all

So the section's thesis survives - compile still generates nothing either way - but the framing was backwards. I had it as the quiet trap; on a fresh clone it is the loudest failure in the table, and the loudness is the problem: it names Central and a missing artifact, so it reads like a broken repo or a network outage, which is exactly the wrong conclusion. That is a better argument for the docs than the one I originally made.

Changes:

  • AGENTS.md - the table row now says "Fails, and misleadingly", and a new subsection "./mvnw compile looks like a broken repo, and is not" spells out both cache states with the literal error text, so someone searching for the vertx dependency error lands on the answer too, not just someone searching for ManagedTruth.
  • docs/inflight/parked-generated-truth-build-traps.md - both rows recorded, plus the isolation technique, written up as the method to use for any future fresh-clone claim. That note exists to stop a future session re-triaging from scratch, and "verify fresh-clone behaviour on a warm .m2" is exactly the mistake it should be preventing.
  • PR body - the table row and the "offline" framing you flagged are both corrected, with the correction called out explicitly rather than quietly rewritten.

Also taking the target/test-classes note: stale compiled classes masking the IDE-shaped failure is a real hazard for anyone re-running that check, and it is now recorded alongside the -o caveat in the parked doc.

On the rest

Nothing else to push back on - your other checks (enforcer message verbatim, -am behaviour, the 155-file count, the IDE-shaped reproduction, parked- naming, the #NN vs upstream #NN convention) match what I have, and I have left those as they are.

Two things I want on record as deliberate rather than overlooked, since they are the kind of thing a later pass tends to "tidy":

  • The enforcer <message> body in pom.xml is left-aligned on purpose. Maven echoes it verbatim, one [ERROR] line per newline, so indenting it to match the surrounding XML reprints that indentation in the contributor's terminal. There is a comment in the POM saying so - thanks for confirming it renders as intended.
  • No IDE-side guard, despite the IDE being the likeliest way to meet this bug. An IDE never runs Maven's validate, so no enforcer rule can reach that path; adding one would create a failure mode for CLI users while doing nothing for the people who actually need it. Reasoning is in the parked note.

@claude

claude Bot commented Aug 5, 2026

Copy link
Copy Markdown

Claude finished @astubbs's task in 3m 54s —— View job


Claude finished reviewing this PR

Tasks

  • Gather context (PR body, diff, prior review thread, author's response)
  • Read AGENTS.md and repo guidelines
  • Review the fix commit acd176d7 (the ./mvnw compile correction) against the prior finding
  • Re-verify the corrected build claims by actually running the commands
  • Review the rest of the diff for anything new since the last review
  • Post final review

Summary

The fix commit (acd176d7) resolves the finding from the previous review pass correctly. I independently re-ran the commands rather than trusting the writeup, and everything now checks out.

Re-verification of the correction

Previously flagged: the doc claimed ./mvnw compile (root) is a silent trap (BUILD SUCCESS, generates nothing). That was true only because the reviewing machine's ~/.m2 already had parallel-consumer-core's tests classifier jar cached from an earlier install.

I ran ./mvnw compile twice against this session's own ~/.m2 (first -o, then without), and both times it failed loudly at module 3/11 (parallel-consumer-vertx) rather than succeeding silently:

[ERROR] Failed to execute goal on project parallel-consumer-vertx: Could not resolve dependencies
for project bz.stub.parallelconsumer:parallel-consumer-vertx:jar:0.6.0.0-SNAPSHOT:
bz.stub.parallelconsumer:parallel-consumer-core:jar:tests:0.6.0.0-SNAPSHOT was not found in
https://repo1.maven.org/maven2/ during a previous attempt. This failure was cached...

That's the same failure mode the fixed docs now describe (missing core:jar:tests, because compile stops before test-compile) — the exact wording differs slightly from the docs' quoted text only because Maven caches failed-resolution metadata locally once you've hit it once (an artifact of my two-pass test, not a docs inaccuracy). The updated AGENTS.md (./mvnw compile looks like a broken repo, and is not) and docs/inflight/parked-generated-truth-build-traps.md both now correctly document this as a loud BUILD FAILURE on a fresh repo, with the quieter silent-success case correctly scoped to "test-jar already cached."

Other claims re-verified directly (all confirmed)

  • ./mvnw test-compile (root): BUILD SUCCESS, 11/11 modules — reproduced.
  • 155 generated .java files under parallel-consumer-core/target/generated-test-sources — exact count confirmed.
  • ./mvnw -pl parallel-consumer-core test-compile (no -am): fails at validate with the enforcer ReactorModuleConvergence message — reproduced verbatim, matches pom.xml and the AGENTS.md table exactly.
  • The maven-release-plugin preparationGoals: clean install comment referenced in AGENTS.md's Related section exists at pom.xml:626-648 as described.
  • No stale references anywhere in the repo to the old ## How to Build heading.
  • bin/build.sh's new usage example (-pl parallel-consumer-core -am) is consistent with the AGENTS.md text that points to it.

Minor note (not blocking)

I wasn't able to run scripts/upstream-map.py or a standalone yaml.safe_load to mechanically validate src/docs/development/upstream-map.yaml's new folded-scalar block (python3 execution wasn't permitted in this sandbox). Visual inspection shows consistent indentation and a legitimate blank-line paragraph break inside the notes: > block, matching the format of sibling entries in the same file, so I have no reason to think it's malformed — just flagging that this one check is unverified mechanically rather than by me.

Verdict

No blocking issues. The correction is accurate, thorough, and re-verified independently; the rest of the diff (pom.xml enforcer message, bin/build.sh, upstream-map.yaml entry) is unchanged since the last pass and still holds up.
(branch)

@astubbs

astubbs commented Aug 5, 2026

Copy link
Copy Markdown
Owner Author

Closing the one item the review couldn't check mechanically

The second review pass flagged that it couldn't run yaml.safe_load on src/docs/development/upstream-map.yaml's new folded-scalar block (no python3 in that sandbox), so it verified the block by eye only. Ran it here:

YAML parses OK; top-level keys: ['last_swept', 'upstream_repo', 'fork_repo', 'entries']

The issue-162-861-906-build-friction entry loads clean, and the manifest fields are what the commit claimed:

fork:
  branches: [docs/180-build-recipe]
  prs: [200]
  status: pr-open

The folded notes: block round-trips to a single 1213-char string with the intended paragraph break preserved, and - worth checking given what this PR corrected - it does not repeat the bad mvn compile claim anywhere. It lists mvn compile only among the invocations that leave the generated sources absent, which is true regardless of cache state, and its "Verified:" sentence covers only test-compile, clean install -DskipTests and the -pl enforcer failure. So no third copy of the error to chase.

No code change from this, so nothing further pushed. All checks green on acd176d7.

astubbs added a commit that referenced this pull request Aug 5, 2026
…nism

AGENTS.md's "Upstream tracking" section still told agents to "clear a `todo:`
line when you do the thing" and said "`upstream-map.py todo` is what a future
session reads to find the loose ends". Both were removed in the previous commit,
so an agent following that guidance runs a command that prints usage and exits 1,
then looks for a field that no longer exists.

It now says where loose ends actually go - docs/inflight/ - and why the field
was dropped: nearly every entry read "rebase PR #N, it is 57 behind master",
which `git rev-list --left-right --count` answers and cannot get wrong.

THIS IS THE THIRD TIME IN THIS PR. The stale gate description, the retired
backlink section, and now this: each time a commit changed a mechanism and left
a DIFFERENT section of the same file describing the old one, because that section
was not in the diff being edited. The pattern is that AGENTS.md documents
mechanisms in several places and only the edited one gets revisited.

So this commit greps rather than guesses, and that turned up one the review did
not catch: docs/TODO_INDEX.md still indexed markers from the schema-comment lines
deleted last commit. It is generated and CI fails when stale, so it is
regenerated here - 87 markers.

Also: collapsed the four-blank-line run left in upstream-map.py by removing the
two functions, and hyperlinked docs/refactoring.md's "upstream #233 / #200" list
form, which the CI gate cannot reach because the line pre-dates this PR.

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

astubbs commented Aug 5, 2026

Copy link
Copy Markdown
Owner Author

Scope note for whoever picks this up

This PR deliberately does not close #180, and there is no closing link in the description. On merge, #180 stays open. That is intentional, not an oversight.

Done here: the diagnosis half. Documents why io.confluent.parallelconsumer.ManagedTruth.assertThat "cannot be found" (the assertions are generated by truth-generator-maven-plugin at generate-test-sources), gives the correct fresh-clone recipe, and points the enforcer message at -am.

Not done, and the reason #180 stays open: the test-jar coupling itself (#132 / upstream #162). Removing it means extracting the shared test fixtures - KafkaTestUtils, AbstractParallelEoSStreamProcessorTestBase, LongPollingMockConsumerSubject - into their own module. That is a real refactor, not a doc fix.

Decision needed before #180 is closed by hand: either wait for that refactor, or re-scope #180 to the documentation and open a separate issue for the module extraction. Do not close #180 on the strength of this PR alone - a contributor hitting the classpath error still hits it; they just now have an answer.

Related: PR #202 moved LongPollingMockConsumer to the main artefact, which does not reduce this coupling - every module still needs the tests classifier for the three classes above.

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 confluentinc#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 6, 2026
The convention was "a bare #NN is this fork". That cannot work: the
fork's numbers sit entirely inside upstream's range. Of the 51 numbers
cited across this PR's files, 48 exist in BOTH repos meaning different
things - #29 is our rebalance fix and upstream's async-sending request,
#114 is a docs PR here and a GPG-key issue there. Every bare number was
a coin flip a reader had to re-verify.

Below #1000 a reference now says which repo it means: #119 or
upstream confluentinc#857, or a hyperlink. At or above #1000 only this fork can have
one, so bare is unambiguous. "fork" is not the qualifier - this repo IS
a fork, so the word names nothing.

The gate becomes purely textual. It previously asked "does this number
resolve here?", which passed #200 - a real fork issue about ManagedTruth
- while the author meant upstream #200, shared-nothing architecture. A
wrong reference that resolves is worse than a broken one, because
nothing looks amiss. Textual checking also drops the per-number API
calls, so it cannot race issue creation.

The threshold is a bet with ~78 numbers of headroom: upstream is at confluentinc#922
and gains ~6 a year, but is dormant rather than archived. Rather than
rely on anyone noticing, upstream-sweep.sh should warn as it thins.

Swept 117 references in the files this PR touches, classifying each
against both repos rather than prefixing blind - the mistake a previous
sweep made. That includes the source comments behind docs/TODO_INDEX.md:
the index is generated, so the fix belongs in the Java comment, not the
generated file. Java changes are comments and one string literal only.

The rest of the tree - ~400 refs across ~65 files - is deliberately left
for a single follow-up pass, tracked in
docs/inflight/next-qualify-remaining-refs.md. The gate only inspects
added lines, so it does not block on them.

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 6, 2026
Review found AGENTS.md asserting both things at once. The paragraph
added with the textual gate said it "has no blind spot"; the paragraph
immediately below it, written an hour earlier, was titled "The gate has
a blind spot you have to cover yourself" and spent five lines describing
the blind spot of the existence-check design that had just been
replaced. Two adjacent paragraphs, opposite claims, same mechanism.

Removed the stale one - the case it describes (#200 silently passing
because it resolves) is now a named test asserting the opposite.

Also narrowed the surviving claim, which overreached in the other
direction. The gate gives no guarantee about correctness: it checks that
a reference NAMES a repo, not that it names the right one. astubbs#857
passes and is still wrong.

Two counts that had drifted: pr-checklist.yml's own comment said three
files are exempt when EXEMPT_PATHS has held four for several commits,
and .gitmessage's upstream example kept straight quotes after the fork
example moved to code spans.

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 6, 2026
…they count

`processedRecords(String... tags)` described neither what it returned nor
which of two competing numbers it was. The whole bug this file just fixed
turns on the difference between PC's PROCESSED_RECORDS metric and a
counter incremented inside the poll function - and the helper's name
threw that distinction away. Reading the body tells you; the name should
not require it.

    processedRecordsMetricTotal()
    processedRecordsMetricFor(String... pcInstanceTags)
    awaitMetric(DoubleSupplier actual, double expected)

The varargs was the worse half. `processedRecords()` with no tags meant
"the whole registry", so a tag lost to a refactor did not fail - it
returned a larger, plausible number and the test kept passing against the
wrong quantity. That is the same shape as a bare `#200` resolving to a
real but unrelated issue: wrong, and nothing looks wrong. The tagged
variant now rejects an empty call and says why.

awaitMetric takes a DoubleSupplier, so the call site names which number
it is waiting on rather than hiding it behind an argument order, and the
"never await a proxy that leads the value" reasoning lives in one place.

Also adds the convention this PR kept violating: when closing work as
superseded, link both directions and anchor on something durable. The
comment closing #30 promised "will land as a fresh PR" and never
named it once #57 existed, while #57 never mentioned its
predecessor - so the earlier round of review was invisible from the work
carrying it. Both comments now link the other; a branch name is not a
link.

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 6, 2026
…r repo

Mirrors all 78 open issues from confluentinc/parallel-consumer into this
fork (#44, #117-#195, label upstream-mirror), each
carrying a code-backed diagnosis, and each backlinked from its upstream
original while that is still possible - archival kills writes, not reads,
so the backlinks were the half with a deadline. Seven are closed against
a released version.

Everything else here follows from that.

Mirroring made bare issue numbers ambiguous. The fork numbers from 1 and
confluentinc reaches confluentinc#922, so the ranges overlap completely: of the 51
numbers cited across the files this touches, 48 exist in BOTH repos
meaning different things. #29 is our rebalance fix and
confluentinc#29 is an async-sending request; #114 is a docs PR and
confluentinc#114 is a GPG key issue. So a reference now names its repo
below #1000, and a CI gate enforces it on added lines.

The gate went through three designs, and the discarded two look
plausible enough to be worth recording. Comparing against "the fork is
at #N" raced - CI read 196 while #197 already existed. Checking
whether a number resolves here fails worse: `#200` resolves, to a fork
issue about ManagedTruth, while the author meant confluentinc#200,
shared-nothing architecture. A wrong reference that resolves is worse
than a broken one, because nothing looks amiss. The rule is textual, so
it makes no API calls and cannot race.

The qualifier names the owner rather than the role - confluentinc#857,
not "upstream confluentinc#857". "Upstream" describes a relationship and is not
stable: this repo is upstream to anyone who forks it. "Fork" is out for
the same reason.

Also swept every reference in the files touched here, fixed the source
comments behind the generated TODO index rather than the index, and
stopped the quarantine fixtures borrowing real PR numbers - #80 and #123
are live fork PRs, so the fixtures read as genuine references.

The map shrinks to match: upstream-map.yaml tracks upstream PRs only,
because issues now live in the mirror, and the manifest-driven backlink
tooling is retired - it commented one issue per map entry, and the map no
longer holds issues.

Two corrections the work surfaced: the sweep was reporting our own
backlink comments as upstream activity, hiding the two real replies among
all 78; and confluentinc#548 was recorded open when it merged in 2023 and
is already in this fork.

Remaining tree-wide references are deliberately out of scope, tracked in
docs/inflight/next-qualify-remaining-refs.md with the Java set already
classified.

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 6, 2026
…r repo

Mirrors all 78 open issues from confluentinc/parallel-consumer into this
fork (#44, #117-#195, label upstream-mirror), each
carrying a code-backed diagnosis, and each backlinked from its upstream
original while that is still possible - archival kills writes, not reads,
so the backlinks were the half with a deadline. Seven are closed against
a released version.

Everything else here follows from that.

Mirroring made bare issue numbers ambiguous. The fork numbers from 1 and
confluentinc reaches confluentinc#922, so the ranges overlap completely: of the 51
numbers cited across the files this touches, 48 exist in BOTH repos
meaning different things. #29 is our rebalance fix and
confluentinc#29 is an async-sending request; #114 is a docs PR and
confluentinc#114 is a GPG key issue. So a reference now names its repo
below #1000, and a CI gate enforces it on added lines.

The gate went through three designs, and the discarded two look
plausible enough to be worth recording. Comparing against "the fork is
at #N" raced - CI read 196 while #197 already existed. Checking
whether a number resolves here fails worse: `#200` resolves, to a fork
issue about ManagedTruth, while the author meant confluentinc#200,
shared-nothing architecture. A wrong reference that resolves is worse
than a broken one, because nothing looks amiss. The rule is textual, so
it makes no API calls and cannot race.

The qualifier names the owner rather than the role - confluentinc#857,
not "upstream confluentinc#857". "Upstream" describes a relationship and is not
stable: this repo is upstream to anyone who forks it. "Fork" is out for
the same reason.

Also swept every reference in the files touched here, fixed the source
comments behind the generated TODO index rather than the index, and
stopped the quarantine fixtures borrowing real PR numbers - #80 and #123
are live fork PRs, so the fixtures read as genuine references.

The map shrinks to match: upstream-map.yaml tracks upstream PRs only,
because issues now live in the mirror, and the manifest-driven backlink
tooling is retired - it commented one issue per map entry, and the map no
longer holds issues.

Two corrections the work surfaced: the sweep was reporting our own
backlink comments as upstream activity, hiding the two real replies among
all 78; and confluentinc#548 was recorded open when it merged in 2023 and
is already in this fork.

Remaining tree-wide references are deliberately out of scope, tracked in
docs/inflight/next-qualify-remaining-refs.md with the Java set already
classified.

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 6, 2026
…r repo

Mirrors all 78 open issues from confluentinc/parallel-consumer into this
fork (#44, #117-#195, label upstream-mirror), each
carrying a code-backed diagnosis, and each backlinked from its upstream
original while that is still possible - archival kills writes, not reads,
so the backlinks were the half with a deadline. Seven are closed against
a released version.

Everything else here follows from that.

Mirroring made bare issue numbers ambiguous. The fork numbers from 1 and
confluentinc reaches confluentinc#922, so the ranges overlap completely: of the 51
numbers cited across the files this touches, 48 exist in BOTH repos
meaning different things. #29 is our rebalance fix and
confluentinc#29 is an async-sending request; #114 is a docs PR and
confluentinc#114 is a GPG key issue. So a reference now names its repo
below #1000, and a CI gate enforces it on added lines.

The gate went through three designs, and the discarded two look
plausible enough to be worth recording. Comparing against "the fork is
at #N" raced - CI read 196 while #197 already existed. Checking
whether a number resolves here fails worse: `#200` resolves, to a fork
issue about ManagedTruth, while the author meant confluentinc#200,
shared-nothing architecture. A wrong reference that resolves is worse
than a broken one, because nothing looks amiss. The rule is textual, so
it makes no API calls and cannot race.

The qualifier names the owner rather than the role - confluentinc#857,
not "upstream confluentinc#857". "Upstream" describes a relationship and is not
stable: this repo is upstream to anyone who forks it. "Fork" is out for
the same reason.

Also swept every reference in the files touched here, fixed the source
comments behind the generated TODO index rather than the index, and
stopped the quarantine fixtures borrowing real PR numbers - #80 and #123
are live fork PRs, so the fixtures read as genuine references.

The map shrinks to match: upstream-map.yaml tracks upstream PRs only,
because issues now live in the mirror, and the manifest-driven backlink
tooling is retired - it commented one issue per map entry, and the map no
longer holds issues.

Two corrections the work surfaced: the sweep was reporting our own
backlink comments as upstream activity, hiding the two real replies among
all 78; and confluentinc#548 was recorded open when it merged in 2023 and
is already in this fork.

Remaining tree-wide references are deliberately out of scope, tracked in
docs/inflight/next-qualify-remaining-refs.md with the Java set already
classified.

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 6, 2026
…r repo

Mirrors all 78 open issues from confluentinc/parallel-consumer into this
fork (#44, #117-#195, label upstream-mirror), each
carrying a code-backed diagnosis, and each backlinked from its upstream
original while that is still possible - archival kills writes, not reads,
so the backlinks were the half with a deadline. Seven are closed against
a released version.

Everything else here follows from that.

Mirroring made bare issue numbers ambiguous. The fork numbers from 1 and
confluentinc reaches confluentinc#922, so the ranges overlap completely: of the 51
numbers cited across the files this touches, 48 exist in BOTH repos
meaning different things. #29 is our rebalance fix and
confluentinc#29 is an async-sending request; #114 is a docs PR and
confluentinc#114 is a GPG key issue. So a reference now names its repo
below #1000, and a CI gate enforces it on added lines.

The gate went through three designs, and the discarded two look
plausible enough to be worth recording. Comparing against "the fork is
at #N" raced - CI read 196 while #197 already existed. Checking
whether a number resolves here fails worse: `#200` resolves, to a fork
issue about ManagedTruth, while the author meant confluentinc#200,
shared-nothing architecture. A wrong reference that resolves is worse
than a broken one, because nothing looks amiss. The rule is textual, so
it makes no API calls and cannot race.

The qualifier names the owner rather than the role - confluentinc#857,
not "upstream confluentinc#857". "Upstream" describes a relationship and is not
stable: this repo is upstream to anyone who forks it. "Fork" is out for
the same reason.

Also swept every reference in the files touched here, fixed the source
comments behind the generated TODO index rather than the index, and
stopped the quarantine fixtures borrowing real PR numbers - #80 and #123
are live fork PRs, so the fixtures read as genuine references.

The map shrinks to match: upstream-map.yaml tracks upstream PRs only,
because issues now live in the mirror, and the manifest-driven backlink
tooling is retired - it commented one issue per map entry, and the map no
longer holds issues.

Two corrections the work surfaced: the sweep was reporting our own
backlink comments as upstream activity, hiding the two real replies among
all 78; and confluentinc#548 was recorded open when it merged in 2023 and
is already in this fork.

Remaining tree-wide references are deliberately out of scope, tracked in
docs/inflight/next-qualify-remaining-refs.md with the Java set already
classified.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QqHpNSXC39ANv9kG1ZvUzn
astubbs and others added 2 commits August 6, 2026 15:31
Brings in #198 and #211, and picks up the two new required
checks (`shell: sigpipe`, `workflows: action versions`) from
.github/workflows/repo-hygiene.yml, which this branch predated - GitHub was
blocking on statuses that could never arrive.

One conflict, in src/docs/development/upstream-map.yaml, resolved in master's
favour: the whole `UPSTREAM ISSUES` block was deleted there, including the
issue-162-861-906-build-friction entry this branch had been updating.

That is not a collision to split the difference on - it is a policy change that
makes this branch's edit obsolete. #211 mirrored all 78 open upstream
issues into this fork and shrank the manifest to track upstream PRs ONLY,
because issues now live in the mirror. AGENTS.md now says so directly: "If the
work maps to an upstream *issue*, the fork mirror is where status goes". This
work maps to confluentinc#861, whose mirror is #180, so re-adding the
entry would reintroduce exactly the duplication #211 removed. The
upstream side of confluentinc#861 is still tracked on master, under the
upstream-pr-901-licence-check entry.

Follow-up commits handle what the merge cannot: #211 also made bare
issue numbers below #1000 a CI failure on added lines, and this branch's added
lines are full of them.

AGENTS.md merged cleanly - both this branch's "Building and running the tests"
section and #211's repo-hygiene CI entry survive.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RtNUsxokE9g2pSEjBHZqNA
…flow entry

#211 made a bare `#NN` below 1000 a CI failure on added lines, because the
fork's numbers sit entirely inside confluentinc's range - a bare `#200` resolves
here to a ManagedTruth issue while an author may well have meant
confluentinc#200, shared-nothing architecture. This branch predated that rule and
its added lines were full of bare numbers: running
.github/scripts/issue-ref-gate.js over the diff flagged seven, across AGENTS.md,
bin/build.sh, pom.xml and the parked note. All seven now name their repo, fork
first, hyperlinked where the format allows; the gate reports zero.

Two of them gained something in the rewrite. #132 / confluentinc#162 is
titled "mvn compile fails if test-jar of parallel-consumer-core was not
previously installed" - which is precisely the fresh-clone failure this PR spent
its last round correcting, filed from the other end. The docs now say so, in
AGENTS.md and in the parked note, because a reader hitting the vertx dependency
error should find both the explanation and the issue that has been describing it
since 2021.

In the enforcer's POM comment the reference is spelled out with a URL rather than
left as prose: that comment sits beside a <message> body whose indentation is
load-bearing, and a bare number there is the least clickable place in the repo.
The message body itself is untouched - re-verified that the rule still fires and
still prints one [ERROR] per line, left-aligned as intended.

Separately, AGENTS.md listed .github/workflows/shell-hygiene.yml, which does not
exist: commit 1b040cb folded it into repo-hygiene.yml and left the old bullet
behind, so the CI list documented two workflows for one file. Removed the stale
bullet and folded into the surviving one the two details only it carried - that
the SIGPIPE inversion needs >64 KiB after the match to bite, and that shellcheck
does not catch it. Those explain why the check is a bespoke script instead of a
linter rule, which is the part worth keeping. Found while checking this branch's
text still read correctly next to #211's new entry.

Verified: `./mvnw validate` BUILD SUCCESS; `-pl parallel-consumer-core` still
fails the enforcer with the intended message; bin/check-shell-sigpipe.sh and
bin/check-action-versions.sh both pass.

Upstream-Issue: confluentinc#861
Forwarded: not-needed
Applied-Upstream: no

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RtNUsxokE9g2pSEjBHZqNA
@astubbs astubbs changed the title docs(build) #180: explain why ManagedTruth "cannot be found", and point the enforcer at the fix docs(build) astubbs#180: explain why ManagedTruth "cannot be found", and point the enforcer at the fix (confluentinc#861) Aug 6, 2026
@astubbs

astubbs commented Aug 6, 2026

Copy link
Copy Markdown
Owner Author

Merged master - and it obsoleted one of this PR's changes

Merged origin/master (#198, #211), which also picks up the two new required checks (shell: sigpipe, workflows: action versions) this branch predated and was being blocked waiting for.

The conflict, and why I did not merge both sides

One conflict, src/docs/development/upstream-map.yaml. Resolved entirely in master's favour, deleting a change this PR had made.

#211 mirrored all 78 open upstream issues into this fork and shrank that manifest to track upstream PRs only - the whole UPSTREAM ISSUES block went, including the issue-162-861-906-build-friction entry this branch had been dutifully updating with prs: [200]. Master's AGENTS.md now says it outright: "If the work maps to an upstream issue, the fork mirror is where status goes."

This work maps to confluentinc#861, whose mirror is #180. So restoring the entry would have reintroduced precisely the duplication #211 existed to remove. Dropped it instead. The upstream half of confluentinc#861 is still tracked on master under upstream-pr-901-licence-check, so nothing is lost.

That also retires commit 4a5051ce in effect - the one whose entire purpose was recording PR 200 in that manifest. Worth flagging rather than letting it look like an accidental revert.

#211's issue-ref gate fails this branch as it stood

The bigger consequence. #211 made an unqualified #NN below 1000 a CI failure on added lines, because the fork's numbers sit entirely inside confluentinc's range. I ran the gate over this diff rather than guessing:

FLAGGED: 7
AGENTS.md  #180 · AGENTS.md  #132 · bin/build.sh  #180
docs/inflight/parked-generated-truth-build-traps.md  #180 ×2, #132
pom.xml  #180

All seven now name their repo, fork first, hyperlinked where the format allows. Gate re-run: 0 flagged.

Two of them got better in the process. #132 / confluentinc#162 is titled "mvn compile fails if test-jar of parallel-consumer-core was not previously installed" - which is exactly the fresh-clone failure the previous review round made me correct, filed from the other end and sitting open since 2021. The docs now connect them explicitly, in both AGENTS.md and the parked note. Someone who hits the vertx dependency error should land on the explanation and on the issue that has been describing it for four years.

In pom.xml I spelled the reference out with a URL rather than leaving prose, since that comment sits next to a <message> body whose indentation is load-bearing and is the least clickable spot in the repo. The message body itself is untouched - re-verified the rule still fires and still prints one [ERROR] per line, left-aligned as intended.

One unrelated thing found while checking

You asked me to check this branch's text still reads correctly beside #211's new CI-list entry. It does - but the entry two bullets up does not. AGENTS.md listed .github/workflows/shell-hygiene.yml, which no longer exists: 1b040cb0 folded it into repo-hygiene.yml and left the old bullet behind, so the CI list documented two workflows for one file.

Removed the stale bullet, and folded into the surviving one the two details only it carried - that the SIGPIPE inversion needs >64 KiB after the match to bite, and that shellcheck does not catch it. Those are the part worth keeping, because they explain why the check is a bespoke script rather than a linter rule.

This is master's defect, not this PR's, so say the word and I will split it into its own PR - I folded it in because this PR's whole subject is making AGENTS.md's build/CI documentation accurate, and leaving a bullet pointing at a nonexistent workflow in that same list seemed the wrong call.

Checks against the new guards

  • bin/check-shell-sigpipe.shok: no bin/*.sh pipes into grep -q under pipefail
  • bin/check-action-versions.shok: every action is used at a single version
  • ./mvnw validate → BUILD SUCCESS; -pl parallel-consumer-core still fails with the intended enforcer message
  • bin/AGENTS.md (new on master) - read it; no overlap or contradiction with the build-recipe section. It covers reviewer --allowedTools grants and script self-tests; bin/build.sh is not a check-* script, so no grant is warranted.

PR title now carries both numbers per the new convention, and the body records the dropped manifest edit.

@claude

claude Bot commented Aug 6, 2026

Copy link
Copy Markdown

Claude finished @astubbs's task in 2m 53s —— View job


Claude finished reviewing this PR

Tasks

  • Gather context (PR body, diff vs origin/master, prior review history)
  • Read AGENTS.md and repo guidelines
  • Review latest commits since last review (aec3a12a merge, c6fff838, acd176d7, f12e5031)
  • Verify build/enforcer claims still hold, spot-check issue-ref qualification and dropped workflow bullet
  • Post final review

Summary

This push (merge of origin/master + f12e5031 "qualify every issue reference, and drop a dead workflow entry") is otherwise clean, but the qualification pass introduced one real mistake: a mis-pointed URL in pom.xml.

Finding: confluentinc#861 link in pom.xml points at the wrong repo's issue

pom.xml:901-902:

"cannot find symbol: class ManagedTruth" report in astubbs#180 /
confluentinc#861 (https://github.com/astubbs/parallel-consumer/issues/180).

git diff acd176d7 f12e5031 -- pom.xml shows this is exactly what changed in the "qualify every issue reference" commit — it replaced the previously-ambiguous #180 / upstream #861 with owner-qualified text plus a single URL. But that URL is astubbs/parallel-consumer/issues/180 for both astubbs#180 and confluentinc#861confluentinc#861 has no URL of its own, and the one it's paired with resolves to the fork's issue, not confluentinc/parallel-consumer/issues/861.

Every other dual reference added in this same commit does it correctly, with one URL per issue:

  • AGENTS.md:61 — [astubbs#180](.../astubbs/.../180), [confluentinc#861](.../confluentinc/.../861)
  • AGENTS.md:134-135 and docs/inflight/parked-generated-truth-build-traps.md:191-192, 255-256 — same pattern, both correct
  • bin/build.sh:177-179 — both URLs listed on separate lines, both correct

Only the pom.xml comment collapsed the pair into a single (wrong) URL. Since this exact sentence anchors the file's guidance for "the fork mirror is where status goes," a reader following that link to see the upstream issue lands back on the fork instead — the small mistake this whole PR round of edits was meant to eliminate.

Suggested fix: give confluentinc#861 its own URL, matching the pattern used everywhere else in this diff:

"cannot find symbol: class ManagedTruth" report in astubbs#180
(https://github.com/astubbs/parallel-consumer/issues/180) / confluentinc#861
(https://github.com/confluentinc/parallel-consumer/issues/861).

Fix this →

Verified directly (all hold up)

  • ./mvnw -pl parallel-consumer-core test-compile still fails at validate with the enforcer ReactorModuleConvergence message, reproduced verbatim against the current pom.xml — the message text itself is untouched by this push, only the surrounding XML comment changed.
  • .github/workflows/shell-hygiene.yml is confirmed absent from the tree; repo-hygiene.yml is the sole survivor and its bullet in AGENTS.md now carries the SIGPIPE detail (>64 KiB after the match, not caught by shellcheck) that the deleted bullet used to own — no information lost by dropping the stale entry.
  • Ran the issue-ref gate's logic by hand over every added line in this diff: all 11 #132/#162/#180/#861 occurrences are owner-qualified (astubbs#NN / confluentinc#NN) or wrapped in a correctly-targeted markdown link — except the one pom.xml case above, which is qualified in text but not in its accompanying link.
  • The diff is exactly the 4 files listed in the PR metadata (AGENTS.md, bin/build.sh, docs/inflight/parked-generated-truth-build-traps.md, pom.xml); src/docs/development/upstream-map.yaml is correctly absent, matching the PR body's description of dropping that edit during the master merge.
    (branch)

…comment

Review caught a real one, and it is the exact failure the reference convention
exists to prevent. The previous commit qualified the POM comment as

    report in #180 / confluentinc#861
    (#180).

One URL, trailing both numbers, and it is the fork's. A reader following it to
see the upstream issue lands on the fork's mirror instead - a wrong reference
that resolves, which AGENTS.md calls out as worse than a broken one, because
nothing looks amiss.

Every other dual reference added in that commit already gave one URL per issue.
This one collapsed the pair. Now each number carries its own link, on its own
line, which also reads better in a comment nobody can click anyway.

The <message> body remains untouched; re-verified `./mvnw validate` BUILD SUCCESS
and the issue-ref gate at zero.

Upstream-Issue: confluentinc#861
Forwarded: not-needed
Applied-Upstream: no

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

astubbs commented Aug 6, 2026

Copy link
Copy Markdown
Owner Author

The pom.xml link finding: correct, and self-inflicted. Fixed in 6bd8187a

Good catch, and it stings in the right way - the qualification pass meant to eliminate ambiguous references introduced an ambiguous one. I had written:

report in astubbs#180 / confluentinc#861
(https://github.com/astubbs/parallel-consumer/issues/180).

One URL, trailing both numbers, and it is the fork's. Someone following it expecting the upstream report lands on the mirror. That is precisely the case AGENTS.md singles out - "a wrong reference that resolves is worse than a broken one, because nothing looks amiss" - so it is the one kind of mistake this PR had no business shipping.

You were also right that every other dual reference in that commit already did it properly, one URL per issue; only the POM comment collapsed the pair. Each number now carries its own link on its own line:

report in
astubbs#180   https://github.com/astubbs/parallel-consumer/issues/180
confluentinc#861 https://github.com/confluentinc/parallel-consumer/issues/861

Re-verified after the change: ./mvnw validate BUILD SUCCESS, -pl parallel-consumer-core still fails with the intended enforcer message (the <message> body is untouched - only the surrounding XML comment moved), and the issue-ref gate still reports 0 flagged.

Thanks also for independently confirming the two judgement calls from the master merge - the dropped upstream-map.yaml entry and the removed shell-hygiene.yml bullet with its details folded into the survivor. Those were the two places I could most easily have got it wrong in the other direction.

@claude

claude Bot commented Aug 6, 2026

Copy link
Copy Markdown

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


Claude finished reviewing this PR

Tasks

  • Gather context (PR body, diff, prior review history, changed files)
  • Read AGENTS.md and repo guidelines
  • Review latest commit since last review (6bd8187a — pom.xml URL fix)
  • Verify the confluentinc#861 link fix in pom.xml and re-check issue-ref qualification
  • Post final review

Summary

6bd8187a correctly fixes the one finding from the previous review pass: the enforcer message's XML comment in pom.xml now gives astubbs#180 and confluentinc#861 each their own URL, instead of one URL trailing both (which previously resolved to the fork's issue for both references).

I re-verified directly rather than trusting the commit message:

  • git show 6bd8187a -- pom.xml — the diff matches exactly what the commit message and the author's reply describe: each reference now on its own line with its own correctly-targeted URL (.../astubbs/parallel-consumer/issues/180 and .../confluentinc/parallel-consumer/issues/861).
  • Ran ./mvnw -pl parallel-consumer-core validate — the enforcer ReactorModuleConvergence message still fires and reproduces verbatim, confirming the <message> body itself (the only part whose formatting is load-bearing) is untouched — only the surrounding XML comment changed, as claimed.
  • Scanned the full diff (AGENTS.md, bin/build.sh, docs/inflight/parked-generated-truth-build-traps.md, pom.xml) for unqualified #NN references below 1000 — none remain; every occurrence is owner-qualified (astubbs#NN / confluentinc#NN) or wrapped in a correctly-targeted link.
  • Confirmed the stale .github/workflows/shell-hygiene.yml bullet stays removed from AGENTS.md, with its SIGPIPE detail (>64 KiB after the match, not caught by shellcheck) correctly folded into the surviving repo-hygiene.yml bullet.
  • Confirmed src/docs/development/upstream-map.yaml is (correctly) absent from this diff, matching the PR body's account of dropping that edit during the master merge.

Diff scope is unchanged since the last pass — 4 files (AGENTS.md, bin/build.sh, docs/inflight/parked-generated-truth-build-traps.md, pom.xml).

Verdict

No new findings. The one open item from the previous review round is resolved and independently re-verified. Nothing further to flag.
(branch)

astubbs added a commit that referenced this pull request Aug 7, 2026
…t the diff (#221)

The gate only ever inspected the diff. Below #1000 the fork's numbers sit
inside confluentinc's range, so a bare `#200` autolinks to a real but
unrelated issue - and the script's own header says why that matters: "A
wrong link that resolves is worse than a broken one, because nothing looks
amiss." The PR body is the surface humans actually read on GitHub, where
such a link renders as a working one, and it was the single place the rule
went unenforced. The gate already trusted the body enough to accept a
bypass from it, which made "bodies are out of scope" hard to hold as a
principle.

The body now reaches the existing matcher as one more synthetic entry via
`prBodyEntry(body)`, so the adapter decides what text is in scope and
`suspectRefs` remains the only thing deciding what counts as a violation -
no second copy of the rule. It is named `<PR body>`, which cannot collide
with a real path or be swallowed by EXEMPT_PATHS, and reads correctly in
the failure listing. Lines are prefixed "+ " rather than "+", because a
body line starting `++` would otherwise become `+++` and be skipped as a
diff header - a silent exemption and a hiding place. Fenced code blocks are
dropped, since GitHub does not autolink inside a fence and bodies routinely
quote logs and this gate's own failure message; that has to live in the
adapter because fencing is a whole-document property a diff can never
answer. A backslash-escaped `\#NN` is deliberately not exempt: it dodges
the wrong link but still names no repo.

The fence state machine is CommonMark-exact in both directions. A closing
fence may be followed only by spaces or tabs, so ``` see the note no longer
ends a block. Fixing that exposed the same class failing the other way: a
backtick fence may not carry a backtick in its info string, so ```a`b opens
nothing - but the old regex treated it as a fence and dropped every line
after it, and those lines do autolink on GitHub. That was a false negative,
the direction this gate exists to prevent.

`formatFailure` gains a paragraph shown only for body hits: `astubbs#NN`
passes the gate but is not cross-reference syntax, so in a description it
renders as plain text and `Fixes #167` closes nothing. Following the
headline advice literally would trade a wrong link for no link.

Running the new gate over 40 real PR bodies found that `depends on #N` for
stacked PRs would start failing; both AGENTS.md mentions are now qualified,
checked against the pinned dependencies-action revision so the dependency
gate still matches. `bin/check-issue-refs.sh` carried a claim this change
makes false - that it cannot pass something CI would flag - corrected in
its header and in AGENTS.md. The PR template now states the rule where
bodies are actually written.

Verified by controlled experiment, not by a green tick: the workflow step's
actual script text was extracted from the YAML and run against pre- and
post-fix modules. An invalid closer flips FAIL to PASS, an illegal opener
flips PASS to FAIL, and neither control moves - ruling out a wholesale
loosening of when scanning resumes. Test suite 30 -> 48 assertions.

Co-Authored-By: Claude Opus 5 (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.

1 participant