Skip to content

test(probe): ambient flight recorder - every broker IT failure arrives pre-diagnosed - #86

Merged
astubbs merged 62 commits into
masterfrom
feats/chaos-ambient-probe
Jul 31, 2026
Merged

astubbs merged 62 commits into
masterfrom
feats/chaos-ambient-probe

Conversation

@astubbs

@astubbs astubbs commented Jul 30, 2026 •

Copy link
Copy Markdown
Owner

Was stacked on #83 (Chaos Pain Suite, now merged); base is master.

Ambient probe: a flight recorder for every broker integration test. AmbientProbeExtension (JUnit 5, registered on BrokerIntegrationTest - all ~104 broker ITs inherit it, zero per-test changes) runs the chaos suite's ProgressProbe in a new observer mode under every test: group rebalance-dwell + per-partition committed-offset lag stagnation, sampled purely from admin-client reads.

On test failure it logs an autopsy block - violations, peaks, and a frozen-partitions table (committed / end / lag / stagnation per partition) - so a generic Awaitility timeout arrives pre-diagnosed: "zombie member blocked rebalance 15s" vs "partition 21 committed frozen lag=1132" vs "probe clean - fault is likely in the test itself". Exactly the material that historically took a manual debugging session per flake (see the PartitionStateCommittedOffsetIT saga in docs/solutions/test-flakiness/).

Observer mode never fails a test. The chaos suite remains the only place probe violations gate (its thresholds are chaos-calibrated). On green tests the probe is silent (DEBUG one-liner). Escape hatches: -Dambient.probe=off (global), @NoAmbientProbe (class/method).

DRY / behavior preservation

