Skip to content

test(core) confluentinc#909: reproduce the stale-resident race through a shard-manager seam, and let evidence justify a quarantine - #322

Merged
astubbs merged 9 commits into
masterfrom
fix/909-load-reproduction
Aug 26, 2026
Merged

astubbs merged 9 commits into
masterfrom
fix/909-load-reproduction

Conversation

@astubbs

@astubbs astubbs commented Aug 19, 2026 •

Copy link
Copy Markdown
Owner

Description

This PR is not the confluentinc#909 fix — that is already on master. It is the
deterministic reproduction of the race, the module seam the reproduction needs, and a change to when a
test may be quarantined.

git diff origin/master HEAD -- '*ProcessingShard.java' is empty: the stale-resident replacement
landed via #31. Earlier versions of this description claimed the fix,
#177 and #209 were delivered here. None of them are.

The reproduction

RegistrationRaceStaleResidentIT drives the defect through the real registration path at broker
level, using PausableInsertShardManager to hold the control thread mid-batch so a rebalance lands
between the stale inserts and the fresh arrival.

The third precondition is what makes it deterministic, and it is not in the original analysis: the
loss also needs no take-scan between the stale inserts and the fresh arrival, because
getWorkIfAvailable evicts stale containers as it scans — so ordinary churn heals the collision and
only a saturated pipeline (delta <= 0) exposes it. Random chaos could never have found it.

It fails a healed run as invalid rather than passing it. A reproduction that can silently stop
reproducing is worse than none.

Its produce step now goes through a new shared KafkaClientUtils.produceOffsetKeyedRange, which keys
each record with the offset it lands on and asserts the correspondence rather than assuming it —
so a missing key names the lost offset, and a topic that cannot honour that contract fails at the
produce rather than as a confusing downstream assertion.

The seam, and the invariant it now enforces

PCModule.shardManager(WorkManager) resolves ShardManager through the module like every other
collaborator, so a test can substitute one. It takes the owning WorkManager as a parameter because
the two are mutually dependent and workManager() would recurse mid-construction.

Memoising it opened a hazard of its own, since before this each WorkManager built its own
ShardManager: a second WorkManager against one module would have been handed the first's, leaving
its PartitionStateManager and its shard manager operating on different owners, with nothing red to
say so. It now rejects a mismatched owner instead of silently answering with the first's.

A same-defect-class sweep found the identical shape one method away. brokerPoller is guarded
too
: memoised, takes its owning processor as a parameter, ignored it on the cache-hit path — so a
second processor would have received a BrokerPollSystem polling on behalf of the first and never
been delivered a record. Only its own constructor calls it, once per module, so the collision is
unreachable today — but "reachable only because callers behave" is the argument the guard exists to
reject.

Both getters are now final, and substitution goes through createShardManager(WorkManager).
That is not tidiness: the reproduction below substitutes a pausable ShardManager by subclassing the
module, and written against the memoising getter it overrode the guard away with it — reinstating, in
this very branch, the defect being guarded against. The compiler now refuses that mistake.
PCModuleCollaboratorOwnershipTest covers both sides of each guard plus the factory seam, and is
named for the defect class so the next one gets a test rather than its own file. Both guards are
mutation-checked: deleting either turns exactly its own test red.

Swept and dismissed for the same class: producerWrap(), producerManager(), consumerManager(),
workManager(), pc(), dynamicExtraLoadFactor() and pcMetrics() take no owner argument; every
computeIfAbsent/putIfAbsent factory in the tree is key-scoped; SupplierUtils.memoize's one
production use is instance-scoped inside its own owner's constructor; there are no
@Getter(lazy=true) fields and no DI holder other than PCModule. Left open deliberately:
setParallelEoSStreamProcessor is the mirror image — it overwrites the module's pc reference
before the brokerPoller guard can fire — which is pre-existing behaviour and a separate change.

ShardKey's KeyOrderedKey javadoc described topic-only scoping while the constructor builds a
TopicPartition — corrected, and its docs/refactoring.md entry retired in the same commit, since an
entry and the change that retires it are one change.

Quarantine rule: evidence, not diagnosis

@Quarantined required a diagnosis before a test could leave the gating lane. That conflated "we do
not know the mechanism"
with "we do not know whether it is ours" — and only the second justifies
blocking. The cost was that an undiagnosed red blocked every unrelated PR, which trains everyone to
read red as normal; this repo already deleted surefire retries for hiding flakes, and a permanently
red gate destroys the same signal more thoroughly.

It now asks for evidence: a diagnosed mechanism or a recorded sighting ledger (dates, runs,
signature, and what makes it master-state). A hunch is still not evidence and one failure is a
sighting, not a ledger. Nothing else moves — the lane still runs the test, the registry keeps it loud,
and a non-empty list still blocks a release.

docs/quarantined-tests.md carries the rule text on master already — it landed with
#323, so it is no longer part of this diff. The reasoning it was written for
still holds and is why the two were kept together at the time: the annotation asserts the rule and
cites that file as its reason, so landing them apart would have put a self-contradiction on master
with the javadoc pointing at the denial. That ordering worked out; the file simply arrived first.

The notes rule, applied to this PR's own notes

docs/inflight/AGENTS.md gains the rule that a note whose work has landed has four outcomes, not
one — migrate what outlives it, keep it shrunk, split it, or git rm it — and that a
"delete this when astubbs/parallel-consumer#NN merges" marker must never reach master, because the
merge is exactly when nobody is looking there.

This PR is the third and last of the split, so it applies that rule to itself. Both pr-322-*
coordination notes are deleted, their surviving items migrated to durable owners first:

  • the proposed bin/check-conflict-markers.sh gate, and the incident behind it, became
    docs/inflight/ci-conflict-marker-gate.md;
  • the five stranded agent-hook commit bodies were already owned by
    docs/inflight/branch-agent-hook-commit-bodies-only-on-backup.md, so only the duplicate went;
  • the "always re-fetch master before measuring" lesson is already owned by docs/merge-checklist.md;
  • the availableWorkContainerCnt undercount was promoted out of docs/refactoring.md — it carried
    evidence and a pending decision, which is a note's job, not a one-line backlog entry's — and is now
    docs/inflight/bug-processing-shard-available-work-undercount.md.

The one unverified claim either note carried — whether -Dpc.log.level reaches failsafe forks as
well as surefire ones — was settled rather than migrated, riding on the broker run that verified
the IT: it emits bz.stub.parallelconsumer INFO lines the warn default swallows, and
bin/check-test-log-config.sh's header now records the observation and the integration-test
invocation it licenses.

bin/check-branch-self-reference.sh's header also gained the reason a local pass is not a CI pass —
it resolves "this PR" by branch name, so a merge/NNN-… worktree pushing to a differently-named head
ref never arms the PR arm, and every #NNN mention passes locally and fails in CI. That is not
hypothetical either; it happened on this PR, one push before the fix.

What a reviewer should look hardest at

The IT never observes the collision itself. It rules out the two known heal paths, but suppression
rests on WorkManager.getWorkIfAvailable's requestedMaxWorkToRetrieve < 1 early return. If that
arithmetic shifts, the test goes permanently green with the defect branch unexercised. The proposed
fix — count stale-resident collisions at insert and assert the count equals the paused batch's tail —
needs a broker to verify and is not applied. It has its own note,
docs/inflight/test-909-reproduction-cannot-observe-the-collision.md, which owns it: the mechanism,
the negative-control record proving the test is falsifiable today, and the finding that the
assertion needs no production change.

Merge

Behind #57 in the agreed order (57, 322, 267, 29 — 323, 324 and 325 have
landed). Independent — base master, no depends on.

Rebase-merge. The thirteen working commits were re-cut into eight atomic units, one per
workstream, each body carrying its diagnosis, its experiment and its rejected alternatives;
git log origin/master..HEAD is the current shape. The DI seam and the ownership guard are split
because they are separately revertable and separately meaningful in the release notes — the first is
an internal refactor, the second adds an exception a caller can hit. Squashing would need an "and
also" for each workstream, and master's history is predominantly rebase-merged — the
confluentinc#909 fix itself landed as several commits.

Checklist

  • Docs updated — docs/inflight/AGENTS.md's four-outcome rule, the two notes promoted or migrated
    out of retired PR coordination notes, the deferred collision-observation note, and the
    docs/refactoring.md entries retired by the code in this PR
  • User-facing feature documentation data added under docs/features/ — N/A - a reproduction, a DI seam and a test-quarantine rule; no user-facing behaviour
  • Tests added/updated — the broker-level reproduction, PausableInsertShardManager,
    PCModuleCollaboratorOwnershipTest for the module-ownership invariant (both guards
    mutation-checked), and QuarantinedAnnotationContractTest for the rule change
  • Title & body reflect the final content of this PR — both rewritten after the Codex review pass
  • Ran ce-simplify and ce-code-review locally — N/A - asked for @codex review on the PR instead, and its seven findings are addressed in-thread

@github-actions

Copy link
Copy Markdown

Dependency Review

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

Scanned Files

None

@github-actions

github-actions Bot commented Aug 19, 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 31 31 ➖ 0
Duplicated lines 1001 971 :face_with_raised_eyebrow: +30
Duplication 0.13% 0.13% ➖ 0
Rule Limit Status
Max duplication 0.5% ✅ Pass (0.13%)
Max increase vs base +0.1% ✅ Pass (+0.00%)
⚠️ 1 new clones introduced
  • 38 lines (129 tokens): parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/utils/KafkaClientUtils.java:384 <-> parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/utils/KafkaClientUtils.java:465

✅ jscpd (language-agnostic)

PR Base Change
Clones 85 85 ➖ 0
Duplicated lines 1227 1227 ➖ 0
Duplication 1.08% 1.09% 🙂 -0.01%
Rule Limit Status
Max duplication 2% ✅ Pass (1.08%)
Max increase vs base +0.1% ✅ Pass (-0.01%)
⚠️ 1 new clones introduced
  • 23 lines: parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/utils/KafkaClientUtils.java:465 <-> parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/utils/KafkaClientUtils.java:384

Powered by astubbs/duplicate-code-cross-check

@github-actions

github-actions Bot commented Aug 19, 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:

🆕 New file similarities introduced

File A File B Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCModule.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PCModuleCollaboratorOwnershipTest.java 36.0
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkDrainIT.java parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java 30.3
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/RegistrationRaceStaleResidentIT.java parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/state/PausableInsertShardManager.java 30.2
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/BatchTestBase.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 30.2

🔺 Increased similarities

File A File B Base (%) PR (%) Change
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ExternalEngine.java parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 30.7 40.0 +9.3
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyPCTest.java parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorPCTest.java 66.5 71.9 +5.3
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CommitPathVisibilityProbes.java jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/SeenSucceededOrderingProbes.java 56.5 58.5 +1.9
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/KeyOrderLedger.java parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/KeyOrderLedgerIT.java 31.8 33.1 +1.3
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CheckQuarantineOwnersScriptTest.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineRegistryScriptTest.java 45.3 46.5 +1.2
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CalibrationProbes.java jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CommitPathVisibilityProbes.java 37.0 38.1 +1.1
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/DiagnosticQuietCap.java parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/DiagnosticQuietCapIT.java 52.4 53.3 +0.9
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PollThreadStallDiagnosis.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PollThreadStallDiagnosisTest.java 32.6 33.5 +0.8
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineLaneReportScriptTest.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineRegistryScriptTest.java 30.6 31.4 +0.8
parallel-consumer-mutiny/src/main/java/bz/stub/parallelconsumer/mutiny/MutinyProcessor.java parallel-consumer-reactor/src/main/java/bz/stub/parallelconsumer/reactor/ReactorProcessor.java 50.7 51.5 +0.8
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/BootstrapResetTripleWriteProbes.java jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/SeenSucceededOrderingProbes.java 37.8 38.5 +0.7
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/BootstrapResetTripleWriteProbes.java jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CommitPathVisibilityProbes.java 42.3 43.0 +0.7
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionStateManager.java 32.0 32.7 +0.6
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/OffsetEncodingBackPressureTest.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/OffsetEncodingBackPressureUnitTest.java 37.7 38.4 +0.6
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CalibrationProbes.java jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/SeenSucceededOrderingProbes.java 37.1 37.7 +0.6
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 41.7 42.3 +0.6
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 51.3 51.9 +0.6
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CommitResponseTimeoutSymptomTest.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerTestBase.java 39.0 39.4 +0.5
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ConsumerManager.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ConsumerManagerCommitRetryBudgetTest.java 30.2 30.7 +0.4
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ConsumerOffsetCommitter.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CommitResponseTimeoutSymptomTest.java 33.4 33.9 +0.4

...and 106 more

Full similarity report
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/BootstrapResetTripleWriteProbes.java

📄 jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/BootstrapResetTripleWriteProbes.java

File Similarity (%)
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CommitPathVisibilityProbes.java 42.97
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/SeenSucceededOrderingProbes.java 38.53
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CalibrationProbes.java

📄 jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CalibrationProbes.java

File Similarity (%)
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CommitPathVisibilityProbes.java 38.08
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/SeenSucceededOrderingProbes.java 37.71
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CommitPathVisibilityProbes.java

📄 jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CommitPathVisibilityProbes.java

File Similarity (%)
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/SeenSucceededOrderingProbes.java 58.45 ⚠️
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/BootstrapResetTripleWriteProbes.java 42.97
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CalibrationProbes.java 38.08
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/SeenSucceededOrderingProbes.java

📄 jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/SeenSucceededOrderingProbes.java

File Similarity (%)
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CommitPathVisibilityProbes.java 58.45 ⚠️
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/BootstrapResetTripleWriteProbes.java 38.53
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CalibrationProbes.java 37.71
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 52.7 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 37.58
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PCRetriableException.java 34.51
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 33.83
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 32.41
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 31.88
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 31.86
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 31.08
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 64.15 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 58.05 ⚠️
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 42.63
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 40.82
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 35.5
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 33.33
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 31.09
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 64.15 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 54.04 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 40.08
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 35.02
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 34.47
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 32.44
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PCRetriableException.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PCRetriableException.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 34.51
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 32.22
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 52.7 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 51.85 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 42.3
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 32.76
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalRuntimeException.java 31.64
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 31.29
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerOptions.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerOptions.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ProducerManager.java 30.94
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 58.05 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 54.04 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 48.48
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 36.44
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 34.15
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 32.39
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 48.48
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 40.82
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 40.08
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 35.57
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContext.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContext.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/RecordContextInternal.java 42.09
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 30.83
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 36.44
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 35.5
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 34.47
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/RecordContextInternal.java 33.97
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContext.java 30.83
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/RecordContextInternal.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/RecordContextInternal.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContext.java 42.09
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 33.97
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/SubmitWorkToPoolShutdownRaceTest.java 44.29
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/BrokerPollSystem.java 33.45
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AbstractParallelEoSStreamProcessorConfigurationTest.java 32.59
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/BrokerPollSystem.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/BrokerPollSystem.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 33.45
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ConsumerManager.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ConsumerManager.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ConsumerManagerCommitRetryBudgetTest.java 30.68
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ConsumerOffsetCommitter.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ConsumerOffsetCommitter.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CommitResponseTimeoutSymptomTest.java 33.87
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ExternalEngine.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ExternalEngine.java

File Similarity (%)
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 40.0
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 57.96 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 51.85 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 49.42
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 47.68
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalRuntimeException.java 40.35
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 37.58
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 34.21
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PCRetriableException.java 32.22
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 31.18
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 30.41
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalRuntimeException.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalRuntimeException.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 40.35
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 31.64
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 30.94
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCModule.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCModule.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PCModuleCollaboratorOwnershipTest.java 35.95
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PollThreadStallDiagnosis.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PollThreadStallDiagnosis.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PollThreadStallDiagnosisTest.java 33.46
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/AmbientProbeExtension.java 33.08
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ProducerManager.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ProducerManager.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerOptions.java 30.94
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/Java8StreamUtils.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/Java8StreamUtils.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/JavaUtils.java 33.69
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/CollectionUtils.java 31.42
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/JavaUtils.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/JavaUtils.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/CollectionUtils.java 38.38
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/Java8StreamUtils.java 33.69
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 49.37
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 35.4
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 34.52
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 34.21
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 32.76
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 32.41
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 30.6
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 57.96 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 49.37
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 46.44
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 46.12
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 44.97
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 44.79
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 42.3
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 33.83
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalRuntimeException.java 30.94
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 47.68
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 44.94
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 44.79
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 35.84
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 34.94
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 49.42
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 46.44
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 44.94
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 31.86
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 31.29
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 30.6
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 61.43 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 46.12
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 35.84
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 35.4
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 31.88
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 31.18
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 61.43 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 44.97
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 34.94
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 34.52
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 31.08
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 30.41
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionStateManager.java 32.68
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionStateManager.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionStateManager.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 39.83
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java 32.68
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java 33.87
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 33.87
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionStateManager.java 39.83
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/AmbientProbeExtension.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/AmbientProbeExtension.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PollThreadStallDiagnosis.java 33.08
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AmbientProbeExtensionTest.java 31.23
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/KafkaSanityTests.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/KafkaSanityTests.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/LoopingResumingIteratorTest.java 32.2
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/ManagedPCInstanceLifecycleIT.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/ManagedPCInstanceLifecycleIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/utils/ManagedPCInstance.java 30.69
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 56.95 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 43.62
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 35.84
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 39.81
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 39.21
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 35.84
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/RebalanceEoSDeadlockTest.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/RebalanceEoSDeadlockTest.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/RebalanceTest.java 35.7
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/RebalanceTest.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/RebalanceTest.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/RebalanceEoSDeadlockTest.java 35.7
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/RegistrationRaceStaleResidentIT.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/RegistrationRaceStaleResidentIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/state/PausableInsertShardManager.java 30.22
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 54.14 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 43.62
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 39.21
parallel-consumer-vertx/src/test-integration/java/bz/stub/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 31.07
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 56.95 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 54.14 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 39.81
parallel-consumer-vertx/src/test-integration/java/bz/stub/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 35.47
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 40.05
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkKeyOrderIT.java 40.0
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 38.42
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ProgressProbe.java 36.46
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java 33.57
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 46.69
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 38.42
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 32.64
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkKeyOrderIT.java 53.86 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 46.69
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 40.05
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 36.05
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ProgressProbe.java 33.02
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/KeyOrderLedger.java 32.03
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkCooperativeDrainIT.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkCooperativeDrainIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkDrainIT.java 39.69
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkCooperativeIT.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkCooperativeIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java 43.43
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkDrainIT.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkDrainIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkCooperativeDrainIT.java 39.69
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java 30.29
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkCooperativeIT.java 43.43
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 33.57
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkDrainIT.java 30.29
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkKeyOrderIT.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkKeyOrderIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 53.86 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 40.0
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 36.05
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 32.64
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/DiagnosticQuietCap.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/DiagnosticQuietCap.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/DiagnosticQuietCapIT.java 53.29 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/DiagnosticQuietCapIT.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/DiagnosticQuietCapIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/DiagnosticQuietCap.java 53.29 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/KeyOrderLedger.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/KeyOrderLedger.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/KeyOrderLedgerIT.java 33.07
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 32.03
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/KeyOrderLedgerIT.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/KeyOrderLedgerIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/KeyOrderLedger.java 33.07
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ProgressProbe.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ProgressProbe.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 36.46
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 33.02
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/utils/ManagedPCInstance.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/utils/ManagedPCInstance.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/ManagedPCInstanceLifecycleIT.java 30.69
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/state/PausableInsertShardManager.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/state/PausableInsertShardManager.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/RegistrationRaceStaleResidentIT.java 30.22
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AbstractParallelEoSStreamProcessorConfigurationTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AbstractParallelEoSStreamProcessorConfigurationTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/SubmitWorkToPoolShutdownRaceTest.java 41.39
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 32.59
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AbstractParallelEoSStreamProcessorTestBase.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AbstractParallelEoSStreamProcessorTestBase.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/KafkaTestUtils.java 32.07
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AmbientProbeExtensionTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AmbientProbeExtensionTest.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/AmbientProbeExtension.java 31.23
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/BatchTestBase.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/BatchTestBase.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 30.19
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CheckQuarantineOwnersScriptTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CheckQuarantineOwnersScriptTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineLaneReportScriptTest.java 48.26
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineRegistryScriptTest.java 46.45
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CommitRejectionTestBase.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CommitRejectionTestBase.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CommitResponseTimeoutSymptomTest.java 32.68
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CommitResponseTimeoutSymptomTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CommitResponseTimeoutSymptomTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerTestBase.java 39.44
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ConsumerOffsetCommitter.java 33.87
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CommitRejectionTestBase.java 32.68
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java

File Similarity (%)
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorBatchTest.java 51.61 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java 50.02 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java 44.57
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/BatchTestBase.java 30.19
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerCommitTimeoutTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerCommitTimeoutTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerSaslAuthenticationTest.java 44.31
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerSaslAuthenticationTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerSaslAuthenticationTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerCommitTimeoutTest.java 44.31
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerTestBase.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerTestBase.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CommitResponseTimeoutSymptomTest.java 39.44
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/ParallelEoSSStreamProcessorRebalancedTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/ParallelEoSSStreamProcessorRebalancedTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessorTest.java 34.35
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessorTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessorTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/ParallelEoSSStreamProcessorRebalancedTest.java 34.35
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineLaneReportScriptTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineLaneReportScriptTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CheckQuarantineOwnersScriptTest.java 48.26
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineRegistryScriptTest.java 31.38
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineRegistryScriptTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineRegistryScriptTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CheckQuarantineOwnersScriptTest.java 46.45
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineLaneReportScriptTest.java 31.38
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java

File Similarity (%)
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 87.14 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 86.19 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 86.19 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 83.76 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 83.76 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 83.76 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 82.26 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 82.26 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ConsumerManagerCommitRetryBudgetTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ConsumerManagerCommitRetryBudgetTest.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ConsumerManager.java 30.68
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PCModuleCollaboratorOwnershipTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PCModuleCollaboratorOwnershipTest.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCModule.java 35.95
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PollThreadStallDiagnosisTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PollThreadStallDiagnosisTest.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PollThreadStallDiagnosis.java 33.46
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/SubmitWorkToPoolShutdownRaceTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/SubmitWorkToPoolShutdownRaceTest.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 44.29
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AbstractParallelEoSStreamProcessorConfigurationTest.java 41.39
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 34.15
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 31.09
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/BlockedThreadAsserter.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/BlockedThreadAsserter.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/BlockedThreadAsserterTest.java 32.29
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/BlockedThreadAsserterTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/BlockedThreadAsserterTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/BlockedThreadAsserter.java 32.29
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/CollectionUtils.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/CollectionUtils.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/JavaUtils.java 38.38
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/Java8StreamUtils.java 31.42
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/KafkaTestUtils.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/KafkaTestUtils.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AbstractParallelEoSStreamProcessorTestBase.java 32.07
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/LoopingResumingIteratorTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/LoopingResumingIteratorTest.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/KafkaSanityTests.java 32.2
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/OffsetEncodingBackPressureTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/OffsetEncodingBackPressureTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/OffsetEncodingBackPressureUnitTest.java 38.35
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/OffsetEncodingBackPressureUnitTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/OffsetEncodingBackPressureUnitTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/OffsetEncodingBackPressureTest.java 38.35
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckHarness.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckHarness.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckToolchainProbeTest.java 32.5
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckToolchainProbeTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckToolchainProbeTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerLincheckTest.java 34.46
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckHarness.java 32.5
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateLincheckTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateLincheckTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueLincheckTest.java 31.64
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerLincheckTest.java 30.94
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueLincheckTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueLincheckTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerLincheckTest.java 42.76
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateLincheckTest.java 31.64
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueTest.java 30.53
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerLincheckTest.java 30.34
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueLincheckTest.java 30.53
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerLincheckTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerLincheckTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueLincheckTest.java 42.76
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckToolchainProbeTest.java 34.46
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateLincheckTest.java 30.94
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerLincheckTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerLincheckTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueLincheckTest.java 30.34
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/truth/CommitHistorySubject.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/truth/CommitHistorySubject.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/truth/LongPollingMockConsumerSubject.java 35.96
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/truth/LongPollingMockConsumerSubject.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/truth/LongPollingMockConsumerSubject.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/truth/CommitHistorySubject.java 35.96
parallel-consumer-examples/parallel-consumer-example-core/src/main/java/bz/stub/parallelconsumer/examples/core/CoreApp.java

📄 parallel-consumer-examples/parallel-consumer-example-core/src/main/java/bz/stub/parallelconsumer/examples/core/CoreApp.java

File Similarity (%)
parallel-consumer-examples/parallel-consumer-example-reactor/src/main/java/bz/stub/parallelconsumer/examples/reactor/ReactorApp.java 36.94
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/CoreAppTest.java

📄 parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/CoreAppTest.java

File Similarity (%)
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/ReactorAppTest.java 40.03
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/integrationTests/CoreAppMetricsIntegrationTest.java 36.41
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/VertxAppTest.java 35.77
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java

📄 parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 83.76 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 83.52 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 82.61 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 82.61 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 80.28 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 80.28 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 78.84 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 78.84 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java

📄 parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 82.26 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 82.02 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 81.13 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 81.13 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 78.84 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 78.84 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 78.84 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 77.43 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/integrationTests/CoreAppMetricsIntegrationTest.java

📄 parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/integrationTests/CoreAppMetricsIntegrationTest.java

File Similarity (%)
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/CoreAppTest.java 36.41
parallel-consumer-examples/parallel-consumer-example-reactor/src/main/java/bz/stub/parallelconsumer/examples/reactor/ReactorApp.java

📄 parallel-consumer-examples/parallel-consumer-example-reactor/src/main/java/bz/stub/parallelconsumer/examples/reactor/ReactorApp.java

File Similarity (%)
parallel-consumer-examples/parallel-consumer-example-vertx/src/main/java/bz/stub/parallelconsumer/examples/vertx/VertxApp.java 69.72 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/main/java/bz/stub/parallelconsumer/examples/core/CoreApp.java 36.94
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/ReactorAppTest.java

📄 parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/ReactorAppTest.java

File Similarity (%)
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/VertxAppTest.java 46.75
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/CoreAppTest.java 40.03
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java

📄 parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 83.76 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 83.52 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 82.61 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 82.61 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 80.28 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 80.28 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 78.84 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 78.84 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java

📄 parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 82.26 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 82.02 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 81.13 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 81.13 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 78.84 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 78.84 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 78.84 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 77.43 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/main/java/bz/stub/parallelconsumer/examples/vertx/VertxApp.java

📄 parallel-consumer-examples/parallel-consumer-example-vertx/src/main/java/bz/stub/parallelconsumer/examples/vertx/VertxApp.java

File Similarity (%)
parallel-consumer-examples/parallel-consumer-example-reactor/src/main/java/bz/stub/parallelconsumer/examples/reactor/ReactorApp.java 69.72 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java

📄 parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 83.76 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 83.52 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 82.61 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 82.61 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 80.28 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 80.28 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 78.84 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 78.84 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/VertxAppTest.java

📄 parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/VertxAppTest.java

File Similarity (%)
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/ReactorAppTest.java 46.75
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/CoreAppTest.java 35.77
parallel-consumer-mutiny/src/main/java/bz/stub/parallelconsumer/mutiny/MutinyProcessor.java

📄 parallel-consumer-mutiny/src/main/java/bz/stub/parallelconsumer/mutiny/MutinyProcessor.java

File Similarity (%)
parallel-consumer-reactor/src/main/java/bz/stub/parallelconsumer/reactor/ReactorProcessor.java 51.52 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java

📄 parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java

File Similarity (%)
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorBatchTest.java 78.99 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 50.02 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java 48.38
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyPCTest.java

📄 parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyPCTest.java

File Similarity (%)
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorPCTest.java 71.88 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyUnitTestBase.java

📄 parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyUnitTestBase.java

File Similarity (%)
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorUnitTestBase.java 31.27
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java

📄 parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 86.19 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 85.94 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 85.01 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 82.61 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 82.61 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 82.61 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 81.13 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 81.13 ⚠️
parallel-consumer-reactor/src/main/java/bz/stub/parallelconsumer/reactor/ReactorProcessor.java

📄 parallel-consumer-reactor/src/main/java/bz/stub/parallelconsumer/reactor/ReactorProcessor.java

File Similarity (%)
parallel-consumer-mutiny/src/main/java/bz/stub/parallelconsumer/mutiny/MutinyProcessor.java 51.52 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorBatchTest.java

📄 parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorBatchTest.java

File Similarity (%)
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java 78.99 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 51.61 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java 49.91
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorPCTest.java

📄 parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorPCTest.java