The extension contains zero sampler logic. ProgressProbe gained an observer-mode construction path sharing the existing samplers: group id via Supplier (tracks mid-test GroupOption.NEW_GROUP switches), multi-topic sampling when unfiltered, watermark maps re-keyed Integer → TopicPartition (removes a latent cross-topic partition-number collision, per the re-key-don't-parallel-cache rule). The chaos construction path is unchanged in signature, thread name, log prefixes, bounds, and cadence - #85's W4 per-scenario toggles (disableRebalanceDwellViolation() / withNoProgressWindow()) carried over intact through the master merge and are orthogonal to observer mode (verified by the automatic review of the final head).

Review hardening (post-review rounds)

An 8-reviewer pass plus automatic-review rounds produced fixes, landed in ffbe9bc5 and 76ec2ec5 (finding-by-finding tables: review response, bot-review dispositions):

  • Teardown race fixed: the sampler now stops in AfterTestExecutionCallback (before @AfterEach closes the admin client), with afterEach as an idempotent safety net for the @BeforeEach-throws path (semantics verified against the pinned junit-jupiter-engine bytecode).
  • Lifecycle-safe admin access: KafkaClientUtils.close() nulls the volatile admin field in a finally; samplers use the new adminIfOpen() Optional accessor - the open()..close() window is named at the call site, no magic nulls.
  • Silent-on-green hardened: violate() logs DEBUG in observer mode (violations still recorded for the autopsy); chaos-mode ERROR unchanged.
  • Explicit Mode enum (CHAOS / AMBIENT_OBSERVER) replaces null-sentinel mode encoding; chaos constructor gains requireNonNull guards; volatile groupId for cross-thread supplier reads.
  • 14 unit tests (AmbientProbeExtensionTest, runs under plain mvn test, no broker): isDisabled() opt-out matrix, all autopsy formatting branches, beforeEach fallbacks, stop() idempotence, observer/chaos log-level contract.
  • Docs: AGENTS.md Testing section points debuggers at the autopsy block first; docs/inflight.md shrunk per its scope rule (retired the merged feat(chaos): Chaos Pain Suite - calibrated, portable bug-detector pack (finds the drain-zombie on master blind) #83/feat(chaos): hunt silent commit stalls by revoking partitions mid-work (Phase 2, W4) #85 entries; the ambient-probe roster bullet now points here).

Verification (all executed)

  • Autopsy on real failure: W1 chaos run - chaos probe behavior bit-identical (RED via ZOMBIE_MEMBER, dwell peak 15.665s, own peaks line unchanged) AND the extension produced its first real autopsy, naming the zombie plus a frozen-partitions table.
  • Silence on success: green IT run - zero ambient output.
  • Unit suite (post master merge, includes feat(chaos): hunt silent commit stalls by revoking partitions mid-work (Phase 2, W4) #85's ChaosRevokeUnderWorkIT compiling against the merged ProgressProbe): 311 run / 0 failures attributable to this PR; AmbientProbeExtensionTest 14/14 (re-run 4x, no flakes). Each full-suite run surfaced one pre-existing parallel-execution flake in an unrelated main-suite test (different test each run; all pass solo).
  • Automatic review of the final head (40d3d9f): no new issues; conflict resolution audited clean.

Implemented by a subagent in an isolated worktree; reviewed, verified, and committed by the orchestrating session.

Checklist

  • Changelog entry added (CHANGELOG.adoc, under == Unreleased)
  • Docs updated - AGENTS.md Testing section (autopsy pointer + escape hatches), inflight.md shrink
  • Tests added/updated - AmbientProbeExtensionTest (14 unit tests)
  • Title & body reflect the final content of this PR
  • N/A - Self-hosted runner / security implications: no CI runner or workflow changes in this PR (test-infra Java + docs only)

🤖 Generated with Claude Code

https://claude.ai/code/session_01VbtaCN1Re14pJ99VFW4R18

astubbs and others added 25 commits July 29, 2026 16:55
…same-repo only)

Optional, non-gating fast feedback that runs unit, integration and performance as parallel
matrix jobs on a self-hosted many-core runner (label `highcpu`), guarded to same-repo PRs so
fork code never executes on it. The GitHub-hosted gate in maven.yml stays the required check.

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

# Conflicts:
#	.github/actionlint.yaml
…-only

The high-CPU self-hosted matrix now runs unit + integration + performance + mutation as parallel
jobs (a strict superset of the mac runner, which is offline indefinitely). The mac workflow is
switched to workflow_dispatch-only so it stops queuing dead jobs on every PR.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012ytagqk6daL4uTtbebQNNv
failingHttpCall drove an HTTP call at a dotless bogus hostname ("xxxxxxxxx") and asserted the failure
was a DNS *resolution* error ("failed resolve"). That only holds where the name fails to resolve - on any
network with a local resolver + search domain (e.g. a Pi-hole LAN) the name resolves and the failure mode
becomes "connection refused", so the test fails there while passing on GitHub's public DNS.

Point the bad request at a closed local port (127.0.0.1:1) instead: an immediate, deterministic
"connection refused" on every environment, no DNS lookup at all (and faster than one). Keep the real
failed==true check; assert the deterministic "connection refused" message. Found bringing up the
self-hosted high-CPU runner.

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

The failingHttpCall fix (127.0.0.1:1 -> connection refused) also flipped this sibling test through the shared getBadRequest() helper, so its assertion is updated to match. Caught by ce-review.

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

Claude-Session: https://claude.ai/code/session_012ytagqk6daL4uTtbebQNNv
Load was ~18/32 with 34GB free - the box is I/O-bound (cold cache), not CPU-bound - so use all the cores.

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

Claude-Session: https://claude.ai/code/session_012ytagqk6daL4uTtbebQNNv
…ateCommittedOffsetIT

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

Claude-Session: https://claude.ai/code/session_012ytagqk6daL4uTtbebQNNv
…epo guard (ce-review P2)

The if: guard lives in the PR-head file, so the real RCE backstop is the repo Actions setting "require approval for all outside collaborators". Documented in the workflow header + referenced SELF_HOSTED_RUNNER.md.

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

Claude-Session: https://claude.ai/code/session_012ytagqk6daL4uTtbebQNNv
Unit forkCount 1C->2C, Integration 8->16 (probe the oversubscription ceiling). Mutation PIT threads 2->16 (CPU-bound, stays in the matrix). Performance split into its own job that needs the matrix, so the throughput benchmark measures on a quiet box (solo 1m54 vs 7m18 when it shares the box).

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

Claude-Session: https://claude.ai/code/session_012ytagqk6daL4uTtbebQNNv
…formance

Doubling was flat (unit 2C=1C) to worse (integration 16 slower than 8), so back to the knee. Performance returns to the concurrent matrix - it is a correctness gate here; noisy timing is fine and isolation wrecked total wall-clock (it queued behind a 17-min mutation). Mutation keeps threads=16. Accurate benchmarking -> separate on-demand run.

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

Claude-Session: https://claude.ai/code/session_012ytagqk6daL4uTtbebQNNv
Unit/Integration now also enable JUnit method-parallelism (-Dparallel-tests=true) on top of forking, forks reduced so forks x threads ~= cores - tests whether thread-parallelism is still flaky after recent fixes (revert to fork-only if red). ci-mutation-test.sh: on a PR (GITHUB_BASE_REF) mutate ONLY changed core classes, skip if none - the full internal.* sweep has never completed. Full sweep still runs for push/nightly (no base ref).

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

Claude-Session: https://claude.ai/code/session_012ytagqk6daL4uTtbebQNNv
…eads finding

fork×threads (parallel-tests=true) was safe (threading no longer races - unit green; integration red was the known flaky PartitionStateCommittedOffsetIT) but no faster than fork-only, so back to 1C/8. PIT: grep no-match under set -euo pipefail made the changed-class skip exit non-zero (0m19 red); wrap grep with || true so it exits 0. Recorded the thread-parallelism-vs-forking finding in inflight next to the shelved Step-2 question.

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

Claude-Session: https://claude.ai/code/session_012ytagqk6daL4uTtbebQNNv
…bserve a green board

TEMPORARY - not a fix. Disables the known-flaky PartitionStateCommittedOffsetIT.committedOffsetRemoved (awaitility timeout, in inflight, fails on GitHub-hosted too) purely to see a fully-green highcpu run. Revert and harden the test properly.

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

Claude-Session: https://claude.ai/code/session_012ytagqk6daL4uTtbebQNNv
Now that ci-mutation-test.sh scopes PIT to changed classes on PRs (GITHUB_BASE_REF), it is fast enough for the 2-core hosted runner - so mutation runs on GitHub-hosted as well, not just the self-hosted box. Non-gating (continue-on-error). fetch-depth: 0 so the changed-class diff resolves.

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

Claude-Session: https://claude.ai/code/session_012ytagqk6daL4uTtbebQNNv
…already passed

Each GitHub-hosted test job, before running its slow 2-core suite, polls whether the self-hosted highcpu equivalent for the same commit already PASSED (ci-concede-check.sh). If so it skips and goes green; the hosted job stays the required gate but finishes faster when grumpy wins. Never depends on the self-hosted runner: offline/queued/slow/failed -> run the tests normally. Bounded wait, continue-on-error so a check bug can never fail the gate. Caveat documented: conceding trusts the self-hosted env (env-specific failures could be missed).

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

Claude-Session: https://claude.ai/code/session_012ytagqk6daL4uTtbebQNNv
… the green-board experiment)

Reverts the temporary experiment disable. The test is still the known flaky awaitility timeout (tracked in inflight) - harden it (adaptive await / underlying timing) rather than leave it disabled.

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

Claude-Session: https://claude.ai/code/session_012ytagqk6daL4uTtbebQNNv
The check name is "<workflow> / <job>", and both halves carried "High-CPU"
plus verbose filler ("Build & Test - ...", "self-hosted, optional"), pushing
past the PR merge-box truncation width.

- workflow name: "PR High-CPU Fast Feedback" -> "highcpu"
- job name: "Build & Test - <suite> (high-CPU self-hosted, optional)"
           -> "<suite> (optional)"  (keeps the non-gating signal)

Result: "highcpu / Unit (optional)", "highcpu / Integration (optional)", etc.
- longest ~35 chars, well under the cutoff.

Kept the concede matcher in sync (it resolves the highcpu run/jobs by name):
bin/ci-concede-check.sh WORKFLOW default -> "highcpu", JOB_PREFIX -> "${SUITE}"
(the job is now named "<suite> (optional)", so a suite-name prefix still
uniquely matches). Added a keep-in-sync comment on the job. Updated the
SELF_HOSTED_RUNNER.md reference.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012ytagqk6daL4uTtbebQNNv
… behind Mutation's slow cancel

A single workflow-level concurrency group meant every new push's jobs waited
for the ENTIRE previous run to complete before starting. cancel-in-progress
signalled the old run immediately, but its Mutation (PIT) maven/JVM tree
rides out the runner's full cancellation grace (~5 min) before force-kill -
observed on PR #80: push at 22:41:05, old Mutation force-killed 22:46:06,
all four new jobs started 22:46:09. Head-of-line blocking on the one job
nobody needs fast feedback from.

Job-level per-suite groups (highcpu-<suite>-<branch>) mean a new push
supersedes each suite independently: Unit/Integration/Performance
predecessors are finished or die fast, so they start within seconds; only
Mutation queues behind old Mutation, which is fine for a 30-minute advisory
job. No change to runner usage. actionlint clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VbtaCN1Re14pJ99VFW4R18
…ner' in comments

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

Implements Phase 1 of the Chaos Pain Suite design (branch
docs/chaos-pain-suite-design; plan under docs/plans/). Additive-only on the
uber experiment composition so it transplants onto the rebased-#29 slices
as a file copy - zero edits to #29-owned files.

- ChaosConductor: seeded, replayable action scheduler (STOP_DRAIN /
  STOP_NO_DRAIN / RESTART / JOIN_NEW) with EnumMap-deterministic weighted
  picks, a timestamped action timeline logged every run (the autopsy's
  first artifact), a join-after-stopDrain bias knob (the zombie-drain
  collision the calibration targets), and its own per-instance state
  machine over ManagedPCInstance - including raw closeDrainFirst() for
  DRAIN stops, which the managed API doesn't expose.
- ProgressProbe: independent SLO samplers - progress watermark (30s, with
  tail slack for legitimately-sleeping heavy records), rebalance-dwell
  zombie probe (60s: >> seconds-healthy, << 5-min zombie; keyed on
  protocol-unresponsiveness, NOT partition-holding, which is correct drain
  behaviour), drain-completion bound (150s, must exceed the heavy tail),
  plus the end-of-run correctness ledger (no loss ever; duplicates bounded
  per disturbance, capacity-shaped).
- ChaosChurnStormIT (W1): 12->16 fleet, 80 partitions, 100k messages with
  heavy-tailed work (1-in-4000 records sleeps 90s) - the heavy tail is what
  stretches drains into the probe's discrimination window, since the
  zombie-drain defect freezes the group for the DURATION of a drain.
- ChaosConductorPlanIT: seed-determinism regression (same seed = same plan).
- @tag(chaos) excluded from all default suites (pom default now
  performance,chaos; comment documents the multi-group override gotcha);
  chaos-pain.yml workflow_dispatch runs it on-demand on the highcpu runner
  (seed + reps inputs, artifacts uploaded, never gating).

Validated: 3 green storm runs (500k and 2x100k msgs - zero loss, duplicates
~500-2700 vs allowances), determinism 2/2, default-exclusion verified
(name-matched chaos test runs 0 tests without -Dincluded.groups=chaos).
Calibration against the planted zombie-drain defect arm is the next commit.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VbtaCN1Re14pJ99VFW4R18
…(portable bug-detector pack)

Completes the suite for standalone landing on master:

- ManagedPCInstance extracted from the confluentinc#857 investigation branch (PR #29,
  credited) - the multi-instance PC lifecycle harness; verified
  mainline-API-only. When #29 rebases, its harness slice simply drops its
  copy.