File Similarity (%)
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyPCTest.java 71.88 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorUnitTestBase.java

📄 parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorUnitTestBase.java

File Similarity (%)
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyUnitTestBase.java 31.27
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java

📄 parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 86.19 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 85.94 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 85.01 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 82.61 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 82.61 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 82.61 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 81.13 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 81.13 ⚠️
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java

📄 parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 42.63
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 41.65
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 41.55
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java 37.57
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 35.02
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 32.39
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java

📄 parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java

File Similarity (%)
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java 41.81
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 41.55
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 35.57
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 33.33
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 32.44
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java

📄 parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java

File Similarity (%)
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java 43.71
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 41.65
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ExternalEngine.java 40.0
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java

📄 parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java

File Similarity (%)
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 43.71
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 41.81
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 37.57
parallel-consumer-vertx/src/test-integration/java/bz/stub/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java

📄 parallel-consumer-vertx/src/test-integration/java/bz/stub/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 35.47
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 31.07
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java

📄 parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 87.14 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 85.94 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 85.94 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 83.52 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 83.52 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 83.52 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 82.02 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 82.02 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java

📄 parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java

File Similarity (%)
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorBatchTest.java 49.91
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java 48.38
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 44.57

@github-actions

github-actions Bot commented Aug 19, 2026 •

Copy link
Copy Markdown

⚠️ SpotBugs Report

307 bug(s) found (rule-level exclusions only - see docs/inflight/static-spotbugs-rule-registry.md). See the annotations on the Files Changed tab for details.

@github-actions

github-actions Bot commented Aug 19, 2026 •

Copy link
Copy Markdown

🧪🔒 Quarantine Lane Report

Quarantined test Outcome Owner Meaning
PCMetricsTest.metricsRegisterBinding 🟡🎲 passed (flapper) ⚠️ unowned proves nothing - passes most runs by nature
ProducerManagerTest.producedRecordsCantBeInTransactionWithoutItsOffsetDirect 🔴 failing (expected) #262 quarantine holding

🔴 expected while the owner PR is open · 🟡🎲 flapper, pass proves nothing · 🚨 a deterministic quarantined test passing means its fix landed: delete its @Quarantined annotation + docs/quarantined-tests.md entry (a merge-blocking review thread has been opened). Lane: non-gating; rules: see the Quarantine Audit check.

@astubbs astubbs left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Lgtm

astubbs added a commit that referenced this pull request Aug 19, 2026
…umented override reachable

Review findings on #322, merge-guard group:

- /usr/local/bin/gh pr merge sailed past the token scan: the triple match
  required toks[i] == "gh" exactly, while docs/agent-harness.md names the
  full-path shape as one this guard exists for - and the sibling squash
  guard already caught it. The gh token is now matched by basename; a
  binary merely ending in "gh" (sleigh) still passes.

- The deny message's escape hatch was dead from inside a session: it said
  to re-run with MERGE_DESPITE_OUTSTANDING_WORK=1, but the hook read only
  its own process env - the HARNESS's env, which an agent cannot reach.
  An env prefix typed on the merge command arrives as command TOKENS, so
  the scan now honors NAME=VALUE assignments immediately preceding the gh
  token (=0 is not an override; the same token appearing after the command
  is not a prefix). The process-env form is kept for a human whose shell
  wraps the harness. The old self-test asserted only the env form - a
  delivery path the harness cannot produce - so it proved the wrong thing;
  the token form is now the primary case.