- Suite files at calibrated state: non-interruptible heavy tail (PC's close
  force-interrupts stragglers ~11s, so interruptible sleeps cannot stretch
  drains into a discriminable window), rebalance-dwell ZOMBIE bound 15s set
  from same-seed A/B measurement (healthy peak 6.7s vs defect 20.1s), peak
  signature logging, hotter conductor (0.5-1.5s ticks, join-after-drain
  bias 0.9).

Calibration record (see the design doc on docs/chaos-pain-suite-design and
plan on experiment/chaos-pain-suite-phase1): planted-defect arm 3/3 RED via
ZOMBIE_MEMBER/REBALANCE_BLOCKED (dwell 15.6-15.9s), all-fixes arm 3/3
GREEN (4.5-8.9s), and PLAIN MASTER: RED via the same probe (15.6s) - this
branch's own base carries the drain-zombie bug (fixed on PR #80), and the
suite finds it blind. That is the point: a portable detector, excluded from
every gating suite (@tag chaos), temporarily mergeable into any PR to
expose fix-absent bugs and verify fixes. Run on demand:
-Dincluded.groups=chaos [-Dchaos.seed=N], or the chaos-pain.yml
workflow_dispatch on the highcpu runner.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VbtaCN1Re14pJ99VFW4R18
…it; nothing is 'planted'/injected

'Planted' (mutation-testing jargon) wrongly implied synthetic fault
insertion. The defect arm is git archaeology: the genuine historical bug in
its original code, selected by basing on the pre-fix commit. The only
engineered element is the sensitizing workload (non-interruptible heavy
tail) that makes the real defect's freeze long enough to discriminate.

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