- The live-build arm had zero self-test coverage despite having already
  shipped one bug (pgrep matching the hook's own subshell), which was
  caught by accident. A fake pgrep on PATH now pins the arm in both
  directions: a java MavenWrapperMain under .claude/worktrees denies; a
  non-java process mentioning the build, and a java build outside the
  worktrees, do not. Each new case was proven able to fail by mutating
  the hook and watching it go red (docs/agent-harness.md rule 3): exact-gh
  match, ignored override token, dropped awk java filter, dropped
  worktrees grep, disabled build arm - one red case each.

- The stale-task ALLOW case was coupled to the machine's real process
  table: a genuine build under .claude/worktrees during a self-test run
  flipped it to DENY. The pgrep pattern is now overridable via
  MERGE_OUTSTANDING_BUILD_PATTERN, and the suite isolates itself with a
  never-matching pattern (and unsets any inherited override variable).

- ow_verdict/ow_expect duplicated verdict/expect, differing only in hook
  path and env delivery; verdict() now drives $HOOK_UNDER_TEST and the
  clones are deleted.

KNOWN LIMIT now stated in the header rather than implied away: a merge
wrapped in another interpreter - bash -c "gh pr merge ..." - reaches the
scan as one opaque token and is not seen; the squash guard shares the gap.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019infZnCpPvX8c6QWFC1uLC
astubbs added a commit that referenced this pull request Aug 19, 2026
…d, never pass it

Review findings on #322, IT-hardening group. The
reproduction's quiescence gate runs only BEFORE the paused registration loop
is released, so a rebalance landing after it (coordinator move,
session-timeout blip) would sweep the stale residents and re-deliver -
healing the staged collision and letting the final invariant pass green on
defective code too. The test is genuinely red against the pre-fix behaviour
today; this change is anti-rot, keeping silent degradation of that proof
impossible:

- the rebalance state (data-topic assignment count, last rebalance event
  clock) is captured at release and asserted unchanged after the final
  invariant - a healed run now fails as "run invalid" instead of passing;
- a worker whose processing-gate await times out sets a flag that is
  asserted false at the end: a de-saturated pipeline re-opens the take-scan
  (precondition 3) and silently voids the experiment.

Also two instrument fixes in PausableInsertShardManager:

- the 60s park deadline started at the pause point but had to outlast
  parking-topic creation plus the 60s rebalance-settle await (whose 5s-quiet
  condition resets on every rebalance event) - on a slow CI box the park
  could expire INSIDE the budgets it must survive, killing a valid run as a
  misleading "wiring failure" in a repo where a flake fails the build. Now
  PARK_DEADLINE_SECONDS = 150, and the test derives its worker-gate budget
  from the same constant so the gate always outlasts the park;
- the hand-rolled interrupt-swallowing park loop duplicated
  LatchTestUtils.awaitLatch (swallow the wake-up interrupt, re-wait, fail
  loudly on deadline; already imported by other integration tests) - it now
  delegates to the shared helper, rethrowing as the wiring-failure error.

The javadoc's citation of the deleted inflight note now points at the
solutions doc that retired it (the yaml and hook-header citations moved in
the preceding commit).

Red-proof re-run after these changes, per docs/testing.md's rule that a
modified test must be re-proven to discriminate: with
ProcessingShard.addWorkContainer's staleness check neutralised (if (false)),
the IT fails in 104s with the 909 signature naming exactly the collided
offsets' keys k-25..k-49 as missing; restored, it passes in 14s
(failsafe XML: tests=1 errors=1 -> tests=1 errors=0).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019infZnCpPvX8c6QWFC1uLC
@astubbs astubbs changed the title test(core) confluentinc#909: a deterministic broker-level reproduction, and a merge guard for the mistake that split it from its fix test(core) confluentinc#909: a deterministic reproduction, the precondition it uncovered, and the harness for the mistake that split it from its fix Aug 19, 2026
@astubbs
astubbs force-pushed the fix/909-load-reproduction branch from 58dd52d to b0acd8a Compare August 19, 2026 12:41
astubbs added a commit that referenced this pull request Aug 19, 2026
…d, never pass it

Review findings on #322, IT-hardening group. The
reproduction's quiescence gate runs only BEFORE the paused registration loop
is released, so a rebalance landing after it (coordinator move,
session-timeout blip) would sweep the stale residents and re-deliver -
healing the staged collision and letting the final invariant pass green on
defective code too. The test is genuinely red against the pre-fix behaviour
today; this change is anti-rot, keeping silent degradation of that proof
impossible:

- the rebalance state (data-topic assignment count, last rebalance event
  clock) is captured at release and asserted unchanged after the final
  invariant - a healed run now fails as "run invalid" instead of passing;
- a worker whose processing-gate await times out sets a flag that is
  asserted false at the end: a de-saturated pipeline re-opens the take-scan
  (precondition 3) and silently voids the experiment.

Also two instrument fixes in PausableInsertShardManager:

- the 60s park deadline started at the pause point but had to outlast
  parking-topic creation plus the 60s rebalance-settle await (whose 5s-quiet
  condition resets on every rebalance event) - on a slow CI box the park
  could expire INSIDE the budgets it must survive, killing a valid run as a
  misleading "wiring failure" in a repo where a flake fails the build. Now
  PARK_DEADLINE_SECONDS = 150, and the test derives its worker-gate budget
  from the same constant so the gate always outlasts the park;
- the hand-rolled interrupt-swallowing park loop duplicated
  LatchTestUtils.awaitLatch (swallow the wake-up interrupt, re-wait, fail
  loudly on deadline; already imported by other integration tests) - it now
  delegates to the shared helper, rethrowing as the wiring-failure error.

The javadoc's citation of the deleted inflight note now points at the
solutions doc that retired it (the yaml and hook-header citations moved in
the preceding commit).

Red-proof re-run after these changes, per docs/testing.md's rule that a
modified test must be re-proven to discriminate: with
ProcessingShard.addWorkContainer's staleness check neutralised (if (false)),
the IT fails in 104s with the 909 signature naming exactly the collided
offsets' keys k-25..k-49 as missing; restored, it passes in 14s
(failsafe XML: tests=1 errors=1 -> tests=1 errors=0).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019infZnCpPvX8c6QWFC1uLC
@astubbs astubbs changed the title test(core) confluentinc#909: a deterministic reproduction, the precondition it uncovered, and the harness for the mistake that split it from its fix fix(core) confluentinc#909: replace a stale container at a reused offset, plus the commit-path fixes that rode with it Aug 19, 2026
@astubbs

astubbs commented Aug 19, 2026

Copy link
Copy Markdown
Owner Author

@claude review this

Focus on the product code — this PR was just re-cut from a 206-file branch down to the 32 files of code it was named for, so it has never been reviewed in this shape.

Priorities:

  1. ProcessingShard.addWorkContainer — the Replace the existing stale container when adding work container confluentinc/parallel-consumer#909 fix replaces a stale resident at a reused offset. Is the availableWorkContainerCnt accounting correct on the replace path? The comment there argues the counter deliberately undercounts and that this is safe because getWorkIfAvailable scans entries directly rather than gating on the count. Check that argument rather than the comment.
  2. ConsumerOffsetCommitter / ConsumerManager (confluentinc#833: ParallelConsumer would run for a while and then exit due to InternalRuntimeException(Timeout) #177) — the retry-budget change makes PC give up where it previously hung. Is there a path where a caller now sees a failure it previously survived?
  3. RegistrationRaceStaleResidentIT — it fails a healed run as invalid rather than passing it. Confirm it cannot pass vacuously.
  4. Anything in this diff that depends on a file that moved to docs(inflight): rank open work by what it costs you, and land the tracker that reads it #323 or ci(tooling): gates for citations, inflight tags and test log levels, the agent hooks, and a netty CVE pin #324 and would break when this merges first.

@claude

claude Bot commented Aug 19, 2026 •

Copy link
Copy Markdown

Claude finished @astubbs's task in 9m 28s —— View job


Review of the re-cut PR (32 files, product code + tests)

Headline finding: most of src/main in this diff is already on master

Before the four priorities: I diffed this PR's HEAD (b0acd8a) against the current tip of origin/master (47157a4) file-by-file, not against whatever base GitHub's PR view is comparing against. Byte-for-byte identical to master already:
ConsumerManager.java, ConsumerOffsetCommitter.java, ProcessingShard.java, PartitionState.java, AbstractParallelEoSStreamProcessor.java, ShardManager.java, BrokerPollSystem.java — and OffsetCommitBudgetExceededException.java (listed as ADDED in this PR) already exists on master too.

Genuinely new relative to current master: ShardKey.java (the KEY-ordering javadoc/rename fix), WorkManager.java (one-line DI seam change), PCModule.java (new shardManager() DI method), and the test-only files (RegistrationRaceStaleResidentIT, ProcessingShardStaleReplacement909Test, ConsumerManagerCommitRetryBudgetTest, SubmitWorkToPoolShutdownRaceTest, CommitResponseTimeoutSymptomTest, PausableInsertShardManager, ChaosSeed, WorkContainerFutureIsWriteOnlyArchTest, the logback/Quarantined/AmbientProbe changes, etc.).

So the confluentinc#909 fix, the #177 commit-budget fix, and #209 are already live on master through some other route — this PR's GitHub diff (2919/-85 across 32 files) is being computed against a stale base, not against current master. My read of points 1 and 2 below is therefore a read of behavior already in production on master, not new risk this PR introduces — worth calling out explicitly, though it doesn't change the substance of the findings. Before merging: worth confirming with @astubbs whether this is expected (e.g. an earlier version of this branch's fix commits landed via a different already-merged PR) or whether GitHub's base needs correcting — as-is, merging this PR should be a no-op for those files and only add the new test files + the three small src/main diffs above.


1. ProcessingShard.addWorkContainer — the availableWorkContainerCnt accounting

The comment's core claim checks out: ShardManager.getWorkIfAvailable(requestedMaxWorkToRetrieve) calls shard.getWorkIfAvailable(remainingToGet, retryQueue) unconditionally per shard (ShardManager.java:267), and ProcessingShard.getWorkIfAvailable scans entries directly — it never gates on availableWorkContainerCnt. So under normal RUNNING operation, a stale-replaced fresh WorkContainer will be picked up on the next scan regardless of the undercount. That part of the reasoning is sound.

However, the counter isn't only a "backpressure gauge" — it also feeds ShardManager.getNumberOfWorkQueuedInShardsAwaitingSelection() → WorkManager.isRecordsAwaitingProcessing(), and that does gate a real decision: AbstractParallelEoSStreamProcessor.drain() (line ~1400-1408) calls isRecordsAwaitingProcessing() and, if it's false, calls transitionToClosing(). Once state != RUNNING/DRAINING, retrieveAndDistributeNewWork() stops calling wm.getWorkIfAvailable() at all (the if (state == RUNNING || state == DRAINING) guard at line 1121).

So there's a narrow but real path: if the stale-replace deficit happens to sum to zero across all shards (comment concedes it "can accumulate") at the exact moment a .close()/drain is triggered, isRecordsAwaitingProcessing() can report false while a genuine, untaken, fresh WorkContainer is still sitting in a shard's entries map — never counted, never taken. PC would transition to CLOSING and stop scanning, stranding that record uncommitted (it isn't permanently lost — never committed, so it redelivers after restart/rebalance — but it is dropped for the remainder of this instance's life, silently). This requires the 909 race and a concurrent close to coincide, so it's a rare compound of two already-rare conditions, but it means "no record is lost" is slightly overstated for the close/drain path specifically — worth either a one-line caveat in the comment, or (better) incrementing the counter on replace and accepting the minor gauge-inflation, since correctness of the close-decision seems worth more than backpressure precision here.

2. ConsumerOffsetCommitter / ConsumerManager retry-budget — does a caller now see a new failure?

Yes, and the authors already know it and test it: ConsumerManagerCommitRetryBudgetTest explicitly documents that with the shipped defaults (offsetCommitTimeout = 10s, Kafka's default.api.timeout.ms = 60s), a single commitSync attempt already exceeds the whole budget, so retriesWereReachable() fires and PC gives up after one attempt — by design, per the test's own comment ("This is the shipped default's shape, not an exotic one").

Answering the actual question — "does a caller now see a failure it previously survived?" — yes: before this fix, startedTime was captured inside the retry loop, so any attempt that failed faster than the budget retried forever with no backoff (a hang, not a success, but the process never gave up either). Now that path throws OffsetCommitBudgetExceededException, which is uncaught by commitDeferringOnRebalance (it only catches RebalanceInProgressException/CommitFailedException), propagates out of maybeDoCommit(), and is caught by BrokerPollSystem.controlLoop()'s outer catch (Exception e), which calls notifyPollerDied(e) and rethrows — killing the poll thread and, transitively, the whole PC instance. So: a transient broker condition that resolves within the old infinite-retry window but outside offsetCommitTimeout (e.g. a rolling restart or leader election lasting 90s against the 10s/60s defaults) now kills the consumer instance outright, where before it would eventually recover. That's the intended fix (honouring the configured budget rather than silently hanging forever), and the exception message already tells the operator to raise offsetCommitTimeout above default.api.timeout.ms — but it's a real, fatal-not-graceful behavior change for anyone currently running near-default settings, so it's worth a changelog callout (at release time, not in this PR) rather than something to fix here.

3. RegistrationRaceStaleResidentIT — can it pass vacuously?

No, the anti-rot guards look sound. The final three assertions independently check the two ways a green result could be meaningless: (a) dataTopicAssignments.get() == assignmentsAtRelease and (b) lastRebalanceEventNanos.get() == rebalanceClockAtRelease — both catch a healing rebalance landing after release (which would sweep the stale residents and redeliver, making the main assertion pass regardless of the fix), and (c) workerGateTimedOut.get() == false catches the pipeline de-saturating (which would open a take-scan and self-heal, precondition 3 in the class javadoc). Pre-fix, the collided offsets genuinely cannot complete while the assignment holds (per the class javadoc), so the main await().untilAsserted(...) doesn't just time-pad to a pass — it times out with named missing keys on unfixed code. One minor observation, not a defect: getFreshEpochInsertCount() >= RECORD_COUNT counts all fresh-epoch inserts, not specifically collisions at the paused offsets — but given the single-threaded control-loop ordering the test relies on (stale inserts for 25..49 must complete before the parked thread can move on to register the redelivered batch), the collision at those offsets is a structural consequence of the design rather than something the counter itself proves. Worth a one-line comment addition if you want the test to self-document that inference, but not a correctness gap.

4. Dependencies on files that moved to #323/#324

Two dangling doc citations in this PR's own code that point at files not present in this tree (so they'll be dead links until #323/#324 merge):

  • RegistrationRaceStaleResidentIT.java:50 cites docs/solutions/logic-errors/909-needs-a-saturated-pipeline-the-third-precondition-2026-08-19.md — that whole directory doesn't exist in this tree.
  • ConsumerManager.java:264 and ConsumerOffsetCommitter.java:199,245 each cite docs/inflight/next-exception-hierarchy-cleanup.md — also missing from this tree.

Neither breaks the build (they're comments), but per this repo's own citation rule ("run the grep before you commit the citation"), both are stale on arrival. Since this PR is meant to merge before #323, these will dangle for however long the gap between merges is — worth confirming those docs are actually in #323/#324 and not accidentally dropped in the split.

@astubbs

astubbs commented Aug 19, 2026 •

Copy link
Copy Markdown
Owner Author

Babysitter pass on the review above

Verified each finding independently against the tree rather than taking the review's word for it. Two of the four need a decision from @astubbs; the CI red does not.

Headline confirmed: the src/main fixes are already on master

Independently reproduced. git diff origin/master HEAD (two-dot, against master tip 47157a4) reports no delta at all for ProcessingShard.java, ConsumerManager.java, ConsumerOffsetCommitter.java, PartitionState.java, AbstractParallelEoSStreamProcessor.java, ShardManager.java, BrokerPollSystem.java or OffsetCommitBudgetExceededException.java. master carries the same commits by subject:

  • 5e8ea66ae fix(core) confluentinc#909: replace a stale container at a reused offset after rebalance
  • c31829fe6 fix(core) astubbs#177: make commitSync tell the truth about its budgets
  • fe45fddfa fix(core) astubbs#177: tell the waiting committer the poll thread died, do not make it wait
  • plus 538dad203, 77e687bbe, e103a8647, c38a6e98b, a113bf5b6

What this PR still adds over current master: PCModule.shardManager(WorkManager) (the DI seam), the one-line WorkManager change, the ShardKey javadoc correction, and the test-side work — RegistrationRaceStaleResidentIT, PausableInsertShardManager, the Quarantined annotation change and its contract test, the four logback-test.xml defaults, and the upstream-map.yaml entry.

Decision needed: the PR title and body describe a fix that has already landed. Either the title/body get re-pointed at what is actually left (the deterministic reproduction plus the DI seam), or the PR gets re-cut again. Not something a babysitter should decide.

Finding 1 — the suggested remedy would trade one inaccuracy for another

The drain-path reachability argument holds: ShardManager.getNumberOfWorkQueuedInShardsAwaitingSelection() feeds WorkManager.isRecordsAwaitingProcessing(), which AbstractParallelEoSStreamProcessor.drain() consults before transitionToClosing().

The proposed fix — increment on the replace path — is not unconditionally correct. ProcessingShard.getWorkIfAvailable already removes a stale resident it meets during a scan and calls dcrAvailableWorkContainerCntByDelta(1) for it. So a stale resident reaches addWorkContainer in one of two states: its decrement already spent (taken, or swept), where +1 is right; or still counted (never taken, not yet scanned), where +1 overcounts and errs towards not closing. Nothing at that call site distinguishes them, which is presumably why the existing comment chose the undercount and stated the direction it errs in.

So this is a real narrow gap with no one-line fix, on code that is already on master. It belongs in the follow-up ledger rather than in this PR.

Finding 4 — one citation genuinely dangles, and it is inherent to the split order

Worth knowing: master gained a file-reference gate (9bf231b60, .github/scripts/file-ref-gate.js, run inside the required PR Checklist job). This branch predates it, so it is not running here — but it will fire once master is merged in, and that citation is what it will catch.

CI: the Chaos Pain Suite red is ambient, not this PR

Diagnosed rather than retried away. ChaosRevokeUnderWorkIT.revokeUnderWorkStaysProtocolHonest failed with CLASS2_STALL/LAG_STAGNATION, 154s against the 150s bound. It failed again on a second run at the same head (44 violations, seed 5025143844151926220).

Control arm: the identical failure — same test, same violation class, same 154s, and in places the same per-partition lag/committed figures — is on unrelated branches today: ci/doc-reference-gate (run 32220130187, seed 158483520500617711), fix/859-metrics-leak-plus-cherrypicks, bugs/857-paused-consumption-multi-consumers-bug, test/177-commit-response-timeout.

It is also already tracked: docs/inflight/bug-857-family.md on master records this signature with the same numbers, as the sixth-plus sighting of the confluentinc#857 family. Nothing was loosened, retried into green, or quarantined here — this is master state, not PR state, and the suite is not a required check.

The claude-review red

The gate's condition is satisfied — a finished claude[bot] review is on this PR. The gate only runs on pull_request events and its old run cannot be retried, so it needs one push (or a reopen) to re-fire. Left for @astubbs rather than manufacturing a commit for it.

Automated babysit pass — no code was changed, nothing was merged.

The forced merge order now rests on one file

The description says #322 must land before #323 "whose citations reference files added here". Checked which files #323 actually cites, and whether master already has them:

Cited by #323 On master?
ProcessingShardStaleReplacement909Test yes
WorkContainerFutureIsWriteOnlyArchTest yes
CommitResponseTimeoutSymptomTest yes
ConsumerManagerCommitRetryBudgetTest yes
SubmitWorkToPoolShutdownRaceTest yes
ChaosSeed yes
RegistrationRaceStaleResidentIT no — added by this PR

So the ordering constraint is real but reduced to a single file. If #323 landed first, only its citation of RegistrationRaceStaleResidentIT would dangle — and the reverse dangle already exists in the other direction (this PR cites 909-needs-a-saturated-pipeline-the-third-precondition-2026-08-19.md, which lives in #323). Whichever merges first, one citation dangles until the other lands; the description's "must land before" is stated more strongly than the evidence supports.

Also worth knowing: the Lgtm review satisfying the required review: human LGTM check was submitted at 07:50, before the @claude review this round that produced the findings above. The gate is deliberately not head-fresh, so it stays green regardless.

@astubbs
astubbs force-pushed the fix/909-load-reproduction branch from b0acd8a to f042664 Compare August 19, 2026 21:25
astubbs added a commit that referenced this pull request Aug 19, 2026
…d, never pass it

Review findings on #322, IT-hardening group. The
reproduction's quiescence gate runs only BEFORE the paused registration loop
is released, so a rebalance landing after it (coordinator move,
session-timeout blip) would sweep the stale residents and re-deliver -
healing the staged collision and letting the final invariant pass green on
defective code too. The test is genuinely red against the pre-fix behaviour
today; this change is anti-rot, keeping silent degradation of that proof
impossible:

- the rebalance state (data-topic assignment count, last rebalance event
  clock) is captured at release and asserted unchanged after the final
  invariant - a healed run now fails as "run invalid" instead of passing;
- a worker whose processing-gate await times out sets a flag that is
  asserted false at the end: a de-saturated pipeline re-opens the take-scan
  (precondition 3) and silently voids the experiment.

Also two instrument fixes in PausableInsertShardManager:

- the 60s park deadline started at the pause point but had to outlast
  parking-topic creation plus the 60s rebalance-settle await (whose 5s-quiet
  condition resets on every rebalance event) - on a slow CI box the park
  could expire INSIDE the budgets it must survive, killing a valid run as a
  misleading "wiring failure" in a repo where a flake fails the build. Now
  PARK_DEADLINE_SECONDS = 150, and the test derives its worker-gate budget
  from the same constant so the gate always outlasts the park;
- the hand-rolled interrupt-swallowing park loop duplicated
  LatchTestUtils.awaitLatch (swallow the wake-up interrupt, re-wait, fail
  loudly on deadline; already imported by other integration tests) - it now
  delegates to the shared helper, rethrowing as the wiring-failure error.

The javadoc's citation of the deleted inflight note now points at the
solutions doc that retired it (the yaml and hook-header citations moved in
the preceding commit).

Red-proof re-run after these changes, per docs/testing.md's rule that a
modified test must be re-proven to discriminate: with
ProcessingShard.addWorkContainer's staleness check neutralised (if (false)),
the IT fails in 104s with the 909 signature naming exactly the collided
offsets' keys k-25..k-49 as missing; restored, it passes in 14s
(failsafe XML: tests=1 errors=1 -> tests=1 errors=0).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019infZnCpPvX8c6QWFC1uLC
astubbs added a commit that referenced this pull request Aug 19, 2026
…, not a family member

`PCMetricsTest.metricsRegisterBinding` was recorded as the family's signature on 2026-08-14. It is
not. The test asserts PARTITION_LAST_COMMITTED_OFFSET equals a COMPLETION counter while the suite
runs UNORDERED: commits are contiguous and bounded by the lowest incomplete offset, completions are
not ordered, and workers latch BEFORE incrementing, so a latched worker's offset never completes and
the gap is permanent. No timeout closes it.

That mechanism answers the question the entry itself left open - it asked for a full-suite run
"repeated enough times to put a number on the rate" - and answers it better than a rate would. It
explains why only loaded runs fail (concurrency is what produces out-of-order completion), why
isolated runs pass, and both observed gaps: 2 records here, 7 on the later #322 sighting.

Caught by a reviewing agent as a self-contradiction: this branch simultaneously recorded the test as
an 857 sighting here and ruled it OUT of the family in
bug-pcmetrics-committed-offset-vs-completion-count.md. The ruling-out is the correct half.

The original assessment is retained rather than deleted - this file already records one contamination
of exactly this kind (a transactional-mode failure logged as confirming a cycle impossible in that
mode), and the reasoning that led here is worth seeing.
astubbs added a commit that referenced this pull request Aug 19, 2026
…r they need

#322 carries ten unrelated workstreams over 66 commits and 206 files; the confluentinc#909
reproduction it is named for is 13 commits and 20 files of that.

Records the feasibility MEASUREMENT rather than an estimate: each group cherry-picked onto master in
a throwaway worktree. Four groups replay fully clean (CI gates 8/8, #209 4/4, the
confluentinc#857 ledger 5/5, test logging 1/1); the harness+tracker group blocks after one commit.

The governing constraint is that cherry-pick replays a commit's ORIGINAL diff. Master gained
bin/test-check-agent-hooks.sh from #299 after these commits were written, and this branch's one
merge already resolved that overlap - replay throws the resolution away and re-fights it. Merging
master again cannot help, and there is nothing to merge: the branch is 0 behind. What the branch being
current DOES buy is that `git diff master...HEAD` describes the resolved state and therefore applies to
master by construction - verified, 35/35 exclusive files clean.

Hence two methods (replay where clean, diff-extraction where not) and, more importantly, a STACK
rather than ten independent branches: PR 2 adds tag headers to ~70 existing inflight notes while later
groups edit those same notes' bodies, so extracting independently turns every one of those into a
conflict, while extracting in order applies them on top.

Also corrects a grouping error - "agent hooks" and "inflight tracker" are one workstream, not two; the
merge guard and the session index are the same hook system.

Adds a tenth PR that is new work rather than an extraction: a conflict-marker gate, prompted by
finding 305 lines of docs/inflight/bug-857-family.md committed and pushed inside an unresolved
conflict on the #29 branch, with no gate in bin/ looking for markers.

No history is rewritten by this commit. Re-cutting #322 itself is a force-push to a pushed
branch and is left as the owner's call.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019infZnCpPvX8c6QWFC1uLC
@astubbs astubbs changed the title fix(core) confluentinc#909: replace a stale container at a reused offset, plus the commit-path fixes that rode with it test(core) confluentinc#909: a deterministic reproduction of the stale-container race, and the seam it needs Aug 19, 2026
astubbs added a commit that referenced this pull request Aug 19, 2026
…at lands one PR up

A simplify-and-verify pass over this PR's own diff (#323), applying the
repo's never-state-a-fact-twice rule and repairing the citations the file-reference gate was
failing on.

- bug-857-family.md: the seventh sighting's SUPERSEDED block restated the full mechanism that
  bug-pcmetrics-committed-offset-vs-completion-count.md owns (UNORDERED vs completion counter,
  latch-before-increment, the permanent gap). Trimmed to the verdict plus a pointer naming the
  owner; the family-specific reasoning (do not count it as a sighting, the contamination precedent)
  is untouched. The mechanism itself was verified against PCMetricsTest and
  AbstractParallelEoSStreamProcessorTestBase before trimming - the supersession is correct.

- check-merge-outstanding-work.sh is delivered by #324 (the tooling half of
  the #322 split), not by #322 as next-agent-self-review-as-blocking-pr-comments.md
  claimed - verified against both PRs' file lists. Corrected the attribution, added the same
  provenance where agent-harness.md and compound-engineering.md describe the hook, and closed the
  three citing paragraphs with file-refs N/A markers naming #324, which is the gate's own
  prescribed repair for a file that lives on another branch. bin/check-file-refs.sh was red on
  exactly these three citations (the PR Checklist lane's only real failure) and is green after.

- compound-engineering.md: "all 71 notes" was already off by one (72 tagged notes on this branch)
  and drifts every time a note is added or closed - reworded to "every open note", which stays true.

- bug-retry-queue-orphaned-by-inline-stale-removal.md: a [[wiki-style]] link nothing renders,
  rewritten as the markdown link every other note uses.

Verified locally: bin/check-file-refs.sh and bin/check-issue-refs.sh both pass.

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

astubbs commented Aug 19, 2026

Copy link
Copy Markdown
Owner Author

Automated review (ce-code-review, 7 lenses + validation pass) - 5 findings, verdict: Ready with fixes

Roster: correctness, adversarial, testing, project-standards, maintainability, previous-comments, learnings-researcher; the 3 actionable findings below were re-verified by an independent validation pass against the worktree. Cross-model pass not run (no different-family CLI on this host).

Apply queue (mechanical, fixes proposed):

  1. P1 - the fail-as-invalid design never OBSERVES the staged collision - PausableInsertShardManager.java (freshEpochInsertCount.incrementAndGet() is the instrument's only measurement). The three anti-rot assertions rule out the two KNOWN heal paths (post-release rebalance, worker-gate timeout), but a heal path outside that pair - e.g. the take-scan eviction in ProcessingShard, suppressed today only by the delta < 1 guard - would turn the reproduction permanently green with the defect branch unexercised. Fix: probe the shard for an existing resident on each fresh-epoch insert (the instrument already sits in bz.stub.parallelconsumer.state), count stale-resident collisions, and add a fourth run-validity assertion staleResidentCollisionCount == RECORD_COUNT - PAUSE_AT_OFFSET (25). Found independently by 2 reviewers; validator-confirmed.
  2. P3 - vertx IT narration silently dropped by the new warn default - parallel-consumer-vertx/src/test/resources/logback-test.xml. Core got the always-on ${pc.log.level:-info} carve-out for ...integrationTests; vertx is the only sibling with a failsafe suite (VertxConcurrencyIT, 9 log.info narration calls) and got none. Fix: <logger name="bz.stub.parallelconsumer.vertx.integrationTests" level="${pc.log.level:-info}"/>. 2 reviewers; validator-confirmed.
  3. P2 - produceKeyedRange re-implements the shared produce shape inline - RegistrationRaceStaleResidentIT. docs/testing.md: "When you must add a helper, put it in the shared util, not the test" - and the helper's own javadoc establishes this IS the must-add case. Fix: add an offset-keyed overload to KafkaClientUtils. Validator-confirmed.

Decisions for the author:

  1. P2 - Quarantined.java cites docs/quarantined-tests.md rule 1 "for why this is no longer 'without diagnosis'", but that doc still says "No quarantine without diagnosis" on this branch and master - the rewording lands in stacked docs(inflight): rank open work by what it costs you, and land the tracker that reads it #323, so master carries a self-contradicting pair from this PR's merge until docs(inflight): rank open work by what it costs you, and land the tracker that reads it #323's (permanently if it stalls). Pull the one-hunk doc edit into this PR, or make the javadoc an explicit forward reference.
  2. P2 - the PR body still narrates the Replace the existing stale container when adding work container confluentinc/parallel-consumer#909 / confluentinc#833: ParallelConsumer would run for a while and then exit due to InternalRuntimeException(Timeout) #177 / chaos: poll control thread submits to an already-terminated executor during cooperative revoke #209 fixes and their "coverage" as delivered here - none of that code is in this 11-file diff (it merged to master earlier), and the checklist box "Title & body reflect the final content" is currently wrong. The title was already fixed; the body was not.

Notable non-findings, checked and dismissed: the DI seam's public visibility is the Java minimum for the cross-package WorkManager call and mirrors workManager(); the four logback-test.xml copies are structurally forced by Maven per-module test-resource isolation (mutiny/reactor were byte-identical before this PR); QuarantinedAnnotationContractTest constrains exactly what it did before the wording change (non-blank reason/tracking) - though nothing machine-enforces the new "sighting ledger" bar; the new IT's javadoc citation of the 2026-08-19 solutions doc is stack-intentional (the doc is in #323).

Residual risks worth a glance: LatchTestUtils.awaitLatch re-arms its full timeout per swallowed interrupt, so the park can dwell ~2x150s - exactly the @Timeout(300) budget, zero headroom; the prior review's deferred availableWorkContainerCnt undercount has no docs/refactoring.md entry yet; the instrument's own park/release narration (package ...state) sits below the warn default, so a red run of the new IT is mute without -Dpc.log.level.

astubbs added a commit that referenced this pull request Aug 19, 2026
…lives only in a conversation

Three PRs are open at once and their open items were being carried in chat. Each note records what is
still open on that PR, what was already fixed so it is not re-litigated, and what nobody has verified.

The item most at risk of being lost is #322's: `RegistrationRaceStaleResidentIT` rules out the
two known heal paths but never observes the collision itself. The uncovered path is
`ProcessingShard`'s take-scan stale eviction, suppressed today only by `WorkManager`'s `delta < 1`
guard - if that arithmetic shifts, the reproduction goes permanently green with the defect branch
unexercised. Proposed fix: count stale-resident collisions at insert and assert exactly 25, so the
test asserts the mechanism rather than the absence of two known escapes. Needs a broker, so it is not
applied.

#323's note records that this PR breaks the session index until #324 lands: master's
hook keys on `inflight-priority` and has zero references to `inflight-impact`, and this PR removes
those markers, so the "open work" block goes silently empty in the window between them. Two ways out
are written down; the decision is open.

#324's note keeps the deliberately-red `test-check-agent-hooks.sh` visible - it asserts against
the LIVE inflight corpus rather than a fixture, so it needs #323's notes - along with the
over-triggering pre-commit hook and the five commits whose bodies could not be replayed.

Written on this branch rather than #324 because they cite no not-yet-landed script. Note that
`bin/check-inflight-tags.sh` cannot even be RUN from here to validate their tags - it lands one PR up
- which is the window these notes describe, met in practice while writing them.
astubbs added a commit that referenced this pull request Aug 19, 2026
…, not a family member

`PCMetricsTest.metricsRegisterBinding` was recorded as the family's signature on 2026-08-14. It is
not. The test asserts PARTITION_LAST_COMMITTED_OFFSET equals a COMPLETION counter while the suite
runs UNORDERED: commits are contiguous and bounded by the lowest incomplete offset, completions are
not ordered, and workers latch BEFORE incrementing, so a latched worker's offset never completes and
the gap is permanent. No timeout closes it.

That mechanism answers the question the entry itself left open - it asked for a full-suite run
"repeated enough times to put a number on the rate" - and answers it better than a rate would. It
explains why only loaded runs fail (concurrency is what produces out-of-order completion), why
isolated runs pass, and both observed gaps: 2 records here, 7 on the later #322 sighting.

Caught by a reviewing agent as a self-contradiction: this branch simultaneously recorded the test as
an 857 sighting here and ruled it OUT of the family in
bug-pcmetrics-committed-offset-vs-completion-count.md. The ruling-out is the correct half.

The original assessment is retained rather than deleted - this file already records one contamination
of exactly this kind (a transactional-mode failure logged as confirming a cycle impossible in that
mode), and the reasoning that led here is worth seeing.
astubbs added a commit that referenced this pull request Aug 19, 2026
…at lands one PR up

A simplify-and-verify pass over this PR's own diff (#323), applying the
repo's never-state-a-fact-twice rule and repairing the citations the file-reference gate was
failing on.

- bug-857-family.md: the seventh sighting's SUPERSEDED block restated the full mechanism that
  bug-pcmetrics-committed-offset-vs-completion-count.md owns (UNORDERED vs completion counter,
  latch-before-increment, the permanent gap). Trimmed to the verdict plus a pointer naming the
  owner; the family-specific reasoning (do not count it as a sighting, the contamination precedent)
  is untouched. The mechanism itself was verified against PCMetricsTest and
  AbstractParallelEoSStreamProcessorTestBase before trimming - the supersession is correct.

- check-merge-outstanding-work.sh is delivered by #324 (the tooling half of
  the #322 split), not by #322 as next-agent-self-review-as-blocking-pr-comments.md
  claimed - verified against both PRs' file lists. Corrected the attribution, added the same
  provenance where agent-harness.md and compound-engineering.md describe the hook, and closed the
  three citing paragraphs with file-refs N/A markers naming #324, which is the gate's own
  prescribed repair for a file that lives on another branch. bin/check-file-refs.sh was red on
  exactly these three citations (the PR Checklist lane's only real failure) and is green after.

- compound-engineering.md: "all 71 notes" was already off by one (72 tagged notes on this branch)
  and drifts every time a note is added or closed - reworded to "every open note", which stays true.

- bug-retry-queue-orphaned-by-inline-stale-removal.md: a [[wiki-style]] link nothing renders,
  rewritten as the markdown link every other note uses.

Verified locally: bin/check-file-refs.sh and bin/check-issue-refs.sh both pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019infZnCpPvX8c6QWFC1uLC
astubbs added a commit that referenced this pull request Aug 19, 2026
…lives only in a conversation

Three PRs are open at once and their open items were being carried in chat. Each note records what is
still open on that PR, what was already fixed so it is not re-litigated, and what nobody has verified.

The item most at risk of being lost is #322's: `RegistrationRaceStaleResidentIT` rules out the
two known heal paths but never observes the collision itself. The uncovered path is
`ProcessingShard`'s take-scan stale eviction, suppressed today only by `WorkManager`'s `delta < 1`
guard - if that arithmetic shifts, the reproduction goes permanently green with the defect branch
unexercised. Proposed fix: count stale-resident collisions at insert and assert exactly 25, so the
test asserts the mechanism rather than the absence of two known escapes. Needs a broker, so it is not
applied.

#323's note records that this PR breaks the session index until #324 lands: master's
hook keys on `inflight-priority` and has zero references to `inflight-impact`, and this PR removes
those markers, so the "open work" block goes silently empty in the window between them. Two ways out
are written down; the decision is open.

#324's note keeps the deliberately-red `test-check-agent-hooks.sh` visible - it asserts against
the LIVE inflight corpus rather than a fixture, so it needs #323's notes - along with the
over-triggering pre-commit hook and the five commits whose bodies could not be replayed.

Written on this branch rather than #324 because they cite no not-yet-landed script. Note that
`bin/check-inflight-tags.sh` cannot even be RUN from here to validate their tags - it lands one PR up
- which is the window these notes describe, met in practice while writing them.
astubbs added a commit that referenced this pull request Aug 19, 2026
…h, and retag two

The three per-PR notes were all written here, which is wrong in a way that breaks a hook rather than
merely being untidy: `check-merge-outstanding-work.sh` looks for `docs/inflight/pr-<N>-*.md` in the
tree of the branch being merged. With #322's note living only here, merging #322 would
find nothing and the guard would pass silently - the exact failure it exists to prevent. Each note now
travels with its PR; this one keeps its own.

Also retags two on review:

- `perf-comparison-matrix` was `task`/`process`. Its own subject is the README performance test
  running in each proxy language - the double-click demo wanted before #293 - which is
  something a user watches. `feature`.
- `process-quarantine-lane-foss` was `task`/`process`. It proposes extracting the quarantine lane as
  a separate published project; that is a thing to build, not a way of working. `feature`.

`process-candidate-ranking` is left as `task`/`process` deliberately, against the suggestion of
`release-gate`. Nothing in it blocks publishing - its own text has three mentions of ranking and one
of release - and `release-gate` means "blocks a release" rather than "decides what goes in one". The
objection that `task` reads as a single discrete action is fair and unresolved: it is a standing
register, and the vocabulary has no type for that.
astubbs added a commit that referenced this pull request Aug 26, 2026
…survives its own PR

check-branch-self-reference.sh flagged the migrated note for naming #322 in the present:
the incident it records happened "on a branch during the #322 split", which is a claim about
an arrangement that ends when this merges. The sentence now dates the incident and says the branch
is gone and the PR has landed, so the citation records history rather than a live arrangement.

Local runs of that gate cannot see this: it resolves the PR with `gh pr list --head <branch>`, and
this worktree's local branch (merge/322-master-3) is not the PR's head ref
(fix/909-load-reproduction), so the PR arm never armed and only the CI run had the number. Run it as
`PR_NUMBER=322 bin/check-branch-self-reference.sh` from a worktree whose branch name differs from
the PR head.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Aug 26, 2026
…t a CI pass

The gate resolves "this PR" with `gh pr list --head <branch>`, so in a worktree whose local branch
is not the PR's head ref - a `merge/NNN-...` branch pushing to `fix/...`, which is how master merges
are staged in this repo - the lookup returns nothing, the PR arm never arms, and every `#NNN`
mention passes locally. CI sets GITHUB_HEAD_REF, arms it, and fails. That happened on this PR one
push before this commit: a migrated note naming #322 was clean under a full local
`bin/check-all.sh` sweep and red in Repo Hygiene.

Nothing can detect this from inside the run - an empty PR lookup is indistinguishable from "no PR
yet", which is a legitimate local state the gate deliberately supports. So the header now names the
workaround, `PR_NUMBER=<n> bin/check-branch-self-reference.sh`, where a reader hits the trap.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@astubbs
astubbs marked this pull request as ready for review August 26, 2026 12:30
astubbs and others added 8 commits August 26, 2026 12:58
…ule, like every other collaborator

`PCModule` already provides `workManager`, `brokerPoller`, `producerManager` and `consumerManager`;
its own javadoc calls it the DI system, and `PCModuleTestEnv` is the established seam for
substituting a collaborator in tests. `ShardManager` was the exception, constructed inline by
`WorkManager`, so it was the one collaborator no test could substitute - which is why the
broker-level confluentinc#909 reproduction later in this branch could not be written without it.

This completes the existing pattern rather than adding a hook for the test that needs it: no
test-only branch, no flag, no latch in production. The provider takes the owning `WorkManager` as a
parameter because the two are mutually dependent and `WorkManager`'s constructor is mid-flight when
it resolves this - `workManager()` would recurse.

Not a new design. `d7eb0a3a03` ("fix: module: resolve recursive dependency", 2022-09-05, on
`origin/improvements/remove-static`) makes the identical change for the same stated reason, so this
is a rediscovery of a call already made once, four years ago, on a branch that never landed.

The caching is a plain null-check rather than anything thread-safe, sufficient because `WorkManager`
has exactly one construction site and construction is single-threaded. It does mean the method
silently discards its argument once memoised - the hazard the next commit closes.

Verified not to disturb anything: full core unit suite green.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…rather than sharing them

A `PCModule` holds ONE parallel consumer's collaborator graph. Two of its getters memoise a
collaborator while taking that collaborator's owner as a method parameter, so on the cache-hit path
the argument is there to be ignored - and ignoring it hands a second owner an object still wired to
the first. Neither failure surfaces where it is caused, and both are now rejected with an
`IllegalStateException` that names the fix.

`shardManager(WorkManager)`, introduced by the preceding commit, is the first. A second
`WorkManager` built against one module would have been handed the first's `ShardManager`: its
`PartitionStateManager` and its shard manager would then operate on different owners, and nothing
would go red. Before that seam existed each `WorkManager` constructed its own, so the hazard is new
with the seam. It is reachable through the public `WorkManager` constructor and
`PCModule.setWorkManager`.

`brokerPoller(AbstractParallelEoSStreamProcessor)` is the second, found by sweeping `PCModule` for
the same shape once the class of defect was named rather than the symptom. A second processor would
have received a `BrokerPollSystem` polling a broker on behalf of the first - registering the first's
metrics gauges, delivering the newcomer nothing. Its only caller today is
`AbstractParallelEoSStreamProcessor`'s constructor, once per module, so the collision is unreachable
- but that is a property of the callers, not of the method, and "reachable only because callers
behave" is the argument this commit rejects.

BOTH GETTERS ARE NOW FINAL, and substitution goes through `createShardManager(WorkManager)`. This is
not tidiness. The one place in the tree that substitutes a `ShardManager` - the confluentinc#909
reproduction two commits along - does it by subclassing the module, and written against the
memoising getter it overrode the memoisation and the guard away with it, reinstating the exact
defect in the same branch that guards against it. That is what the sweep found. Splitting the
factory out puts the memoisation and the guard where an override cannot reach them, so the compiler
now refuses the mistake instead of a reviewer having to catch it.

Rejected alternatives: rebuilding the cache for the newcomer, which breaks the module's
one-instance-per-collaborator contract and leaves the first owner silently orphaned; and leaving it
with a javadoc note, which is what the seam commit originally parked in `docs/refactoring.md` - a
"safe only while nothing does X" caveat wants a check that fails, not a paragraph.

`PCModuleCollaboratorOwnershipTest` covers both sides of each guard plus the factory seam. It is
named for the defect CLASS, not for one instance, so the next memoised-with-owner collaborator gets
a test rather than its own file. Mutation-checked: deleting either guard turns exactly its own test
red and leaves the rest green.

Swept and dismissed, tree-wide, for "a memoised collaborator that ignores its owner argument":
`producerWrap()`, `producerManager()`, `consumerManager()`, `workManager()`, `pc()`,
`dynamicExtraLoadFactor()` and `pcMetrics()` are memoised but take no owner argument; every
`computeIfAbsent`/`putIfAbsent` factory in the tree is key-scoped and captures no owner-like
parameter; `SupplierUtils.memoize`'s only production use is instance-scoped inside the owner's own
constructor; there are no `@Getter(lazy=true)` fields and no DI holder other than `PCModule`.

Still open, deliberately out of scope: `PCModule.setParallelEoSStreamProcessor` is the mirror image
- a second processor's constructor overwrites the module's `pc` reference BEFORE the `brokerPoller`
guard fires, so the rejection path leaves the module pointing at the half-built newcomer. That is
pre-existing behaviour and a separate change.

Raised by @codex on #322.

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

The comment on `KeyOrderedKey` claimed "we use just the topic name here, and not the partition", and
the field was named `topicName` to match. Both were wrong: the constructor passes
`new TopicPartition(rec.topic(), rec.partition())`, so the shard has always been identified by
(topic, partition, key).

The CODE is right and the doc was the lie, which is the dangerous direction - anyone acting on the
comment would "fix" the constructor to drop the partition and introduce silent data loss.
`ProcessingShard`'s `entries` map is keyed by OFFSET, and offsets are unique only WITHIN a
partition, so two records sharing a key on different partitions would land in one map under one key
and one would vanish without a trace.

The javadoc now says why partition scoping is load-bearing rather than merely asserting it, and the
field is renamed to `topicPartition`. Compat-safe: the Lombok-generated `getTopicName()` has no
callers anywhere in the tree, and 0.6.0.0 is unreleased and is itself the release introducing the
`bz.stub.*` coordinates, so no shipped artifact ever exposed the old getter under this package.

Retires the corresponding `docs/refactoring.md` entry in the same commit - an entry and the change
that retires it are one change, or the backlog outlives the work it describes.

Found while reviewing #31; pre-existing and independent of it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…n, and the third precondition it uncovered

#31 shipped the fix with unit-level proof and an openly declared gap: no load-level evidence.
This closes it with something stronger than a soak - a broker-real reproduction that discriminates
every run, with no seed and no sleeps.

Building it uncovered why nothing had reproduced the defect before. The loss needs THREE
coincidences, not the two previously recorded: a rebalance inside the registration insert loop, the
partition returning so the uncommitted tail re-delivers, and - the missing one - NO take-scan of the
shard in between. `ProcessingShard.getWorkIfAvailable` lazily evicts stale containers as it scans, so
an ordinary take-scan HEALS the collision before a fresh arrival can hit it. Only a consumer whose
pipeline is at target keeps residents alive long enough to eat a fresh record.

That explains the standing puzzle: the Chaos Pain Suite is green on defective master not through an
unlucky seed but because its own churn is the healing mechanism. Random reproduction was fighting
itself. It also narrows the production risk - this bites BUSY consumers, not idle ones.

The test drives all three deliberately: a gated user function saturates the pool so the control
loop's delta stays at or below zero, a fixed message-buffer size pins the load factor so the target
cannot step mid-experiment, a second group member on another topic forces an eager revoke/re-assign,
and the insert is parked mid-loop until re-delivery has fully registered. Every await is event-gated
- latches, listener callbacks, instrument counters - so a failure is loud rather than slow.

**Proven both ways, and re-proven after every change to it.** With `addWorkContainer`'s
stale-replacement branch disabled - the pre-fix drop-on-collision behaviour, a local-only edit since
reverted - the IT fails after the 90s invariant await on the confluentinc#909-signature assertion,
"a fresh arrival colliding with a stale shard resident was dropped", and NOT on any run-invalid
guard. Green arm passes in ~14.5s. Run before and after the review passes, per docs/testing.md's
rule that a modified test must be re-proven to discriminate.

**A healed run fails as invalid rather than passing.** The quiescence gate runs only BEFORE the
paused loop is released, so a rebalance landing after it (coordinator move, session-timeout blip)
would sweep the residents and heal the staged collision. Four run-invalid guards close that:
rebalance state captured at release and asserted unchanged; a worker leaving the processing gate
early - timeout or interrupt - sets a flag asserted false at the end, because a de-saturated
pipeline re-opens the take-scan; and `getNumberRecordsOutForProcessing() == MESSAGE_BUFFER_SIZE`
asserted both in the saturation await and again at gate-open, since that count is the actual term in
the `delta = target - outForProcessing` arithmetic the suppression rests on. A future shift in the
load factor now fails loudly instead of leaving the test green with the defect branch unexercised.

`PausableInsertShardManager` parks the CONTROL thread at the head of exactly one designated insert,
after that batch has passed the `epochIsStale` guard. Three things about it are load-bearing and
were each got wrong once: the park must dwell THROUGH interrupts, because PC wakes its control
thread by interrupting it, so it delegates to the shared `LatchTestUtils.awaitLatch` rather than a
hand-rolled loop; `PARK_DEADLINE_SECONDS` is 150 rather than 60 because the park must outlast
parking-topic creation plus a rebalance-settle await whose quiet condition resets on every rebalance
event, and expiring inside those budgets would kill a valid run as a misleading "wiring failure" in
a repo where a flake fails the build; and `freshEpochInsertCount` increments AFTER the insert, not
before, so the counter means "registered" - which is what the test's gate-open condition, polled
from the awaitility thread, already claimed.

THE WORKER GATE IS ANCHORED TO THE CLASS BUDGET, not derived from an event that has not happened
yet. The deadline was `PARK_DEADLINE_SECONDS + 60` = 210s, but a worker enters the gate in step 1
and the park does not start until step 2; everything staged between gate entry and gate open can
spend 30 + 30 + 60 + 30 = 150s of awaits plus the final 90s invariant await, so on a slow broker a
run still inside the 300s class budget could expire the gate, de-saturate the pipeline and fail as
"run invalid" - a flake, and this build has no retry. It is now deliberately longer than the class
budget, so `@Timeout` is the binding deadline and a too-slow run says so instead of blaming
de-saturation.

THE PRODUCE HELPER IS SHARED. `produceKeyedRange` was a private second implementation of
produce-and-track, which docs/testing.md forbids: producer setup, ack waiting and error handling
would have had to be fixed in two places. The deferral once recorded for this rested on needing a
broker run over every existing caller - but the fix is an ADDITIVE overload, so no existing caller
moves and that argument does not hold. `KafkaClientUtils.produceOffsetKeyedRange` now owns it, and
asserts the key<->offset correspondence its javadoc claims rather than assuming it: a topic that
cannot honour the contract fails at the produce instead of as a confusing missing-record assertion
later.

TEARDOWN ASSERTS THE SECOND MEMBER STOPPED. Its running flag is only read between polls, so a poll
or close already in flight could outlast the 10s join, leaving a live non-daemon thread and a live
group member to rebalance into whichever broker test ran next. Teardown now uses `wakeup()`, the one
cross-thread-safe `KafkaConsumer` call, waits long enough to cover a slow close, and ASSERTS the
thread stopped - the failure belongs here, not in the next test.

Untagged, so it runs in the ordinary failsafe lane: it is deterministic, not chaos.

**What it still cannot do**: it rules out both KNOWN heal paths but never OBSERVES the collision, so
an unknown heal path that evicts residents without de-saturating would turn it silently green. That
is deferred with its evidence and its design in
`docs/inflight/test-909-reproduction-cannot-observe-the-collision.md` - including the finding that
the fix needs no production change - because confirming the count needs a broker. The note states
the acceptance shape rather than a hardcoded collision count, so retuning either constant cannot
leave an obsolete literal reading as the agreed value.

Raised by @codex on #322.

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

Rule 1 was "no quarantine without diagnosis". It conflated two different unknowns - "we do not know
the mechanism" and "we do not know whether it is ours" - and only the second justifies blocking. A
test with a recorded sighting ledger IS a finding: it is known master-state flaky. It just has no
root cause yet.

The cost of the old wording was that an undiagnosed red stayed in the gating lane and blocked every
unrelated PR, which trains everyone to read red as normal. This repo already deleted surefire
retries for hiding flakes; a permanently-red gate destroys the same signal more thoroughly. The tell
that the default was miscalibrated: its escape hatch was an owner-granted exception, and the
exception had become the routine path - `test-untracked-ci-flakes.md` records the owner having to
grant one for a test failing 4 in 45 runs, which is a ledger by any reading.

Rule 1 now asks for EVIDENCE: a diagnosed mechanism, or a recorded sighting ledger (dates, runs,
signature, and what makes it master-state rather than PR-state). What stays banned is a hunch - "it
is red sometimes" is not evidence, and a single failure is a sighting, not a ledger. Nothing else
moves: the lane still runs the test, the registry still keeps it loud, rule 5 still blocks a release
while the list is non-empty. Quarantine defers; it does not forgive. It is explicitly not a licence
to label something "just a flaky test" - the label the drain-zombie carried right up until it turned
out to be a real product bug.

The rule's other five statements - `docs/quarantined-tests.md` (its owner, and the fullest
statement), `docs/testing.md`, `AGENTS.md`'s table cell, and `bin/check-quarantine-registry.sh`'s
drift message - landed with #323, which merged first. What remains here is the annotation
that asserts the rule and the contract test that holds it to it, so the javadoc and the registry it
cites no longer contradict each other on master.

It lands against two live registry entries - `PCMetricsTest.metricsRegisterBinding` and
`ProducerManagerTest.producedRecordsCantBeInTransactionWithoutItsOffsetDirect` - both of which
already carry a diagnosis and so satisfy the stricter half of the rule either way.

**The bar is human-reviewed, deliberately, and nothing mechanical enforces it**: the annotation
declares required fields plus an audit summary, and `flaky - failed once` satisfies a non-blank
check. Encoding the ledger/mechanism distinction over free text is a policy decision rather than a
review fix, and is left open.

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

`docs/inflight/AGENTS.md` said "work your current PR resolves is tracked by that PR - delete its
file in that PR", and the root router said "a file is deleted when its work lands". Read together
those are a blanket instruction to destroy the note at merge time, and that is how they were read:
this PR's own note carried a finding with no durable home anywhere else, scheduled for deletion by
the rule. The intent was only ever to keep the notes in touch with the code's reality.

So the rule now names four outcomes and puts deletion last:

- migrate what outlives the work to its durable owner FIRST (`docs/refactoring.md`,
  `docs/solutions/`, `CONCEPTS.md`, the topic doc);
- keep the note when live content remains, shrunk and renamed if its area changed;
- split when what remains is a different item - a new note, and `git rm` the old;
- `git rm` only when nothing left in it is both true and unowned elsewhere.

The router's `docs/inflight/` row additionally listed `parked-` and `next-` as filename prefixes.
Both were removed precisely because a filename must not carry state - all 23 `next-` files were
open, so the prefix ranked nothing while implying a ranking. The row now points at the owner instead
of keeping a copy that had already drifted away from it.

APPLIED TO THIS PR'S OWN NOTES rather than only written down, since a rule that is merely stated is
the rule that gets missed. #322 is the third and last of the split, so both `pr-322-*` notes
are the new rule's first customers - and left on master they would present finished PR coordination
as open work in every session index.

MIGRATED, THEN DELETED:

  * the proposed `bin/check-conflict-markers.sh` gate, and the merge that shipped 305 lines of an
    unresolved conflict with nothing red, became `ci-conflict-marker-gate.md` - the incident is the
    part that would have been lost, which is why it is a note and not a `refactoring.md` line. Its
    incident sentence is dated and says the branch is gone and the PR landed, so the citation records
    history rather than a live arrangement that ends at merge;
  * the five stranded agent-hook commit bodies were already owned by
    `branch-agent-hook-commit-bodies-only-on-backup.md`, so only the second copy went;
  * "re-fetch master before measuring anything" is already owned by `docs/merge-checklist.md`;
  * the `awaitLatch` re-arm worst case moved into `PausableInsertShardManager`'s own javadoc, beside
    the constant it is about.

PROMOTED OUT OF `docs/refactoring.md`. The `availableWorkContainerCnt` undercount carried evidence,
an impact assessment and a deferral, which is a note's job - that file is a line or two, no owner, no
state. It is now `bug-processing-shard-available-work-undercount.md`, and asks the prior question
before the obvious fix: whether a counter nothing reads for correctness should exist at all.

Raised by @codex on #322.

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

`bin/check-branch-self-reference.sh` (#341-era hygiene work, `da91f3f61`) arrived on this
branch with the master merge. It fails when a `docs/inflight/` note mentions THIS branch or THIS PR
without a human attesting the sentence still reads correctly AFTER the merge, and it reads whole
files for the `#NNN` and branch-name arms, because your own PR number can only ever be about you.
Run the way `repo-hygiene.yml` runs it - `PR_NUMBER=322 GITHUB_HEAD_REF=fix/909-load-reproduction` -
it reported 17 unconfirmed self-references across eight notes. Six of those notes are master's, not
this branch's; they mention #322, which is what makes them this merge's problem and nobody
else's.

TWO SENTENCES WERE ACTUALLY WRONG POST-MERGE, and both are rewritten rather than attested:

- `pr-blockers-and-collisions.md` recorded the merge order AND a tally of which of the seven had
  merged. The tally goes stale at every merge in its own list - #322's included - so it is
  deleted rather than restated, and the reader is sent to `gh pr list -R astubbs/parallel-consumer`.
  The ORDER stays: it is the standing coordination fact, and it survives only here because
  #323's merge deleted the note that used to hold it.
- `ci-agent-self-review-as-blocking-pr-comments.md` said the fix and its evidence "are in two PRs
  (#322)" - one number for a claim about two - and twice said the hook
  "lands with #324", which merged on 2026-08-20. Both are named in full and put in the tense
  they will be read in.

THE REST ARE ATTESTATIONS, and each says why it holds: they cite #322 for what was OBSERVED
or DECIDED on it - a sighting, a failed replay, a reproduction, a review finding - which is a claim
about the past that a merge cannot falsify. `bug-pcmetrics-...md` cites the branch by name for a CI
run; the run id resolves after the branch is deleted, which is what makes that line safe where the
branch name alone would not be.

Marker placement is not free-form: the gate accepts a marker on the flagged line, on the line above,
or inside a `checked-begin`/`checked-end` block. Inside an ordered list or mid-paragraph both of the
first two split the markdown, so those lines carry the marker inline at end-of-line and whole
paragraphs take the block form - the shape `test-back-pressure-engage-point-is-unasserted.md`
already uses.

No note's meaning was weakened to pass the gate, and nothing was marked that this merge does not own.

WHY A FULL LOCAL SWEEP MISSED THEM, recorded in the gate's own header where a reader hits the trap.
The gate resolves "this PR" with `gh pr list --head <branch>`, so in a worktree whose local branch is
not the PR's head ref - a `merge/NNN-...` branch pushing to `fix/...`, which is how master merges are
staged in this repo - the lookup returns nothing, the PR arm never arms, and every `#NNN` mention
passes locally. CI sets `GITHUB_HEAD_REF`, arms it, and fails; that happened on this PR, with a
migrated note clean under a full local `bin/check-all.sh` sweep and red in Repo Hygiene. Nothing can
detect it from inside the run - an empty PR lookup is indistinguishable from "no PR yet", which is a
legitimate local state the gate deliberately supports - so the header now names the workaround,
`PR_NUMBER=<n> bin/check-branch-self-reference.sh`.

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

Whether the property propagates into FAILSAFE forks as well as surefire ones was an open claim.
Structurally it should - both plugins run off the same fork machinery and neither declares
`systemPropertyVariables` - but that is an argument, and this repo does not retire a claim on one.

Observed instead, riding on a run that had to happen anyway: verifying
`RegistrationRaceStaleResidentIT` against a real broker with `-Dpc.log.level=info` emitted
`bz.stub.parallelconsumer` INFO lines that the warn default swallows.

`bin/check-test-log-config.sh`'s own header owns the how-to for this property, so the observation and
the integration-test invocation it licenses go there, next to the surefire one.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@astubbs
astubbs force-pushed the fix/909-load-reproduction branch from ecc9d35 to 3dec5cd Compare August 26, 2026 13:05
astubbs added a commit that referenced this pull request Aug 26, 2026
The guard this PR adds binds a module's memoised collaborators to one owner. It cannot cover
`setParallelEoSStreamProcessor`, because that setter runs earlier in the same constructor: a second
processor overwrites the module's `pc` reference and is only then refused, so the rejection path
leaves the module pointing at a half-built newcomer. On that one path the failure is worse after the
guard than before it, which is exactly the kind of thing that must not be left only in a PR comment.

Pre-existing and a main-code behaviour change on a constructor path, so it is out of scope for a PR
whose subject is a broker-level race reproduction - but an unrecorded defect is one the next session
rediscovers, or ships on top of, which is what this directory exists to prevent.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Aug 26, 2026
…ch stops existing

The note described the guard in the present tense of its own PR - "the guard #322 adds",
"why it was not fixed in #322" - which is false the moment the PR merges and the branch is
gone. `bin/check-branch-self-reference.sh` caught both lines, and it was right: a note that is
accurate only while its PR is open is a note that becomes wrong at the exact moment nobody is
looking at it.

Rewritten as it will read afterwards, and attested, so the gate can tell a checked line from an
unchecked one.

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

astubbs commented Aug 26, 2026

Copy link
Copy Markdown
Owner Author

@codex review

Re-requesting: since your last pass this branch was re-cut (13 commits into 8) and gained main code
you have not seen. The re-cut is content-identical — git diff against the pre-recut tip was empty —
so the interesting part is the new work on top.

Please focus on:

  1. PCModule collaborator ownership. Both memoised getters that take an owner (shardManager,
    brokerPoller) now reject a second owner with IllegalStateException instead of silently handing
    back the first's instance. Is the guard actually total? The known gap is
    setParallelEoSStreamProcessor, which writes the module's pc reference before the guard runs —
    recorded in docs/inflight/bug-module-pc-reference-overwritten-before-the-owner-guard-fires.md
    rather than fixed here. Are there others?

  2. The final getters plus protected createShardManager(WorkManager) seam. This exists because
    RegistrationRaceStaleResidentIT was overriding the getter, and so overriding the memoisation and
    the guard away with it — the branch was reinstating the defect it adds a guard for. Does the seam
    actually make that unrepresentable, or only inconvenient?

  3. Bisect safety. The DI seam and the ownership guard are deliberately separate commits, which
    needed a synthesised intermediate PCModule.java. It was compile-checked in a throwaway worktree,
    but a second opinion on whether the intermediate is coherent would be welcome.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

astubbs added a commit that referenced this pull request Aug 26, 2026
…rom ones I invented

`inflight-impact: corruption` and `inflight-labels: lifecycle` are both outside their closed sets,
so `check-inflight-tags.sh` failed the hygiene lane. Neither was a near miss worth widening a set for:

- **impact is now `misdirection`.** The cost of not knowing is that the module answers later lookups
  with the wrong processor - the first one's collaborators end up addressing the second. That is
  what the axis means by misdirection, and it is more precise than "corruption", which described the
  mechanism rather than what it costs a reader.
- **the label is dropped rather than replaced.** `concurrency` is the only value the set holds, and
  this is constructor ordering, not a race - a second processor on one module is misuse, not
  interleaving. Labels are optional, and a wrong one is worse than none: the set is the index, so a
  mislabelled note is found by the wrong search. Widening the set means editing
  `bin/lib/inflight-tags.sh` and `docs/inflight/AGENTS.md` together, which is a policy change and not
  something to slip into a PR about a race reproduction.

`bin/check-all.sh` with the PR arm armed is now 15/15.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The owner guard this PR adds binds a module's memoised collaborators to one owner. It cannot cover
`setParallelEoSStreamProcessor`, because that setter runs earlier in the same constructor:
`AbstractParallelEoSStreamProcessor`'s constructor calls `module.setParallelEoSStreamProcessor(this)`
before it resolves `module.brokerPoller(this)`, so a second processor built against one module
overwrites the module's `pc` reference **first, and is only then rejected**. The exception leaves the
module pointing at a half-built newcomer that nobody owns - on that one path the failure is worse
after the guard than before it, which is exactly the kind of thing that must not be left only in a PR
comment.

Recorded rather than fixed: it is pre-existing, and closing it is a main-code behaviour change on a
constructor path, outside a change whose subject is a broker-level race reproduction. An unrecorded
defect is one the next session rediscovers, or ships on top of, which is what this directory exists
to prevent.

The note is written as it will read once this branch is gone, not in the present tense of its own PR
- a note that is accurate only while its PR is open becomes wrong at the moment nobody is looking at
it - and the post-merge lines are attested so the gate can tell a checked line from an unchecked one.

Tagged `inflight-impact: misdirection`: the cost of not knowing is that the module answers later
lookups with the wrong processor, so the first processor's collaborators end up addressing the
second. That is more precise than describing the mechanism as corruption. **No label**, deliberately:
`concurrency` is the only value the closed set holds and this is constructor ordering, not a race -
a second processor on one module is misuse, not interleaving. Labels are optional and a wrong one is
worse than none, because the set is the index, so a mislabelled note is found by the wrong search.
Widening the set means editing `bin/lib/inflight-tags.sh` and `docs/inflight/AGENTS.md` together,
which is a policy change and not something to slip into a PR about a race reproduction.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@astubbs
astubbs force-pushed the fix/909-load-reproduction branch from 903f4b1 to db3f84c Compare August 26, 2026 14:12
@astubbs

astubbs commented Aug 26, 2026

Copy link
Copy Markdown
Owner Author

@codex review

Head moved again: 903f4b189 -> db3f84c8c. The file content is byte-identical — git diff 903f4b189 db3f84c8c is empty. Only the history changed: the three trailing docs(inflight) commits (80c258331, d72245fb7, 903f4b189), which added one note and then fixed its own wording and frontmatter, are folded into a single commit adding docs/inflight/bug-module-pc-reference-overwritten-before-the-owner-guard-fires.md in its final state.

The eight commits below it (274d4764e … 3dec5cd45) are untouched by this re-cut.

Note your last two invocations on this PR returned a usage-limit message rather than a review, so as far as this thread shows the branch has not had a Codex pass yet — a full review is welcome, not just a delta.

Local verification on the new head: bin/check-all.sh with PR_NUMBER/GITHUB_HEAD_REF set is 15/15, and the unit reactor is green across all 11 modules.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

astubbs added a commit that referenced this pull request Aug 26, 2026
…the merge that just happened

The note's START HERE still told a reader not to merge master, and said the branch
was ~29 behind deliberately. Both were true when written and are now the opposite
of the state, which is exactly the rot the note exists to prevent.

**The overridden decision is recorded where it was overridden**, rather than
quietly dropped. `81e08e100` decided on 2026-08-19 to merge master once at the
end; this merge was asked for directly, ahead of #57, #322 and
#267 landing. That decision's reasoning was that an early merge resolves
the same conflicts repeatedly and differently from how the still-open PRs will -
so the cost is real and falls on whoever merges next. The merge commit states each
resolution and why, so a later merge can follow them rather than re-derive them.

**`PCMetrics.java` is called out because the obvious reading of the instruction is
wrong right now.** `835b593cf` says to take MASTER'S side - but conditionally,
after #57 lands, and it has not. Master's `removeMeter` carries no guard at
all today, so taking it now would delete this branch's teardown fix and reintroduce
the throwing-registry defect that kills the poll thread. The file did not conflict,
so the branch's version survived untouched, which is the correct state. The note
now says so, and says to re-run the instruction when #57 lands.

**It also records what was NOT done.** The tree compiles and every gate passes, but
the deadlock probe, `ShardManagerStaleContainerTest`,
`OutForProcessingCounterDriftProbeTest` and `InstanceStallProbeIT` have not been
run against the merged tree. This branch's entire record is about not reading a
green compile as evidence about behaviour, so leaving that unstated would have been
the one omission it could least afford.

The blocked status is unchanged and re-verified: all three dependencies are still
open.
@astubbs
astubbs merged commit cf2741c into master Aug 26, 2026
29 checks passed
astubbs added a commit that referenced this pull request Aug 26, 2026
…rather than sharing them

A `PCModule` holds ONE parallel consumer's collaborator graph. Two of its getters memoise a
collaborator while taking that collaborator's owner as a method parameter, so on the cache-hit path
the argument is there to be ignored - and ignoring it hands a second owner an object still wired to
the first. Neither failure surfaces where it is caused, and both are now rejected with an
`IllegalStateException` that names the fix.

`shardManager(WorkManager)`, introduced by the preceding commit, is the first. A second
`WorkManager` built against one module would have been handed the first's `ShardManager`: its
`PartitionStateManager` and its shard manager would then operate on different owners, and nothing
would go red. Before that seam existed each `WorkManager` constructed its own, so the hazard is new
with the seam. It is reachable through the public `WorkManager` constructor and
`PCModule.setWorkManager`.

`brokerPoller(AbstractParallelEoSStreamProcessor)` is the second, found by sweeping `PCModule` for
the same shape once the class of defect was named rather than the symptom. A second processor would
have received a `BrokerPollSystem` polling a broker on behalf of the first - registering the first's
metrics gauges, delivering the newcomer nothing. Its only caller today is
`AbstractParallelEoSStreamProcessor`'s constructor, once per module, so the collision is unreachable
- but that is a property of the callers, not of the method, and "reachable only because callers
behave" is the argument this commit rejects.

BOTH GETTERS ARE NOW FINAL, and substitution goes through `createShardManager(WorkManager)`. This is
not tidiness. The one place in the tree that substitutes a `ShardManager` - the confluentinc#909
reproduction two commits along - does it by subclassing the module, and written against the
memoising getter it overrode the memoisation and the guard away with it, reinstating the exact
defect in the same branch that guards against it. That is what the sweep found. Splitting the
factory out puts the memoisation and the guard where an override cannot reach them, so the compiler
now refuses the mistake instead of a reviewer having to catch it.

Rejected alternatives: rebuilding the cache for the newcomer, which breaks the module's
one-instance-per-collaborator contract and leaves the first owner silently orphaned; and leaving it
with a javadoc note, which is what the seam commit originally parked in `docs/refactoring.md` - a
"safe only while nothing does X" caveat wants a check that fails, not a paragraph.

`PCModuleCollaboratorOwnershipTest` covers both sides of each guard plus the factory seam. It is
named for the defect CLASS, not for one instance, so the next memoised-with-owner collaborator gets
a test rather than its own file. Mutation-checked: deleting either guard turns exactly its own test
red and leaves the rest green.

Swept and dismissed, tree-wide, for "a memoised collaborator that ignores its owner argument":
`producerWrap()`, `producerManager()`, `consumerManager()`, `workManager()`, `pc()`,
`dynamicExtraLoadFactor()` and `pcMetrics()` are memoised but take no owner argument; every
`computeIfAbsent`/`putIfAbsent` factory in the tree is key-scoped and captures no owner-like
parameter; `SupplierUtils.memoize`'s only production use is instance-scoped inside the owner's own
constructor; there are no `@Getter(lazy=true)` fields and no DI holder other than `PCModule`.

Still open, deliberately out of scope: `PCModule.setParallelEoSStreamProcessor` is the mirror image
- a second processor's constructor overwrites the module's `pc` reference BEFORE the `brokerPoller`
guard fires, so the rejection path leaves the module pointing at the half-built newcomer. That is
pre-existing behaviour and a separate change.

Raised by @codex on #322.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Aug 26, 2026
…n, and the third precondition it uncovered

#31 shipped the fix with unit-level proof and an openly declared gap: no load-level evidence.
This closes it with something stronger than a soak - a broker-real reproduction that discriminates
every run, with no seed and no sleeps.

Building it uncovered why nothing had reproduced the defect before. The loss needs THREE
coincidences, not the two previously recorded: a rebalance inside the registration insert loop, the
partition returning so the uncommitted tail re-delivers, and - the missing one - NO take-scan of the
shard in between. `ProcessingShard.getWorkIfAvailable` lazily evicts stale containers as it scans, so
an ordinary take-scan HEALS the collision before a fresh arrival can hit it. Only a consumer whose
pipeline is at target keeps residents alive long enough to eat a fresh record.

That explains the standing puzzle: the Chaos Pain Suite is green on defective master not through an
unlucky seed but because its own churn is the healing mechanism. Random reproduction was fighting
itself. It also narrows the production risk - this bites BUSY consumers, not idle ones.

The test drives all three deliberately: a gated user function saturates the pool so the control
loop's delta stays at or below zero, a fixed message-buffer size pins the load factor so the target
cannot step mid-experiment, a second group member on another topic forces an eager revoke/re-assign,
and the insert is parked mid-loop until re-delivery has fully registered. Every await is event-gated
- latches, listener callbacks, instrument counters - so a failure is loud rather than slow.

**Proven both ways, and re-proven after every change to it.** With `addWorkContainer`'s
stale-replacement branch disabled - the pre-fix drop-on-collision behaviour, a local-only edit since
reverted - the IT fails after the 90s invariant await on the confluentinc#909-signature assertion,
"a fresh arrival colliding with a stale shard resident was dropped", and NOT on any run-invalid
guard. Green arm passes in ~14.5s. Run before and after the review passes, per docs/testing.md's
rule that a modified test must be re-proven to discriminate.

**A healed run fails as invalid rather than passing.** The quiescence gate runs only BEFORE the
paused loop is released, so a rebalance landing after it (coordinator move, session-timeout blip)
would sweep the residents and heal the staged collision. Four run-invalid guards close that:
rebalance state captured at release and asserted unchanged; a worker leaving the processing gate
early - timeout or interrupt - sets a flag asserted false at the end, because a de-saturated
pipeline re-opens the take-scan; and `getNumberRecordsOutForProcessing() == MESSAGE_BUFFER_SIZE`
asserted both in the saturation await and again at gate-open, since that count is the actual term in
the `delta = target - outForProcessing` arithmetic the suppression rests on. A future shift in the
load factor now fails loudly instead of leaving the test green with the defect branch unexercised.

`PausableInsertShardManager` parks the CONTROL thread at the head of exactly one designated insert,
after that batch has passed the `epochIsStale` guard. Three things about it are load-bearing and
were each got wrong once: the park must dwell THROUGH interrupts, because PC wakes its control
thread by interrupting it, so it delegates to the shared `LatchTestUtils.awaitLatch` rather than a
hand-rolled loop; `PARK_DEADLINE_SECONDS` is 150 rather than 60 because the park must outlast
parking-topic creation plus a rebalance-settle await whose quiet condition resets on every rebalance
event, and expiring inside those budgets would kill a valid run as a misleading "wiring failure" in
a repo where a flake fails the build; and `freshEpochInsertCount` increments AFTER the insert, not
before, so the counter means "registered" - which is what the test's gate-open condition, polled
from the awaitility thread, already claimed.

THE WORKER GATE IS ANCHORED TO THE CLASS BUDGET, not derived from an event that has not happened
yet. The deadline was `PARK_DEADLINE_SECONDS + 60` = 210s, but a worker enters the gate in step 1
and the park does not start until step 2; everything staged between gate entry and gate open can
spend 30 + 30 + 60 + 30 = 150s of awaits plus the final 90s invariant await, so on a slow broker a
run still inside the 300s class budget could expire the gate, de-saturate the pipeline and fail as
"run invalid" - a flake, and this build has no retry. It is now deliberately longer than the class
budget, so `@Timeout` is the binding deadline and a too-slow run says so instead of blaming
de-saturation.

THE PRODUCE HELPER IS SHARED. `produceKeyedRange` was a private second implementation of
produce-and-track, which docs/testing.md forbids: producer setup, ack waiting and error handling
would have had to be fixed in two places. The deferral once recorded for this rested on needing a
broker run over every existing caller - but the fix is an ADDITIVE overload, so no existing caller
moves and that argument does not hold. `KafkaClientUtils.produceOffsetKeyedRange` now owns it, and
asserts the key<->offset correspondence its javadoc claims rather than assuming it: a topic that
cannot honour the contract fails at the produce instead of as a confusing missing-record assertion
later.

TEARDOWN ASSERTS THE SECOND MEMBER STOPPED. Its running flag is only read between polls, so a poll
or close already in flight could outlast the 10s join, leaving a live non-daemon thread and a live
group member to rebalance into whichever broker test ran next. Teardown now uses `wakeup()`, the one
cross-thread-safe `KafkaConsumer` call, waits long enough to cover a slow close, and ASSERTS the
thread stopped - the failure belongs here, not in the next test.

Untagged, so it runs in the ordinary failsafe lane: it is deterministic, not chaos.

**What it still cannot do**: it rules out both KNOWN heal paths but never OBSERVES the collision, so
an unknown heal path that evicts residents without de-saturating would turn it silently green. That
is deferred with its evidence and its design in
`docs/inflight/test-909-reproduction-cannot-observe-the-collision.md` - including the finding that
the fix needs no production change - because confirming the count needs a broker. The note states
the acceptance shape rather than a hardcoded collision count, so retuning either constant cannot
leave an obsolete literal reading as the agreed value.

Raised by @codex on #322.

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

`docs/inflight/AGENTS.md` said "work your current PR resolves is tracked by that PR - delete its
file in that PR", and the root router said "a file is deleted when its work lands". Read together
those are a blanket instruction to destroy the note at merge time, and that is how they were read:
this PR's own note carried a finding with no durable home anywhere else, scheduled for deletion by
the rule. The intent was only ever to keep the notes in touch with the code's reality.

So the rule now names four outcomes and puts deletion last:

- migrate what outlives the work to its durable owner FIRST (`docs/refactoring.md`,
  `docs/solutions/`, `CONCEPTS.md`, the topic doc);
- keep the note when live content remains, shrunk and renamed if its area changed;
- split when what remains is a different item - a new note, and `git rm` the old;
- `git rm` only when nothing left in it is both true and unowned elsewhere.

The router's `docs/inflight/` row additionally listed `parked-` and `next-` as filename prefixes.
Both were removed precisely because a filename must not carry state - all 23 `next-` files were
open, so the prefix ranked nothing while implying a ranking. The row now points at the owner instead
of keeping a copy that had already drifted away from it.

APPLIED TO THIS PR'S OWN NOTES rather than only written down, since a rule that is merely stated is
the rule that gets missed. #322 is the third and last of the split, so both `pr-322-*` notes
are the new rule's first customers - and left on master they would present finished PR coordination
as open work in every session index.

MIGRATED, THEN DELETED:

  * the proposed `bin/check-conflict-markers.sh` gate, and the merge that shipped 305 lines of an
    unresolved conflict with nothing red, became `ci-conflict-marker-gate.md` - the incident is the
    part that would have been lost, which is why it is a note and not a `refactoring.md` line. Its
    incident sentence is dated and says the branch is gone and the PR landed, so the citation records
    history rather than a live arrangement that ends at merge;
  * the five stranded agent-hook commit bodies were already owned by
    `branch-agent-hook-commit-bodies-only-on-backup.md`, so only the second copy went;
  * "re-fetch master before measuring anything" is already owned by `docs/merge-checklist.md`;
  * the `awaitLatch` re-arm worst case moved into `PausableInsertShardManager`'s own javadoc, beside
    the constant it is about.

PROMOTED OUT OF `docs/refactoring.md`. The `availableWorkContainerCnt` undercount carried evidence,
an impact assessment and a deferral, which is a note's job - that file is a line or two, no owner, no
state. It is now `bug-processing-shard-available-work-undercount.md`, and asks the prior question
before the obvious fix: whether a counter nothing reads for correctness should exist at all.

Raised by @codex on #322.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Aug 26, 2026
… number now demands

`bin/check-branch-self-reference.sh` (#341-era hygiene work, `da91f3f61`) arrived on this
branch with the master merge. It fails when a `docs/inflight/` note mentions THIS branch or THIS PR
without a human attesting the sentence still reads correctly AFTER the merge, and it reads whole
files for the `#NNN` and branch-name arms, because your own PR number can only ever be about you.
Run the way `repo-hygiene.yml` runs it - `PR_NUMBER=322 GITHUB_HEAD_REF=fix/909-load-reproduction` -
it reported 17 unconfirmed self-references across eight notes. Six of those notes are master's, not
this branch's; they mention #322, which is what makes them this merge's problem and nobody
else's.

TWO SENTENCES WERE ACTUALLY WRONG POST-MERGE, and both are rewritten rather than attested:

- `pr-blockers-and-collisions.md` recorded the merge order AND a tally of which of the seven had
  merged. The tally goes stale at every merge in its own list - #322's included - so it is
  deleted rather than restated, and the reader is sent to `gh pr list -R astubbs/parallel-consumer`.
  The ORDER stays: it is the standing coordination fact, and it survives only here because
  #323's merge deleted the note that used to hold it.
- `ci-agent-self-review-as-blocking-pr-comments.md` said the fix and its evidence "are in two PRs
  (#322)" - one number for a claim about two - and twice said the hook
  "lands with #324", which merged on 2026-08-20. Both are named in full and put in the tense
  they will be read in.

THE REST ARE ATTESTATIONS, and each says why it holds: they cite #322 for what was OBSERVED
or DECIDED on it - a sighting, a failed replay, a reproduction, a review finding - which is a claim
about the past that a merge cannot falsify. `bug-pcmetrics-...md` cites the branch by name for a CI
run; the run id resolves after the branch is deleted, which is what makes that line safe where the
branch name alone would not be.

Marker placement is not free-form: the gate accepts a marker on the flagged line, on the line above,
or inside a `checked-begin`/`checked-end` block. Inside an ordered list or mid-paragraph both of the
first two split the markdown, so those lines carry the marker inline at end-of-line and whole
paragraphs take the block form - the shape `test-back-pressure-engage-point-is-unasserted.md`
already uses.

No note's meaning was weakened to pass the gate, and nothing was marked that this merge does not own.

WHY A FULL LOCAL SWEEP MISSED THEM, recorded in the gate's own header where a reader hits the trap.
The gate resolves "this PR" with `gh pr list --head <branch>`, so in a worktree whose local branch is
not the PR's head ref - a `merge/NNN-...` branch pushing to `fix/...`, which is how master merges are
staged in this repo - the lookup returns nothing, the PR arm never arms, and every `#NNN` mention
passes locally. CI sets `GITHUB_HEAD_REF`, arms it, and fails; that happened on this PR, with a
migrated note clean under a full local `bin/check-all.sh` sweep and red in Repo Hygiene. Nothing can
detect it from inside the run - an empty PR lookup is indistinguishable from "no PR yet", which is a
legitimate local state the gate deliberately supports - so the header now names the workaround,
`PR_NUMBER=<n> bin/check-branch-self-reference.sh`.

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