Detects protocol-INVISIBLE stalls: group STABLE, heartbeats + polls flowing,
no rebalance pending (so the broker's 5-min eviction clock never starts), yet
a partition's lag is real and its committed offset stops moving - the 'locks
forever until manual restart' class from the confluentinc#857 reports, which the Class 1
zombie probe cannot see.

Mechanism: every 5th sampler tick, admin listConsumerGroupOffsets vs
listOffsets(latest); violation CLASS2_STALL/LAG_STAGNATION when lag >= 50 and
the committed offset has been stagnant > 150s. Peak (maxLagStagnation) logged
every run.

Calibration so far (test-the-test discipline):
- First healthy run FIRED at 151s: a real measurement, not a probe bug - a
  hard stop interrupts a heavy record mid-dwell and at-least-once re-runs it
  fresh, legitimately blocking that partition ~2 chained dwells. Fix per the
  calibrate-the-workload lesson: heavy dwell 90s -> 45s (the zombie window
  only needs drains occupied; close bails at ~11s regardless), so a 2-dwell
  redelivery chain (~90s) fits under the 150s bound. Arithmetic recorded in
  both javadocs.
- Re-validated: healthy arm 2/2 GREEN (peak lag stagnation ~39s, ~4x margin);
  defect arm still RED on ZOMBIE_MEMBER with unchanged dwell signature
  (15.7s vs 15.6-15.9s at the old 90s dwell).
- RED calibration of this probe awaits the W4 revoke-under-work trigger
  scenario (next Phase 2 step).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VbtaCN1Re14pJ99VFW4R18
… the pom

The gating scripts hardcode -Dexcluded.groups (overriding the pom default),
so adding 'chaos' only to the pom let ChaosChurnStormIT leak into the
required Integration Tests check - where it promptly went RED on this
branch's master base (the detector detecting; but it must not gate).

Same class of bug the quarantine-lane PR #84's contract test now pins for
the 'quarantined' group.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VbtaCN1Re14pJ99VFW4R18
…s pre-diagnosed

AmbientProbeExtension (JUnit 5, registered on BrokerIntegrationTest so all
~104 broker ITs inherit it with zero per-test changes) runs ProgressProbe in
a new observer mode: group rebalance-dwell + per-partition committed-offset
lag stagnation, sampled from admin-client reads only. On test failure it
logs an AUTOPSY block - violations, peaks, and a frozen-partitions table
(committed/end/lag/stagnation) - so a generic Awaitility timeout becomes
'zombie member blocked rebalance 15s' or 'partition 21 committed frozen
lag=1132' or 'probe clean - fault is in the test'. Observer mode NEVER fails
a test; the chaos suite remains the only place probe violations gate.

ProgressProbe refactor is additive + DRY (extension contains zero sampler
logic): observer-mode construction path; group id via Supplier (tracks
GroupOption.NEW_GROUP switches); watermark maps re-keyed Integer ->
TopicPartition (removes a latent cross-topic partition-number collision);
multi-topic sampling when no topic filter is given. Chaos construction path
unchanged in signature, thread name, log prefixes, bounds, and cadence.

Escape hatches: -Dambient.probe=off (global), @NoAmbientProbe (class/method).

Verified: W1 chaos run on master base bit-identical (RED via
ZOMBIE_MEMBER, dwell peak 15.665s, own peaks line unchanged) AND produced
the extension's first real autopsy - naming the zombie plus a
frozen-partitions table; silence-on-success confirmed on a green IT (zero
ambient output); compile clean on Java 8 API surface.

Implemented by a subagent in an isolated worktree; reviewed, verified and
committed by the orchestrating session.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VbtaCN1Re14pJ99VFW4R18
@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 Jul 30, 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 33 33 ➖ 0
Duplicated lines 995 995 ➖ 0
Duplication 3.03% 3.03% ➖ 0
Rule Limit Status
Max duplication 5% ✅ Pass (3.03%)
Max increase vs base +0.1% ✅ Pass (+0.00%)

No new clones introduced by this PR.

✅ jscpd (language-agnostic)

PR Base Change
Clones 82 82 ➖ 0
Duplicated lines 1175 1175 ➖ 0
Duplication 3.62% 3.70% 🙂 -0.08%
Rule Limit Status
Max duplication 5% ✅ Pass (3.62%)
Max increase vs base +0.1% ✅ Pass (-0.08%)

No new clones introduced by this PR.

Powered by astubbs/duplicate-code-cross-check

@github-actions

github-actions Bot commented Jul 30, 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/test-integration/java/io/confluent/parallelconsumer/integrationTests/AmbientProbeExtension.java parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/AmbientProbeExtensionTest.java 31.2

🔺 Increased similarities

File A File B Base (%) PR (%) Change
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 48.5 48.8 +0.3
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithEarlyClose.java parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithSaslAuthenticationException.java 52.2 52.4 +0.2
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyUnitTestBase.java parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorUnitTestBase.java 32.9 33.1 +0.2
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 54.1 54.3 +0.2
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 60.0 60.2 +0.2
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 49.6 49.8 +0.2
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithEarlyClose.java 55.5 55.7 +0.2
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/truth/CommitHistorySubject.java parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/truth/LongPollingMockConsumerSubject.java 36.6 36.8 +0.2
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/BatchTestBase.java parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CoreBatchTest.java 30.1 30.3 +0.2
parallel-consumer-core/src/main/java/io/confluent/csid/utils/Java8StreamUtils.java parallel-consumer-core/src/main/java/io/confluent/csid/utils/JavaUtils.java 34.8 35.0 +0.1
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithCommitTimeoutException.java parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithSaslAuthenticationException.java 49.0 49.2 +0.1
parallel-consumer-core/src/main/java/io/confluent/csid/utils/Java8StreamUtils.java parallel-consumer-core/src/test/java/io/confluent/csid/utils/CollectionUtils.java 32.8 32.9 +0.1
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithCommitTimeoutException.java 56.5 56.6 +0.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 60.5 60.7 +0.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 34.4 34.5 +0.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 34.4 34.5 +0.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/PCModule.java parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/PCModuleTestEnv.java 32.6 32.8 +0.1
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 40.9 41.0 +0.1
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/ParallelEoSSStreamProcessorRebalancedTest.java parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessorTest.java 34.4 34.5 +0.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 51.3 51.4 +0.1

...and 32 more

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 54.28 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 41.05
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 37.51
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PCRetriableException.java 37.23
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 35.84
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 35.84
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 35.62
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 34.79
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 30.46
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 60.19 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 54.04 ⚠️
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 39.91
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 36.37
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 32.03
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 31.02
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 60.19 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 49.84
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 36.07
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 31.85
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 31.0
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PCRetriableException.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 37.23
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 33.25
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 54.28 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 53.94 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 45.34
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 35.45
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 34.41
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 31.65
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 31.65
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalRuntimeException.java 30.61
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 30.48
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerOptions.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 54.04 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 49.84
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 44.95
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 33.42
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 32.7
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 30.47
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 44.95
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 36.37
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 36.07
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 32.14
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContext.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 33.42
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContext.java 32.68
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/RecordContextInternal.java 32.49
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 32.03
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 31.0
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/RecordContextInternal.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/BrokerPollSystem.java 32.92
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 32.7
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/BrokerPollSystem.java

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 60.67 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 53.94 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 51.38 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 48.82
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 41.05
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalRuntimeException.java 38.93
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 37.67
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 34.52
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 34.52
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PCRetriableException.java 33.25
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalRuntimeException.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 38.93
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 31.14
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 30.61
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/PCModule.java

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 52.02 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 38.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 38.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 37.67
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 35.62
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 35.45
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 33.6
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 30.18
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 60.67 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 52.02 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 49.06
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 47.8
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 47.8
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 47.05
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 45.34
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 37.51
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalRuntimeException.java 31.14
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 48.82
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 47.05
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 45.76
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 39.03
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 39.03
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 30.48
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 30.46
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 30.18
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 51.38 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 49.06
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 45.76
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 34.79
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 34.41
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 33.6
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 32.55
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 32.55
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 64.11 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 47.8
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 39.03
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 38.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 35.84
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 34.52
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 32.55
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 31.65
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 64.11 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 47.8
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 39.03
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 38.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 35.84
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 34.52
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 32.55
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 31.65
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/PartitionState.java

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 44.19
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 40.98
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 38.63
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/RebalanceEoSDeadlockTest.java

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 60.66 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 46.84
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 40.98
parallel-consumer-vertx/src/test-integration/java/io/confluent/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 30.11
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 60.66 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 55.4 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 44.19
parallel-consumer-vertx/src/test-integration/java/io/confluent/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 39.39
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java 55.79 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 33.21
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 55.79 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ProgressProbe.java 35.05
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/AmbientProbeExtension.java 31.22
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/BatchTestBase.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/QuarantineLaneReportScriptTest.java 45.54
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/QuarantineRegistryScriptTest.java 44.02
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CoreBatchTest.java

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

File Similarity (%)
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorBatchTest.java 52.1 ⚠️
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyBatchTest.java 50.8 ⚠️
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/VertxBatchTest.java 44.86
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/BatchTestBase.java 30.29
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithCommitTimeoutException.java 56.59 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithEarlyClose.java 55.67 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithSaslAuthenticationException.java 46.81
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithCommitTimeoutException.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithEarlyClose.java 70.34 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java 56.59 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithSaslAuthenticationException.java 49.18
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithEarlyClose.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithCommitTimeoutException.java 70.34 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java 55.67 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithSaslAuthenticationException.java 52.4 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithSaslAuthenticationException.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithEarlyClose.java 52.4 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTestWithCommitTimeoutException.java 49.18
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java 46.81
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/ParallelEoSSStreamProcessorRebalancedTest.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/ParallelEoSSStreamProcessorRebalancedTest.java 34.52
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/QuarantineLaneReportScriptTest.java

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/TestConventionsArchTest.java 91.26 ⚠️
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/TestConventionsArchTest.java 90.59 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/TestConventionsArchTest.java 89.76 ⚠️
parallel-consumer-reactor/src/main/java/io/confluent/parallelconsumer/reactor/ReactorProcessor.java

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

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

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/TestConventionsArchTest.java 91.26 ⚠️
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/TestConventionsArchTest.java 90.59 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/TestConventionsArchTest.java 89.76 ⚠️
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java

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

File Similarity (%)
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 41.62
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 39.91
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 39.64
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelStreamProcessor.java 35.18
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 31.85
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java

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

File Similarity (%)
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 39.64
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelStreamProcessor.java 38.84
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 32.14
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 31.02
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java

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

File Similarity (%)
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 41.62
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelStreamProcessor.java 41.58
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/ExternalEngine.java 39.47
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelStreamProcessor.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 39.39
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 30.11
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/TestConventionsArchTest.java

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

File Similarity (%)
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/TestConventionsArchTest.java 91.26 ⚠️
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/TestConventionsArchTest.java 91.26 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/TestConventionsArchTest.java 90.43 ⚠️
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/VertxBatchTest.java

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

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

@github-actions

Copy link
Copy Markdown

✅ SpotBugs Report

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

astubbs and others added 5 commits July 31, 2026 14:26
Addresses the Claude auto-review findings on PR #83:

1. chaos-pain.yml: workflow_dispatch inputs (seed, reps) now pass through
   env vars instead of ${{ }} template substitution inside run: - raw
   interpolation executes attacker-shaped input as shell on the
   self-hosted runner (the review flagged seed; reps had the same
   vector). Also ${SEED_ARG:+...} quoting per shellcheck.
2. ManagedPCInstance.run(): try/finally MDC.remove - work-stealing pool
   threads are reused across instances, so the Runner-N tag leaked into
   later instances' setup logs between restarts.

Finding 3 (loose ledger duplicate allowance) intentionally unchanged: it
is the documented vacuous-bound guard; the evidence-based tightening is
rostered in docs/inflight.md behind revoke-event instrumentation.

Verified: test-compile clean, actionlint clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013ALhTf1TRA2S6Ue5rkiQdK
…hecklist gate (#97)

Resolutions: newer #97 checklist wording in CHANGELOG/README/AGENTS (keeping
this branch's in-thread review-response policy bullet alongside); ci scripts
keep the chaos-inclusive exclusion list per the quarantine contract test.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013ALhTf1TRA2S6Ue5rkiQdK
The PR-checklist gate (now on master via #97) requires it - and the suite
is changelog-worthy by house style (CI/dev-facing entries are in).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013ALhTf1TRA2S6Ue5rkiQdK
…unds 3-5 follow-up

The chaos-pain job deliberately excludes @Quarantined scenarios (decision
in c3ba4e1: the known #80-pending W1 RED must not drown the tripwire
signal), which currently means it selects ZERO tests. The review's two
outstanding asks, now addressed:

- chaos-pain.yml timing summary: prints a loud 'ZERO chaos tests selected
  - this run measured NOTHING' banner (instead of an empty table
  impersonating a real GREEN) when no failsafe reports exist; header
  comment documents the quarantine interaction and the interim window.
- AGENTS.md chaos section + docs/inflight.md: the CI job is no longer
  described as equivalent to the local full recipe - the quarantine
  exclusion and the temporary zero-test state are called out explicitly.

Coverage returns when the W4 variants (#85/#87) or the #80 fix land.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013ALhTf1TRA2S6Ue5rkiQdK
…ts/chaos-ambient-probe

# Conflicts:
#	CHANGELOG.adoc
@claude

claude Bot commented Jul 31, 2026 •

Copy link
Copy Markdown

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


Claude finished @unknown's task

Tasks

  • Gather context (PR body, diff, prior review response comment)
  • Read changed files
  • Review AmbientProbeExtension.java (new extension)
  • Review ProgressProbe.java changes (observer mode path)
  • Review KafkaClientUtils.java changes (adminIfOpen, close nulling)
  • Review AmbientProbeExtensionTest.java (new unit tests)
  • Review NoAmbientProbe.java, BrokerIntegrationTest.java, AGENTS.md, CHANGELOG.adoc
  • Post review findings

Review

This push is the review-hardening round (ffbe9bc) responding to the earlier 8-reviewer pass. I verified each claimed fix against the actual diff (origin/feats/chaos-pain-suite...HEAD, 8 files, +749/-24) — all check out:

  • Teardown ordering (P1): AmbientProbeExtension now stops the sampler in afterTestExecution (an AfterTestExecutionCallback), which JUnit 5 runs before @AfterEach methods — so the sampler is joined (5s timeout) before BrokerIntegrationTest.close() closes the admin client. afterEach remains as an idempotent safety net for the @BeforeEach-throws path. Confirmed against JUnit 5's documented extension ordering (BeforeEachCallback → @BeforeEach → BeforeTestExecutionCallback → test → AfterTestExecutionCallback → @AfterEach → AfterEachCallback).
  • Silent-on-green (P1): ProgressProbe.violate() now branches on Mode — DEBUG for AMBIENT_OBSERVER, ERROR unchanged for CHAOS — and AmbientProbeExtensionTest.observerModeRecordsViolationsButNeverLogsError pins this with a real ListAppender, asserting exactly one ERROR record (the chaos one). Good.
  • admin == null lifecycle (P2): admin is now volatile and nulled in close(); adminIfOpen() gives samplers a lifecycle-safe Optional. Single-writer (test thread) / multi-reader (sampler thread) — correct use of volatile for this pattern.
  • Mode enum / re-keying (P2/P3): confirmed Mode.CHAOS/Mode.AMBIENT_OBSERVER replaced the null-sentinel encoding, and the watermark maps (lastCommitted, lastCommittedMove, partitionLagSnapshots) are keyed by TopicPartition, not partition-number Integer — so multi-topic ambient watching can't collide across topics.
  • Test coverage (P1): AmbientProbeExtensionTest covers the isDisabled() matrix (global property, class-level, inherited, method-level), all buildAutopsy/frozenPartitionLines branches, the two beforeEach failure/fallback seams, stop() idempotence, and the log-level contract. Reasonable given the constraints noted in its own javadoc (can't instantiate BrokerIntegrationTest without a Testcontainer).

Residual, non-blocking observations (didn't rise to the level of the prior P1-P3s, flagging for awareness rather than as required fixes):

  1. KafkaClientUtils.java:172-177 — the @BeforeEach-throws path still has a narrow race the javadoc doesn't fully cover: in that path, AmbientProbeExtension.afterEach (an AfterEachCallback) stops the sampler after BrokerIntegrationTest.close() (an @AfterEach method) has already run — so the sampler could observe admin mid-close() and issue a call into it. This is benign in practice (the sampler's catch (Exception e) swallows it, and ambient violations are DEBUG-only, so no test-visible effect), but it's a real gap in the "sampler never races a closing/closed client" claim for the failure-injected-in-@BeforeEach case specifically (as opposed to the normal pass/fail-in-test-method path, which is correctly race-free).
  2. KafkaClientUtils.java:174-177 — if admin.close() itself throws, admin = null never executes, leaving a stale non-null reference that adminIfOpen() would still hand out. AdminClient.close() essentially never throws in practice, so this is low-risk, but worth a finally if it's cheap to add.
  3. ProgressProbe.java:189 — mode.threadName is a fixed literal per mode ("ambient-probe-sampler"), so if failsafe ever runs broker ITs with method-level parallelism inside one JVM, concurrent sampler threads would share a name, making thread dumps harder to disambiguate. Cosmetic only.

None of these are blockers — the core contracts (never fails a test, silent on green, no cross-topic collision, no race on the primary teardown path) all hold up under reading. I was not able to run mvn test/mvn verify in this session (the tool requires interactive approval not available here), so I could not independently re-execute the 263-test unit suite or the AmbientProbeExtensionTest flake re-runs the PR description claims — that verification relies on the author's reported results.

'Temporarily merge the chaos branch into the PR under test' only made
sense while the suite lived on an unmerged branch. Once this PR lands the
suite is on master, so the recipe is: on the fix PR's branch (merge master
in if it predates the suite), run pre-fix vs fix commits and watch
RED->GREEN. Fixed in AGENTS.md + the W1 class javadoc; the PR body is
updated in the same pass.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013ALhTf1TRA2S6Ue5rkiQdK
@github-actions

Copy link
Copy Markdown

🧪🔒 Quarantine Lane Report

Quarantined test Outcome Owner Meaning
ChaosChurnStormIT.churnStormMeetsSlosAndBalancesLedger 🔴 failing (expected) #80 quarantine holding
PartitionStateCommittedOffsetIT.committedOffsetRemoved 🟡🎲 passed (flapper) #80 proves nothing - passes most runs by nature

🔴 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.

…s dispatch-only

Review of today's runner meltdown: independent self-hosted workflows can't
see each other's load, and the per-PR trigger semantics (cancel superseded)
fought chaos-pain's dispatch semantics (queue, never kill). Split cleanly:

- bin/chaos-test.sh: shared runner - the chaos mvn invocation, timing
  summary and the zero-test quarantine banner (emitted on EVERY exit via
  trap, so a RED run still gets its autopsy summary). Inputs via env only.
- pr-highcpu-fast-feedback.yml: new 'Chaos Pain Suite' matrix entry - the
  per-PR ambient tripwire, sharing the lane's same-repo guard and
  per-suite superseding. NOT optional (continue-on-error false, bare check
  name): a chaos RED is a real finding and shows red.
- chaos-pain.yml: workflow_dispatch only (seed/reps hunts), queue-never-
  kill preserved; delegates to bin/chaos-test.sh.
- AGENTS.md / docs/inflight.md / CHANGELOG+README bullet updated.

Verified: bash -n, actionlint both workflows, copyright scan clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013ALhTf1TRA2S6Ue5rkiQdK
… reported green

Review round 6 caught a real regression from effa942: an EXIT trap's own
last command becomes the script's exit status, and everything in
emit_summaries is made to succeed - so bin/chaos-test.sh exited 0 even
when mvnw verify failed, turning a real chaos RED green at both call
sites (the non-optional highcpu lane entry included). Exactly the
silent-success pattern five prior rounds stamped out.

Fix: capture $? first, re-exit with it after emitting summaries.
Verified with stub harness: failing run propagates exit 1 (banner still
emitted), passing run exits 0.

Also: CHANGELOG/README no longer describe the highcpu lane as blanket
continue-on-error - the Chaos Pain Suite entry is deliberately not
(round-6 minor note).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013ALhTf1TRA2S6Ue5rkiQdK
astubbs added a commit that referenced this pull request Jul 31, 2026
…work - head start on #83 landing

Non-trivial resolutions (base evolved past what this branch extracted):
- ChaosScenarioBase helpers upgraded to base's new W1 epilogue semantics:
  settleFleet waits out stopAsync close-pending, settleRun takes/kills the
  pcExecutor, assertScenarioSlos uses the full replay command in messages,
  adds the unclassified-failure-cause canary sweep, and uses
  conductor.getDisturbanceCount()
- W1 keeps its slim helper-calling body + base's @Quarantined + replayCmd
- W4 adopts the same replayCmd pattern for message parity
- W4 plan tests ported from removed planActions to planTicks/TickDraws
  (base's single-draw-path rework); ChaosConductorPlanIT 4/4 green
- ManagedPCInstance: extraConsumerProps merge re-seated in base's
  restructured run(); Config field unchanged
- AGENTS.md: dropped this branch's chaos signpost bullet (base now has a
  full Chaos Pain Suite section); added W4 + ChaosScenarioBase to it
- inflight.md: chaos Phase 2+ roster kept, updated to post-merge reality
  (cooperative lever -> PR #87, ambient probe -> PR #86); dropped the
  fork-header roster entry (base's copyright work already flipped them)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018igSVt74wPQAbRNHkXS4R8
astubbs and others added 2 commits July 31, 2026 16:13
…dencies'

Two fixes for the newly-required check:
- synchronize added to the trigger types: required checks are evaluated
  per head SHA, and without it a plain push produced no run - the check
  sat 'Expected - waiting for status' forever, blocking merges.
- Job renamed 'Check Dependencies' -> 'Check PR Dependencies' (clearer:
  it gates stacked-PR 'depends on #N' ordering, not library dependencies).
  Ruleset context updated to match.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013ALhTf1TRA2S6Ue5rkiQdK
…ts/chaos-ambient-probe

# Conflicts:
#	CHANGELOG.adoc
@claude

claude Bot commented Jul 31, 2026 •

Copy link
Copy Markdown

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


Claude finished reviewing this PR

Tasks

  • Gather context (PR body, diff, prior review response comment)
  • Read changed files in full
  • Review AmbientProbeExtension.java (new extension)
  • Review ProgressProbe.java changes (observer mode path)
  • Review KafkaClientUtils.java changes (adminIfOpen, close nulling)
  • Review AmbientProbeExtensionTest.java (new unit tests)
  • Review NoAmbientProbe.java, BrokerIntegrationTest.java, AGENTS.md, CHANGELOG.adoc
  • Post review findings

Review

I diffed origin/feats/chaos-pain-suite...HEAD (8 files, +749/-24) directly rather than relying on the prior review's summary. The two merge commits since that last pass (8504817, f3e47ec) only pull in upstream feats/chaos-pain-suite changes — the ambient-probe file set and content are byte-identical to what was reviewed at ffbe9bc5, so this confirms (rather than supersedes) that pass.

Verified sound:

  • Teardown ordering: AmbientProbeExtension.afterTestExecution (an AfterTestExecutionCallback) stops the sampler before @AfterEach methods run, which is exactly where BrokerIntegrationTest.close() closes the admin client. afterEach calling stopProbe() again is harmless since ProgressProbe.stop() is idempotent.
  • admin lifecycle: admin is volatile, nulled in close(), exposed to samplers only via adminIfOpen() (Optional) — correct single-writer/multi-reader visibility, and sampleRebalanceDwell/sampleLagStagnation both bail cleanly on Optional.empty().
  • Interrupt-driven stop: stop() calls samplerThread.interrupt() before join(5_000). Kafka's KafkaFuture.get(timeout, unit) honors thread interruption (throws InterruptedException), and sampleLoop's catch (InterruptedException e) (checked before the generic catch (Exception e)) exits promptly — so a sampler blocked in an admin call still unwinds well within the join window.
  • Silent-on-green: violate() branches correctly on Mode (DEBUG for AMBIENT_OBSERVER, ERROR for CHAOS), and AmbientProbeExtensionTest.observerModeRecordsViolationsButNeverLogsError pins this with a real ListAppender rather than a mock — good, since it can't be faked by a lenient stub.
  • Multi-topic re-keying: lastCommitted / lastCommittedMove / partitionLagSnapshots are keyed by TopicPartition, not partition-number Integer — no cross-topic collision in observer mode's all-topic watch.
  • Extension registration: @ExtendWith(AmbientProbeExtension.class) on BrokerIntegrationTest; getKcu() is @Getter(AccessLevel.PROTECTED), and since AmbientProbeExtension shares the same package, the call in beforeEach compiles and resolves correctly.
  • Test dependencies: junit-pioneer (@SetSystemProperty/@ClearSystemProperty), Mockito, Truth, and logback's ListAppender are all already-used parallel-consumer-core test dependencies — no new dependency risk from AmbientProbeExtensionTest.
  • Confirmed no new file actually appears more than once in the changed-file list, and the "misattributed" claim about the duplicate-code bot (flagging files not in this diff) checks out — none of its flagged pairs touch the 8 files actually changed here.

Residual, non-blocking observations (same class of issue as the prior pass — not asking for changes, flagging for awareness):

  1. AmbientProbeExtension.java:36-40 javadoc claim re-examined: the javadoc states that if @BeforeEach throws, afterTestExecution is not invoked (hence afterEach is needed as a safety net). From JUnit 5's TestMethodTestDescriptor execution model, AfterTestExecutionCallbacks are actually invoked unconditionally as part of test-method cleanup, even when an earlier @BeforeEach failed (only @AfterEach methods have historically been the ones "always run on failure" — but AfterTestExecutionCallback brackets test-method invocation specifically and JUnit's own guarantee is that "after" callbacks always run once their "before" counterpart's phase has started). I wasn't able to fully re-verify this against the exact junit-jupiter-engine version pinned in this repo's pom.xml (no shell access to ~/.m2 from this sandbox), so I can't assert the javadoc is wrong with confidence — but if afterTestExecution does fire regardless, the "afterEach is a safety net for exactly that path" framing is inaccurate (though harmless: both call the same idempotent stopProbe(), so there's no behavioral bug either way). Worth a quick check against the actual JUnit version if anyone wants the javadoc to be precise; not worth blocking on.
  2. KafkaClientUtils.java:172-177 — in the @BeforeEach-throws path specifically, AmbientProbeExtension.afterEach (an AfterEachCallback) still runs after BrokerIntegrationTest.close() (an @AfterEach method), so the sampler could observe admin mid-close() and issue one more call into it before afterEach stops it. Benign — swallowed by sampleLoop's catch, DEBUG-only in observer mode — but it means "the sampler never races a closing/closed client" isn't quite true for this one edge case, just for the normal pass/fail-in-test-method path.
  3. KafkaClientUtils.java:174-177 — if admin.close() itself throws, admin = null never executes, leaving a stale reference adminIfOpen() would still hand out. AdminClient.close() essentially never throws, so low-risk; a finally would close the gap cheaply if desired.
  4. ProgressProbe.java:189 — mode.threadName is a fixed literal per mode, so concurrent sampler threads (e.g. under method-level parallel execution) would share a thread name, complicating thread dumps. Cosmetic only.

None of these are blockers. The core contracts this round of hardening targeted — never fails a test, silent on green, no cross-topic collision, sampler doesn't race the primary teardown path — all hold up under direct reading of the current diff. I did not run mvn test/mvn verify in this session (no interactive tool approval available here for build commands), so I could not independently re-execute the unit suite or the flake re-runs the PR/review-response comments report — that verification relies on the author's reported results.

Base automatically changed from feats/chaos-pain-suite to master July 31, 2026 04:34
@claude

claude Bot commented Jul 31, 2026 •

Copy link
Copy Markdown

Claude encountered an error —— View job


I'll analyze this and get back to you.

…e javadoc precision

Automatic-review observations on the ambient probe, dispositioned:

- KafkaClientUtils.close(): null the admin field in a finally so a throwing
  admin.close() cannot leave a stale reference behind adminIfOpen()
- AmbientProbeExtension javadoc: record that the @BeforeEach-throws claim is
  verified against the pinned junit-jupiter-engine bytecode (a @beforeeach
  failure branches past the AfterTestExecutionCallback phase), and document the
  one contained edge where the safety-net stop runs after the admin close

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J4ENhXsAkPXvuK8gGsfxCo
@astubbs

astubbs commented Jul 31, 2026 •

Copy link
Copy Markdown
Owner Author

Response to the automatic review observations - 76ec2ec

All four residual observations from the latest automatic review dispositioned:

1. Javadoc claim "afterTestExecution is not invoked when @BeforeEach throws" - verified CORRECT against the pinned engine. The review couldn't check the exact JUnit version from its sandbox; I decompiled TestMethodTestDescriptor.execute() from the pinned junit-jupiter-engine-5.14.4.jar:

19: invokeBeforeEachMethods
23: ThrowableCollector.isEmpty  26: ifeq 52   <- @BeforeEach threw: branch to 52
...
49: invokeAfterTestExecutionCallbacks         <- skipped by that branch
54: invokeAfterEachMethods                    <- branch target: @AfterEach still runs
59: invokeAfterEachCallbacks                  <- safety net still runs

A @BeforeEach failure branches past the AfterTestExecutionCallback phase, so the afterEach safety net is needed for exactly the path the javadoc describes. Javadoc now records the verification basis.

2. Sampler-vs-close race in the @BeforeEach-throws path - confirmed real, benign, contained; now documented. Same bytecode confirms the safety-net stop (offset 59) runs after the admin close (offset 54) in that path only. At most one sampler call lands mid-close - swallowed by the sample loop's catch, DEBUG-only in observer mode, and adminIfOpen() is empty once close completes. Added to the extension javadoc.

3. admin.close() throwing would skip the null-out - fixed. close() now nulls the field in a finally, so adminIfOpen() can never hand out a stale reference even on a throwing close.

4. Fixed per-mode sampler thread names - acknowledged, declining. Broker ITs run under failsafe with per-class forking; two ambient samplers never coexist in one JVM in this repo's configuration, so the name collision is unreachable in practice and not worth the churn.

🤖 Generated with Claude Code

https://claude.ai/code/session_01J4ENhXsAkPXvuK8gGsfxCo

…-probe

# Conflicts:
#	AGENTS.md
#	CHANGELOG.adoc
#	parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java
#	parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosConductor.java
#	parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosConductorPlanIT.java
#	parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ProgressProbe.java
#	parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/utils/ManagedPCInstance.java
@claude

claude Bot commented Jul 31, 2026 •

Copy link
Copy Markdown

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


Tasks

  • Gather context (PR body, diff, prior review responses)
  • Read changed files in full (fresh checkout at 40d3d9f)
  • Re-verify the 4 dispositions from the latest review response comment (76ec2ec)
  • Check the intervening merge commits (df06582, 40d3d9f) for conflict-resolution damage to ProgressProbe.java
  • Post review findings

Review

This synchronize push is two merge commits (f3e47ec→8504817, df06582, 40d3d9f) pulling in unrelated feats/chaos-pain-suite/master work (the W4 "revoke under work" chaos scenario, PR #85) on top of the already-reviewed 76ec2ec5 hardening commit. I diffed origin/master...HEAD directly (9 files, +765/-46, matches the PR description) rather than trusting the summary, and read every changed file in full.

The four dispositions from the last review-response comment all check out in the code:

  1. Javadoc "afterTestExecution not invoked when @beforeeach throws" — AmbientProbeExtension.java:36-46 now documents the decompiled bytecode basis and the residual one-call race in that path. Accurate framing; matches JUnit 5's documented TestMethodTestDescriptor behavior (a @BeforeEach failure branches past AfterTestExecutionCallback to @AfterEach/AfterEachCallback).
  2. Sampler-vs-close race in the @BeforeEach-throws path — now explicitly documented as contained (swallowed by the sample loop's catch, DEBUG-only, adminIfOpen() empty post-close) rather than claimed impossible.
  3. admin.close() throwing skipping the null-out — KafkaClientUtils.java:174-180: admin = null now runs in a finally, so adminIfOpen() can't hand out a stale reference even if close() throws.
  4. Fixed per-mode thread names — left as-is with a documented rationale (per-class failsafe forking means two ambient samplers never coexist in one JVM); reasonable, non-blocking call.

The merge conflict resolution in ProgressProbe.java is clean. The W4-scenario additions (disableRebalanceDwellViolation(), withNoProgressWindow(), the rebalanceDwellViolationEnabled/noProgressWindow fields) sit alongside the Mode enum / Supplier<String> groupIdSupplier / TopicPartition-keyed maps / PartitionLagSnapshot work from this PR with no duplication, no dropped functionality, and no interaction bugs — the two feature sets are orthogonal (W4's toggles only affect chaos-mode gating; this PR's Mode only affects sampling scope + log level).

Verified correct on this pass:

  • sampleLagStagnation() (ProgressProbe.java:373-380): the snapshot is recorded via partitionLagSnapshots.put(...) before the if (moved) continue, using since (which equals now when moved) — so the autopsy's frozen-partition table gets a fresh entry for partitions that just advanced, not a stale one. This was the subtle piece to get right when re-keying from Integer to TopicPartition and it's correct.
  • KafkaClientUtils.groupId is volatile with a @Getter, matching the "cross-thread visibility" claim; adminIfOpen() returns Optional<AdminClient> sourced from the now-volatile field.
  • AmbientProbeExtensionTest.observerModeRecordsViolationsButNeverLogsError pins the log-level contract with a real ListAppender (not a mock), and correctly relies on Mockito's ReturnsEmptyValues default (Optional.empty() for unstubbed Optional-returning methods) for adminIfOpen() — verified this is in fact Mockito's default behavior, not an assumption the test gets away with by luck.
  • AGENTS.md, CHANGELOG.adoc, BrokerIntegrationTest.java, NoAmbientProbe.java diffs are all consistent with the PR description and each other — no stray edits.

No new issues found in this push. I don't have anything to add beyond what the last two review rounds already surfaced and dispositioned. As in the prior passes, I could not run mvn test/mvn verify in this sandbox (build commands require interactive approval unavailable here), so I'm relying on the author's reported 263/0 unit run and 14/14 AmbientProbeExtensionTest (4x re-run, no flakes) rather than independently re-executing them.

@astubbs
astubbs merged commit 8cc543a into master Jul 31, 2026
30 of 31 checks passed
@astubbs
astubbs deleted the feats/chaos-ambient-probe branch July 31, 2026 05:15
astubbs added a commit that referenced this pull request Jul 31, 2026
The 7-line seed + replay-command construction was cloned between W1's
ChaosChurnStormIT and the W4 driver (flagged by the PR duplication
report). One copy in the base keeps the replay contract - a raw CI log
must be self-sufficient to reproduce - from drifting between scenario
families.

Ledger: drop the ambient-probe bullet (PR #86 merged); record the four
parallel-suite unit flakes seen this session under CI reliability.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Jul 31, 2026
…cenario - PC's first cooperative-assignor coverage (#87)

Extract the two-phase storm/quiet W4 driver into
AbstractRevokeUnderWorkScenario: the eager IT becomes a thin subclass,
and ChaosRevokeUnderWorkCooperativeIT runs the identical scenario with
CooperativeStickyAssignor as the single experimental variable - the
codebase's first end-to-end exercise of PC under incremental
rebalancing. Both arms GREEN across all seeds: backlog drained,
correctness ledger balanced, zero probe violations.

Findings (same-seed A/B, defect arm vs fixed arm):
- Sticky drops revoke events ~6x vs eager (5-15 vs ~57 per run),
  refuting the going-in more-revokes hypothesis; per-event sharpness
  rises instead (partitions keep processing through rebalances).
- The Class 1 dwell measurement does not discriminate arms under
  cooperative - eager-calibrated bounds must not be transplanted; a
  future W1-coop variant needs its own calibration.
- No Class 2 trigger on either assignor: the probe stands as a
  calibrated tripwire (GREEN-side validated both assignors, RED-side
  awaits a real occurrence via the ambient probe, #86).

Also dedups per the PR duplication reports: the seed/replay-command
block is hoisted into ChaosScenarioBase (resolveSeed/replayCommand),
shared with W1's ChaosChurnStormIT.

Plan: docs/plans/2026-07-31-001-feat-chaos-w4-cooperative-variant-plan.md

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Aug 3, 2026
The plan was created and fully executed inside this PR, so its forward-looking
half (requirements trace, scope boundaries, implementation units, open
questions, risks) is now inert, while its diagnosis narrative duplicated the
solutions doc almost line for line.

Keeps the durable artifact and folds in the one thing only the plan carried:
the classification verdict - what this was NOT (not the tight-timeout
contention pattern, not a main-code bug, not already tracked) - which is the
part most likely to save a future reader from the wrong fix.

Repoints the two inbound references: the test javadoc and the inflight ledger
now cite the solutions doc, which is the artifact that still makes sense in a
year. README regeneration also picks up #86's ambient-probe changelog entry
from the master merge.

Test re-verified green after the javadoc repoint (2/2).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Aug 7, 2026
Reviewing the new solution doc surfaced a hole in the checklist that same PR
had just added: it said to check open PRs, which is a collision check. The PR
that already solved something in your file is by definition merged, so
searching only the open list finds nothing and feels like diligence - worse
than not looking, because it produces false confidence. Same for issues: the
useful ones are usually closed.

Searching merged PRs BY TOUCHED FILE - not by keywords in their titles - finds,
for this investigation:

- #110, the sibling flake on this same producerTransactionLock, fixed
  four days earlier and the source of the control-arm method
- #86, which introduced the ambient probe whose "probe clean" verdict
  this work had to qualify
- #98, the backpressure test that only passed by racing its own setup -
  the sibling rule this doc deliberately does not merge with

None would surface from a symptom search or from the open list. All three are
now cited in the solution doc, with #80, #115 and #68
from the same family, and the confluentinc#803 / confluentinc#809 / confluentinc#833 cluster upstream.

Adds to the doc what the prior-art search actually covered, including what it
did NOT (the highcpu and quarantine lanes), so the next reader knows where the
gaps are instead of assuming there are none.

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