Skip to content

ci(static): turn on the analysis this repo was not running, and register what stays off - #356

Merged
astubbs merged 8 commits into
masterfrom
ci/static-analysis-expansion
Aug 25, 2026
Merged

astubbs merged 8 commits into
masterfrom
ci/static-analysis-expansion

Conversation

@astubbs

@astubbs astubbs commented Aug 25, 2026 •

Copy link
Copy Markdown
Owner

Serves no single issue. Turns on the static analysis this repo was not running, records every rule
it switches off so they can be turned back on deliberately, and - by the end - fixes the analysis
lanes' own habit of reporting success without having measured anything.

depends on #347
depends on #348

Those land first by request, and there is a substantive reason too: this PR analyses test code
for the first time, and #347 adds the Lincheck harnesses. The rule registry
should be built against a tree that contains them.

What lands

Engine State before State now
SpotBugs one module of five, main code only, stock detectors, invisible auto-baseline whole reactor, main and test code, fb-contrib + find-sec-bugs + findbugs-slf4j, checked-in rule filter, findings printed to the build log
Error Prone + NullAway absent error_prone_core 2.42.0 + NullAway 0.12.7, pinned below the JDK 17 line, with a rule registry
javac -Xlint no <compilerArgs> block existed at all -Xlint:all, no -Werror, rawtypes off for test compilation only
PIT mutation a lane that had scored zero mutants on 40 consecutive runs revived, and its verdict now counts mutants evaluated rather than generated
RacerD never ran static: racerd on ubuntu-latest, digest-pinned toolchain, gated on an identity ratchet
ArchUnit - shard-map replacement rules
forbidden-apis absent jdk-unsafe over main code
enforcer 4 rules plus requireUpperBoundDeps
ShellCheck absent shell: lint, errors only, with a self-test carrying two red arms

The finding that justifies the detectors

fb-contrib's MUI_CONTAINSKEY_BEFORE_GET names ShardManager.removeWorkFromShardFor -
containsKey, then get, then dereference, which is #345's check-then-get
seam verbatim - statically, in seconds, with no harness and no annotation.

That narrows a standing claim both concurrency PoCs rest on. The register said "nothing static
does". Honestly bounded, it is one of four known instances: #346's seam
is a stale-check before a lookup, and the two torn-read value-divergence cases are outside what any
check-then-act detector looks at.

Suppression is a registry, not a baseline

The spotbugs-baseline job regenerated an exclude filter on every push to master, keyed on class
plus method plus bug type, recording nothing about what it swallowed. Deleted. In its place
config/spotbugs-exclude.xml, where every entry has a row in
docs/inflight/static-spotbugs-rule-registry.md with a reason and a re-enable trigger. Coarser on
purpose: visible in a diff, and the off-count only goes down. Same argument
static-archunit-main-code-rules.md already makes for refusing FreezingArchRule. ShellCheck
severities and Error Prone checks are tiered the same way, and each registry carries a ranked
"turn these on next" so the backlog is a work order rather than a list.

643 findings unfiltered, 278 after. The lane cannot fail a build - it runs
spotbugs:check -Dspotbugs.failOnError=false - and the registry now says so outright, with the
trigger that flips it.

The recurring defect, including in this PR's own work

A check that dies, skips, or measures nothing reports the same green as a check that passed.
That is the thread through everything here, and the uncomfortable part is how much of it was found
inside this branch rather than in the code it was pointed at.

  • The SpotBugs rule filter's first version was completely inert. Test-scoped entries used
    <Source name="~.*src/test.*"/>, but SpotBugs records sourcepath package-relative. Build green,
    XML valid, zero effect. Caught by asserting the excluded rule had reached zero.
  • -Xlint:all did nothing for two runs, having landed in the intellij-idea-only profile CI
    never activates. Caught by help:effective-pom | grep -c, not by the build.
  • The PIT lane had scored zero mutants on 40 consecutive green runs, and its verdict counted
    mutants generated rather than evaluated - so a run whose minions all die would still pass.
  • The RacerD ratchet compared a count, not identities, so fixing one race and introducing
    another passed green at 13 either way. Then its self-test's ratchet arms turned out to assert
    nothing at all while printing ok:.
  • The RacerD self-test's decisive arm had never run in CI, looking only for a developer's local
    SDKMAN path and printing skip on a hosted runner.
  • A head -50 in the mutation lane could kill the verdict by SIGPIPE under pipefail, so a
    large but valid report would have made the lane look broken.
  • The sigpipe gate failed on the very fix it prescribes, reading the second | of || as a pipe.
  • The forbidden-apis mutation arm was contaminated - both arms exited 1 on the enforcer, with
    zero forbidden-method errors.

Each is fixed with a control arm that flips, and each fix carries the reasoning in its commit.

Reading the analysis, which is the half that was missing

Turning a channel on is not the same as reading it, and this PR proved that on itself: -Xlint and
SpotBugs-over-tests both fired on files this PR was editing - including on the exact
PCMetricsDef.toCamelCase line it had just rewritten to satisfy a different detector - and the
author never looked. A human found them scrolling Files Changed.

The cause is structural: the tools report to five places that are not each other - the Maven
console, check annotations, sticky PR comments, job summaries, and files under target/. So
bin/check-pr-analysis-surfaces.sh collapses that into one command, splitting findings on a line
your diff wrote
(yours) from those merely in a file you touched (inherited), and
de-duplicating the same javac warning across every compiling job. On this PR: 28 findings in 3
files, exactly 1 of them ours. It is gh-reads-only, so the check- prefix grants it to the review
agent automatically.

bin/check-all.sh is the same problem one level up. There are eighteen check-*.sh gates and
twenty-two self-tests in bin/, and an agent preparing a push had to know which applied - so it ran
whichever subset it remembered. That is not hypothetical either: a push on this branch failed
check-branch-self-reference.sh in CI after a local sweep of seven gates chosen by hand. The gate
was not new, not subtle, and not broken; it was not on somebody's list. check-all.sh globs both
sets instead, so a gate added tomorrow is swept with no edit anywhere and nobody has to register it.

Neither tool counts a skip as a pass - both exit 2 for "cannot run", and check-all gives exit 2
and exit 3 their own columns outside the pass count. A runner that laundered "could not measure"
into "measured and found nothing" would be this PR's own defect class, one layer up.

Both went through an independent review round of their own. It found three real defects - a gate
that bash cannot parse also exits 2 and so was filed as a skip; the exception list's assertion
caught renames but not a recorded reason that had expired; and findings were classified on
start_line alone, so one spanning a method could start on an untouched line, end on an added one,
and be misfiled as inherited. All fixed. It also overstated its headline: an unparseable gate does
normally fail the sweep, via ShellCheck at severity=error - the real hole is narrower, needing
ShellCheck to be absent so that two skips agree. The measured version is in the code.

Two related repairs: SpotBugs printed nothing to the build log until now, and two-thirds of the
-Xlint channel was the Truth generator's own output (843 warnings to 266, main code unchanged
at 58).

Records corrected

Notes are injected as current state, so a stale one actively misroutes the next agent. Corrected
here: the -Xlint inventory (said "all in test code"; 58 are main), the SpotBugs baseline described
in the present tense after its deletion, RFI_SET_ACCESSIBLE's "two sites" (twelve, in five files),
bin/racerd-test.sh's header denying the CI lane the same commit added, and a coverage note whose
every claim this branch had falsified - retired, with the one genuinely open question kept.

The build-hardening register, extracted here from #344, ends with all
thirteen entries struck and is cut from 252 lines to 64.

Deferred, with the reasoning recorded

  • Two analysis profiles - full rules on new code, a small enforced set on all of it. The
    classification is done; the wiring is deliberately a separate PR.
  • @SneakyThrows blinds SpotBugs dataflow - 21 main-code sites, now tracked with the cheapest
    experiment written down.
  • dependencyConvergence measured and deferred with its tail recorded, while
    requireUpperBoundDeps is on and passing.
  • A polyglot client survey for the ten non-Java clients: CodeQL supports nine of ten, and the Go
    client's gating test command has no -race.

Checklist

  • Docs updated - the registries, plus the topic docs and docs/inflight/ notes named above.
  • User-facing feature documentation data added under docs/features/ - N/A - build and CI
    only. The code changes are a bug fix in an example, a locale fix in a doc generator, and a
    suppression narrowing.
  • Tests added/updated - self-tests for every gate added here: bin/test-check-shell-lint.sh,
    bin/test-check-racerd.sh (7 arms including the same-count swap a ceiling passes),
    bin/test-ci-mutation-test.sh (20 arms), bin/test-check-pr-analysis-surfaces.sh (7 arms),
    and two new arms on bin/test-check-shell-sigpipe.sh.
  • Title & body reflect the final content of this PR

@github-actions

github-actions Bot commented Aug 25, 2026 •

Copy link
Copy Markdown

Dependency Review

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

License Issues

.github/workflows/repo-hygiene.yml

PackageVersionLicenseIssue Type
actions/setup-java5.*.*NullUnknown License
Excluded from license check: pkg:githubactions/actions/github-script

OpenSSF Scorecard

PackageVersionScoreDetails
actions/actions/setup-java 5.*.* 🟢 5.4
Details
CheckScoreReason
Maintained🟢 1030 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 10
Code-Review🟢 3Found 9/26 approved changesets -- score normalized to 3
Binary-Artifacts🟢 10no binaries found in the repo
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Packaging⚠️ -1packaging workflow not detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
License🟢 10license file detected
Pinned-Dependencies⚠️ 0dependency not pinned by hash detected -- score normalized to 0
Signed-Releases⚠️ -1no releases found
Fuzzing⚠️ 0project is not fuzzed
Security-Policy🟢 9security policy file detected
Branch-Protection⚠️ 0branch protection not enabled on development/release branches
SAST🟢 10SAST tool is run on all commits
maven/com.h3xstream.findsecbugs:findsecbugs-plugin 1.14.0 UnknownUnknown
maven/com.mebigfatguy.fb-contrib:fb-contrib 7.7.4 🟢 3.7
Details
CheckScoreReason
Maintained🟢 56 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 5
Packaging⚠️ -1packaging workflow not detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Code-Review⚠️ 0Found 2/26 approved changesets -- score normalized to 0
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Binary-Artifacts🟢 10no binaries found in the repo
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Pinned-Dependencies⚠️ 0dependency not pinned by hash detected -- score normalized to 0
Security-Policy⚠️ 0security policy file not detected
Fuzzing⚠️ 0project is not fuzzed
Signed-Releases⚠️ -1no releases found
License🟢 10license file detected
Branch-Protection⚠️ -1internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
maven/de.thetaphi:forbiddenapis 3.10 UnknownUnknown
maven/jp.skypencil.findbugs.slf4j:bug-pattern 1.5.0 UnknownUnknown

Scanned Files

  • .github/workflows/repo-hygiene.yml
  • pom.xml

@github-actions

github-actions Bot commented Aug 25, 2026 •

Copy link
Copy Markdown

✅ Duplicate Code Report

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

✅ PMD CPD

PR Base Change
Clones 31 31 ➖ 0
Duplicated lines 979 979 ➖ 0
Duplication 0.13% 0.13% ➖ 0
Rule Limit Status
Max duplication 0.5% ✅ Pass (0.13%)
Max increase vs base +0.1% ✅ Pass (+0.00%)

No new clones introduced by this PR.

✅ jscpd (language-agnostic)

PR Base Change
Clones 80 81 🙂 -1
Duplicated lines 1179 1195 👍 -16
Duplication 1.14% 1.21% 🙂 -0.07%
Rule Limit Status
Max duplication 2% ✅ Pass (1.14%)
Max increase vs base +0.1% ✅ Pass (-0.07%)

No new clones introduced by this PR.

Powered by astubbs/duplicate-code-cross-check

@github-actions

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

🔺 Increased similarities

File A File B Base (%) PR (%) Change
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckHarness.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckToolchainProbeTest.java 32.4 33.7 +1.3
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/BrokerPollSystem.java 33.2 33.8 +0.6
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/SubmitWorkToPoolShutdownRaceTest.java 45.2 45.4 +0.3
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalRuntimeException.java 40.2 40.4 +0.2
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalRuntimeException.java 31.7 31.9 +0.2
parallel-consumer-mutiny/src/main/java/bz/stub/parallelconsumer/mutiny/MutinyProcessor.java parallel-consumer-reactor/src/main/java/bz/stub/parallelconsumer/reactor/ReactorProcessor.java 51.2 51.4 +0.2
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ExternalEngine.java parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 39.8 39.9 +0.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalRuntimeException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 31.0 31.1 +0.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AbstractParallelEoSStreamProcessorConfigurationTest.java 33.6 33.7 +0.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PCRetriableException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 32.2 32.3 +0.1
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckToolchainProbeTest.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerLincheckTest.java 35.6 35.7 +0.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java 30.0 30.1 +0.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 35.0 35.1 +0.1
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java 41.4 41.5 +0.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 40.3 40.3 +0.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 53.6 53.6 +0.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 34.0 34.1 +0.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PCRetriableException.java 34.7 34.8 +0.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 30.7 30.8 +0.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 33.0 33.1 +0.1

...and 46 more

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

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

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

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

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

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

File Similarity (%)
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/SeenSucceededOrderingProbes.java 58.84 ⚠️
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/BootstrapResetTripleWriteProbes.java 43.95
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CalibrationProbes.java 38.53
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/SeenSucceededOrderingProbes.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 52.71 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 37.79
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PCRetriableException.java 34.78
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 34.13
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 32.71
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 32.18
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 32.07
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 31.37
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 63.74 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 57.58 ⚠️
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 42.18
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 40.33
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 35.07
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 33.07
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCModule.java 32.54
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 30.76
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 63.74 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 53.63 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 39.66
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 34.54
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 34.07
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCModule.java 32.6
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 32.13
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PCRetriableException.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 52.71 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 52.21 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 42.79
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 33.15
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalRuntimeException.java 31.85
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 31.66
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerOptions.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 57.58 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 53.63 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 48.0
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 36.14
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 33.83
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCModule.java 32.31
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 31.92
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 48.0
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 40.33
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 39.66
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 35.25
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContext.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 36.14
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 35.07
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 34.07
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/RecordContextInternal.java 33.83
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContext.java 30.96
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/RecordContextInternal.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/SubmitWorkToPoolShutdownRaceTest.java 45.43
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/BrokerPollSystem.java 33.83
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AbstractParallelEoSStreamProcessorConfigurationTest.java 33.71
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java 30.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ProducerManager.java 30.08
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/BrokerPollSystem.java

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 58.3 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 52.21 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 49.66
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 47.57
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalRuntimeException.java 40.4
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 37.79
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 34.57
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PCRetriableException.java 32.34
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 31.41
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 30.62
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalRuntimeException.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 40.4
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 31.85
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 31.15
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCModule.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 32.6
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 32.54
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 32.31
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PCModuleTestEnv.java 31.67
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ProducerManager.java

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 49.6
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 35.63
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 34.74
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 34.57
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 33.15
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 32.71
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 30.83
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 58.3 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 49.6
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 46.72
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 46.24
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 45.08
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 44.78
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 42.79
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 34.13
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalRuntimeException.java 31.15
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 47.57
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 44.8
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 44.78
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 35.8
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 34.9
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 49.66
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 46.72
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 44.8
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 32.07
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 31.66
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 30.83
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 61.58 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 46.24
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 35.8
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 35.63
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 32.18
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 31.41
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 61.58 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 45.08
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 34.9
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 34.74
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 31.37
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 30.62
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionStateManager.java 33.25
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 30.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionStateManager.java

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 39.74
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 39.08
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 35.83
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/RebalanceEoSDeadlockTest.java

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 54.08 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 43.7
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 39.08
parallel-consumer-vertx/src/test-integration/java/bz/stub/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 31.06
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 57.05 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 54.08 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 39.74
parallel-consumer-vertx/src/test-integration/java/bz/stub/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 35.4
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkKeyOrderIT.java 40.65
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 40.41
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 38.46
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java 35.64
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ProgressProbe.java 30.42
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 47.05
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 40.41
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 33.06
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkKeyOrderIT.java 55.87 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 47.05
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 38.46
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 36.43
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/KeyOrderLedger.java 33.3
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkCooperativeDrainIT.java

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

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

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 36.43
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 33.06
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/KeyOrderLedger.java

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerTestBase.java 40.29
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ConsumerOffsetCommitter.java 33.38
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CommitRejectionTestBase.java 33.03
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java

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

File Similarity (%)
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorBatchTest.java 51.76 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java 50.17 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java 44.64
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/BatchTestBase.java 30.07
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerCommitTimeoutTest.java

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 87.32 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 86.37 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 86.37 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 83.93 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 83.93 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 83.93 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 82.42 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 82.42 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ConsumerManagerCommitRetryBudgetTest.java

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckToolchainProbeTest.java 35.73
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateLincheckTest.java 32.19
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerLincheckTest.java 30.12
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerLincheckTest.java

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

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

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 83.93 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 83.64 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 82.73 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 82.73 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 80.39 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 80.39 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 78.94 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 78.94 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 82.42 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 82.13 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 81.24 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 81.24 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 78.94 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 78.94 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 78.94 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 77.52 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/integrationTests/CoreAppMetricsIntegrationTest.java

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 83.93 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 83.64 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 82.73 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 82.73 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 80.39 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 80.39 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 78.94 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 78.94 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 82.42 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 82.13 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 81.24 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 81.24 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 78.94 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 78.94 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 78.94 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 77.52 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/main/java/bz/stub/parallelconsumer/examples/vertx/VertxApp.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 83.93 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 83.64 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 82.73 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 82.73 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 80.39 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 80.39 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 78.94 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 78.94 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/VertxAppTest.java

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

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

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 86.37 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 86.07 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 85.14 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 82.73 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 82.73 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 82.73 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 81.24 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 81.24 ⚠️
parallel-consumer-reactor/src/main/java/bz/stub/parallelconsumer/reactor/ReactorProcessor.java

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 86.37 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 86.07 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 85.14 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 82.73 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 82.73 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 82.73 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 81.24 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 81.24 ⚠️
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 42.18
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 41.45
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 41.19
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java 37.25
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 34.54
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 31.92
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java

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

File Similarity (%)
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java 41.53
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 41.19
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 35.25
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 33.07
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 32.13
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java

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

File Similarity (%)
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java 43.83
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 41.45
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ExternalEngine.java 39.92
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 87.32 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 86.07 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 86.07 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 83.64 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 83.64 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 83.64 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 82.13 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 82.13 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java

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

File Similarity (%)
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorBatchTest.java 49.93
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java 48.41
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 44.64

@github-actions

github-actions Bot commented Aug 25, 2026 •

Copy link
Copy Markdown

🧪🔒 Quarantine Lane Report

Quarantined test Outcome Owner Meaning
PCMetricsTest.metricsRegisterBinding 🔴 failing (expected) ⚠️ unowned quarantine holding
ProducerManagerTest.producedRecordsCantBeInTransactionWithoutItsOffsetDirect 🟡🎲 passed (flapper) #262 proves nothing - passes most runs by nature
OffsetEncodingBackPressureTest.backPressureShouldPreventTooManyMessagesBeingQueuedForProcessing 🟡🎲 passed (flapper) ⚠️ unowned 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.

@github-actions

github-actions Bot commented Aug 25, 2026 •

Copy link
Copy Markdown

⚠️ SpotBugs Report

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

@astubbs astubbs changed the title ci(static): fb-contrib, test-code coverage, and a rule registry replacing the SpotBugs baseline ci(static): turn on the analysis this repo was not running, and register what stays off Aug 25, 2026
@astubbs

astubbs commented Aug 25, 2026

Copy link
Copy Markdown
Owner Author

@codex review this

@astubbs

astubbs commented Aug 25, 2026

Copy link
Copy Markdown
Owner Author

@claude review this

A steer, since this branch is mostly about analysers whose failure mode is looking clean. The thing worth being hardest on is any place a lane can report success having measured nothing - that is the defect class the whole PR exists to remove, and it has already been found twice inside the fixes for it.

Highest value first:

  1. bin/ci-mutation-test.sh - the verdict now gates on mutants EVALUATED, parsed out of mutations.xml, not on the >> Generated N mutations line. Please attack the parse. Does grep -oE "status='(KILLED|SURVIVED|TIMED_OUT|NO_COVERAGE)'" match every shape real pitest emits, including a <mutation> element split across lines or with the attribute order changed? A parse that silently under-counts turns a healthy run into an exit 2; one that over-counts restores the false green. The four-state exit contract (0 scored / 2 cannot run / 3 nothing in scope / * PIT's own status) is load-bearing and asserted by bin/test-ci-mutation-test.sh.

  2. The same file, set -o pipefail. Building the fixture surfaced that a grep matching nothing exits 1 and killed the script mid-assignment, producing exit 1 with no output at all. I guarded the two new greps with { ...; || true; }. Are there others on this branch with the same shape - a pipeline whose no-match case is the normal case?

  3. bin/racerd-test.sh - the ratchet compares finding IDENTITIES against racerd-known-findings.txt, not a count. A count let a same-magnitude swap through. Check the comm inputs really are identically ordered now (LC_ALL=C sort on both sides); a mis-sorted comm reports known findings as new and new ones as known, and it looks like it works.

  4. .github/workflows/maven.yml - the Infer digest step. It runs unconditionally rather than only on a cache miss, deliberately, because the cache is the mutable half. Is that placement actually right relative to the restore, and does a failure there stop the unpack?

  5. AbstractParallelEoSStreamProcessor / BrokerPollSystem - @SuppressWarnings("BanJNDI") moved off three method bodies onto private lookup helpers. This is the only main-code change and it is in the executor setup path. Behaviour must be identical: same fallback on NamingException, same log text under the same logger name, same ordering. setupWorkerPool also lost its finalDefaultFactory copy - confirm the remaining capture is still safe.

Also worth a look, lower stakes: the SpotBugs lane runs spotbugs:spotbugs, not :check, so findings annotate and never block. That is deliberate staging and now recorded with the trigger that flips it - tell me if you think the trigger is wrong rather than that the lane should block today.

What I would rather you did not spend time on: the four rule registries under docs/inflight/ share a house style on purpose, and the five bail-out blocks in ci-mutation-test.sh share a shape but not their prose. I declined a bail() helper deliberately, because it would flatten the stderr/summary split that makes the CI log and the job summary say different things. Argue with that if you disagree, but it is a decision, not an oversight.

Note this PR is gated on #347 and #348, so a red Check PR Dependencies is expected until those merge.

@claude

claude Bot commented Aug 25, 2026 •

Copy link
Copy Markdown

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


Review complete

  • Gather context (git log, diff, repo docs)
  • 1. bin/ci-mutation-test.sh mutation-count parse robustness
  • 2. set -o pipefail audit for other no-match-is-normal pipelines
  • 3. bin/racerd-test.sh identity-ratchet sort/comm correctness
  • 4. .github/workflows/maven.yml Infer digest step placement
  • 5. @SuppressWarnings("BanJNDI") refactor behavior preservation
  • 6. SpotBugs spotbugs:spotbugs vs :check staging note

Went after the parse rather than reasoning about it — built two fixture mutations.xml files and ran the actual regexes from bin/ci-mutation-test.sh against them.

1. bin/ci-mutation-test.sh — the EVALUATED gate is robust; the SURVIVORS table is not, and I can show it

The gate's own count (grep -oE "status='(KILLED|SURVIVED|TIMED_OUT|NO_COVERAGE)'", the one the exit code turns on) doesn't need the report to be single-line. I built a <mutation> whose opening tag is split across three lines:

<mutation
    detected='false'
    status='SURVIVED'
    numberOfTestsRun='2'><sourceFile>Foo.java</sourceFile>...<lineNumber>42</lineNumber><description>removed call to size()</description></mutation>
<mutation detected='true' status='KILLED' ...>...</mutation>

grep -oE still found both (wc -l → 2) — it doesn't care what's around status='X', so the pass/fail floor survives a shape change to the surrounding tag. Good.

The SURVIVORS/PARSED extraction (the sed at the status='...'.*<sourceFile>...<lineNumber>...<description> chain, used to build the human-facing table) is a different story — it needs status=, <sourceFile>, <lineNumber>, and <description> all on the same line, in that order, because sed operates per-line and . doesn't cross a \n. Against the same fixture:

sed -n "s|.*status='\([A-Z_]*\)'.*<sourceFile>...<description>\(.*\)</description>.*|...|p" tmp.xml

produces zero rows for the split element — status='SURVIVED' is alone on its own line with no <sourceFile> following it there, so the whole substitution never fires for that mutation, and it silently vanishes from the survivor table. The KILLED one (single-line, real PIT's actual shape) parses fine, so nothing looks broken.

Net: against the pitest version this is pinned to (1.25.8, which — per the fixture-writer in bin/test-ci-mutation-test.sh and everything I can find — really does emit one <mutation> per line) this isn't live. But it's exactly the two things you asked me to attack ("split across lines", "attribute order changed") landing in the one place that has no self-test and no cross-check: EVALUATED (gate) and SURVIVORS/TOTAL (report) are computed by two parsers with different tolerances, and nothing asserts they agree. A future pitest bump that reformats the XML would make the exit code stay honest while the survivor list quietly under-reports — the defect class this whole branch exists to remove, just relocated one layer up, into the part nothing gates on.

Cheap hardening, if you want it: grep -c '<mutation ' "$REPORT" compared against EVALUATED + UNEVALUATED (or even just against wc -l of $PARSED) would turn a silent drift into a loud one. Not blocking — it's advisory output today — but worth a docs/inflight/ line if you're not doing it now.

2. set -o pipefail — no other instance found

Checked every bin/*.sh this PR touches or adds (ci-mutation-test.sh, racerd-test.sh, check-shell-lint.sh, check-shell-sigpipe.sh, test-check-racerd.sh, test-check-shell-lint.sh, test-ci-mutation-test.sh, the one-line check-quarantine-registry.sh fix) for a pipe into grep/sed/awk whose no-match case is the normal case and isn't already guarded. The two you already found (lines around EVALUATED=/UNEVALUATED= in ci-mutation-test.sh) are the only live instances; everything else either uses a herestring (grep -qF "$x" <<< "$out", consistently, matching bin/AGENTS.md's own rule) or pipes into something that doesn't fail on empty input (sort, tail -1, wc -l). Didn't find a fourth.

3. bin/racerd-test.sh — sort matches, comm itself doesn't pin the locale

$current and $expected are both built through LC_ALL=C sort, so the exact bug you're guarding against (Python's tuple order vs. the shell's lexical order disagreeing) is fixed. One notch further out: the two comm calls themselves (comm -13 "$expected" "$current", comm -23 ...) run under whatever locale the shell inherits, not LC_ALL=C. comm's merge assumes its inputs are sorted the way it would sort them; if the CI runner's ambient LANG/LC_COLLATE isn't C (GitHub-hosted Ubuntu images often default to en_US.UTF-8), and a signature pair ever differs from a bug-type pair only in case or an underscore/dot boundary, comm's own collation could disagree with the C-locale order the files were actually written in — the same failure mode one step further down the pipe, silent in exactly the same way. No workflow in this repo sets LANG/LC_ALL globally, so this isn't hypothetical-proofed. Cheap fix, matches the file's own belt-and-suspenders style: LC_ALL=C comm -13 ... / LC_ALL=C comm -23 ....

4. Infer digest step — placement is right, and failure does stop the unpack

It runs unconditionally, after both the cache-hit and cache-miss paths converge on the same file, and before "Unpack and confirm it runs" — so every unpack, cached or fresh, is preceded by a check. GitHub Actions run: steps default to bash -eo pipefail, and neither this step nor the racerd job carries continue-on-error, so a digest mismatch fails the step, the job stops, and the unpack step (implicit if: success()) never runs. Worth noting as a plus, not a gap: actions/cache@v4's post-step saves the cache regardless of job outcome, so even if a bad tarball did get cached once, the next run restores it, re-verifies, and fails again rather than serving a stale-bad cache silently — the check re-fires every run, not just on first download.

5. @SuppressWarnings("BanJNDI") refactor — verified line-by-line, no behavior change

All three sites checked against origin/master:

  • AbstractParallelEoSStreamProcessor#setupWorkerPool and the executor lookup near doClose's caller now share one lookupManagedResource helper — both previously logged the identical "Using Java SE Thread" at debug, so consolidating them loses nothing; T is inferred correctly at each call site from the Supplier argument (Executors::defaultThreadFactory / Executors::newSingleThreadExecutor).
  • BrokerPollSystem#start was correctly not folded into that shared helper — it logs different text ("Couldn't look up an execution service, falling back to Java SE Thread") under its own logger, and the javadoc explains exactly why it stays separate.
  • finalDefaultFactory is gone because the try/catch moved inside the extracted method, so the lambda now captures the method's own final return value directly — same effect, one fewer local.

No ordering, fallback, or logging change in any of the three.

6. SpotBugs spotbugs:spotbugs vs :check

Agree with the trigger as written (docs/inflight/static-spotbugs-rule-registry.md, "Tier 2 empty" → flip to :check). Blocking today, before the off-list is down to permanent/justified entries, would just be today's baseline problem wearing a different name.


Everything above is advisory/non-gating machinery except item 5 (main code) and item 1's live behavior (which is currently correct for the pinned PIT version — the finding is about what happens if that stops being true and nothing would notice). Didn't spend time on the rule-registry prose or the bail() non-decision, per your steer.

@astubbs

astubbs commented Aug 25, 2026

Copy link
Copy Markdown
Owner Author

Answering the two bot reports on this PR that carry something real, so neither sits unaddressed.


| AbstractParallelEoSStreamProcessor.java | BrokerPollSystem.java | 33.6 | 34.2 | +0.6 |

This one is mine, and it is deliberate. The +0.6 is the BanJNDI narrowing in 19b504c: the suppression used to sit on three method bodies, one of them fifty lines, so it also excused any JNDI lookup a later edit dropped into those bodies. Both classes now carry a private helper whose entire body is the call being excused, which is what makes the suppression a claim about one call instead of a region.

That produced two structurally similar eight-line helpers, and I did not merge them. Sharing needs the message and the logger to travel with the call, because the two log different text under different logger names, and that text is what an operator greps for when a container executor was not picked up. The options were:

  • one static utility taking (Logger, String jndiName, String message, Supplier<T> fallback) - four parameters serving two call sites, and threading a Logger into a utility is the usual sign the helper belongs to neither class;
  • one utility with its own logger - collapses the duplication properly, but changes which logger name those lines are attributed to, which is observable to anyone grepping logs;
  • leave them separate, with the reasoning written into the javadoc of both so the next reader does not "fix" it.

I took the third and recorded why in the code. Happy to be argued out of it.

The other rows are pre-existing and untouched by this PR - InternalException/InternalRuntimeException, the Mutiny and Reactor processors, the Vertx pair. Those are base-branch clones, out of scope here. Both cross-check engines pass with no new clones (PMD CPD +0.00%, jscpd -0.06%).


278 bug(s) found (rule-level exclusions only)

Expected, and the number is consistent with what the registry records. The measurement in docs/inflight/static-spotbugs-rule-registry.md puts the unexcluded haul at 601 across the reactor - 228 in main code, 373 in test - with fb-contrib and find-sec-bugs added. 278 is what survives the rule-level exclusions in spotbugs-exclude.xml, every one of which has a row in that registry with a reason and a re-enable trigger.

Two things worth stating plainly, because a ⚠️ 278 with a green tick invites exactly the wrong reading:

  • This lane cannot fail a build. It runs spotbugs:spotbugs, not spotbugs:check, so findings are annotated and never blocking. That is deliberate staging, not an oversight - the filter and the registry had to exist first, or the first red build gets answered with a blanket suppression - and the registry now says so outright along with the trigger that flips it: when Tier 2 is empty, so every remaining exclusion is permanent and reasoned.
  • The findings do not expire. This PR deletes the auto-regenerating baseline that used to swallow them on the next master push. There is no longer a closing triage window, which is the entire argument for rule-level suppression over a baseline. The count is now a standing figure that only goes down, and the registry carries a ranked "top 5 to turn back on next" so it is a work order rather than a wall.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

printf '%s\n' "$SURVIVORS" | head -50 \
| awk -F'\t' '{ printf "%-12s %-34s %s\n", $3, $1 ":" $2, $4 }' >> "${GITHUB_STEP_SUMMARY:-/dev/null}"

P1 Badge Avoid SIGPIPE while truncating the survivor table

When the survivor text following the first 50 rows exceeds the pipe buffer, head -50 exits early, printf receives SIGPIPE, and set -o pipefail terminates the script with status 141 before it reaches the mutation verdict. A sufficiently large but otherwise valid PIT report therefore makes the advisory lane look broken and leaves its summary incomplete; truncate without an early-closing pipeline, such as with a reader that consumes the full input.

AGENTS.md reference: bin/AGENTS.md:L30-L34

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread docs/inflight/static-spotbugs-coverage-and-extension-detectors.md Outdated
Comment thread bin/racerd-test.sh Outdated
Comment thread bin/test-check-racerd.sh
@astubbs

astubbs commented Aug 25, 2026

Copy link
Copy Markdown
Owner Author

Avoid SIGPIPE while truncating the survivor table ... head -50 exits early, printf receives SIGPIPE, and set -o pipefail terminates the script with status 141 before it reaches the mutation verdict

Confirmed and fixed in df53f9d. (Replying here rather than in a thread - this one arrived in the review body, so it has no thread to resolve.)

The consequence is worse than a truncated table, which is why it was worth fixing rather than noting: the pipeline dies before the verdict block, so the lane whose entire purpose is to distinguish "scored mutants" from "measured nothing" would itself exit 141 and report neither. A large but perfectly valid PIT report makes the guard look broken.

The cap is now awk's rather than head's:

printf '%s\n' "$SURVIVORS" \
  | awk -F'\t' 'NR <= 50 { printf "%-12s %-34s %s\n", $3, $1 ":" $2, $4 }' >> ...

awk consumes its whole input and simply stops printing after NR 50, so nothing closes early. One process fewer, and the "showing the first 50 of N" line below it is unchanged.

On the defect class, since a fix that only removes today's instance invites tomorrow's. bin/check-shell-sigpipe.sh already guards the sibling case, and its header explicitly scopes head out as "common, usually harmless". I swept every | head under pipefail in bin/, bin/lib/ and .claude/hooks/ - around thirty sites - and that judgement holds everywhere else:

  • the large majority are head -1 on a sed/grep of a small file, where the writer cannot produce 64 KiB past the cut;
  • bin/todo-index.sh has || true, which swallows the 141;
  • bin/soak-test.sh could in principle truncate an autopsy dump, but sits inside a branch that exits 1 regardless, so only diagnostic text is at risk and the verdict is unchanged.

So the gate stays as it is - widening it to head would flag thirty safe sites to catch one - and the single site where it was not harmless now carries a comment saying exactly that, so the next reader does not "simplify" it back.

Good catch. Along with the RacerD self-test arm, that is two findings on this branch where a check reported success without doing its work, which is the thing the branch is about.

@astubbs astubbs left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

for the check that dont cause an error, do they at least get reported? and in the mvn build output if that's where they attach?
needs work

Comment thread docs/inflight/ci-build-hardening-register.md
Comment thread config/racerd-known-findings.txt
Comment thread config/spotbugs-exclude.xml
Comment thread r2.md Outdated
Comment thread .gitignore
astubbs added a commit that referenced this pull request Aug 25, 2026
… seeing nothing

#356 flagged that this work's framing - "no static analysis this repo runs can see the
torn-read class" - is measurably too strong. It is, and it is over-strong in exactly the way this
PR already caught itself being once.

WHAT WAS ACTUALLY MEASURED, AND WHAT WAS CLAIMED. The measurement was stock SpotBugs at
`effort=Max`, which was the only static analysis the repo ran that day, reporting nothing on any of
the four calibration targets - including the nine-line textbook probe. The claim generalised that
one configuration to the whole tool class. #356 turns fb-contrib on and measured its
`MUI_CONTAINSKEY_BEFORE_GET` naming `ShardManager.removeWorkFromShardFor` statically, in seconds,
with no harness: #345's seam, and one of the four targets. Verified here independently rather
than taken on report - that method is a literal `processingShards.containsKey(shardKey)` followed by
`processingShards.get(shardKey)` with the result dereferenced, nothing held across the pair, so the
detector has a real shape to match and the finding is credible on inspection.

So the honest width is three of four, not four of four. #346's seam is a stale-check rather
than `containsKey`-before-`get`, and the two value-divergence torn reads are not what a
check-then-act detector looks for. What survives unqualified is the claim that actually carries the
lane: the seam fb-contrib names is one somebody had already found by hand, whereas the defect
Lincheck turned up was on nobody's list.

WHY THE SAME SHAPE TWICE. This PR's own headline result is that the WorkManager hit rate is
machine-dependent - 2.33% per iteration here against 0.69% on Antony's machine, a likelihood-ratio
test rejecting equality at p = 0.011 - so no single-machine calibration transfers. A rate measured
on one machine is not the rate; a family one analyser cannot see is not a family no analyser can
see. Both are a sample of one generalised to a population, and the second slipped through while the
first was being corrected.

WHERE EACH EDIT LANDS. `docs/testing.md` owns the Lincheck lane and is durable reference, so the
corrected width is stated there in place - it would otherwise be flatly false on master the moment
#356 lands, and #356 `depends on` this PR, so this one lands first.
`docs/plans/` is a dated record whose claims may not be rewritten
(`docs/citations.md`), so the plan doc keeps its claim and gains a flag beside it naming
`docs/testing.md` as the owner of the corrected version.

ALSO FIXED: THE PLAN DOC CONTRADICTED ITSELF ON THE MACHINE QUESTION. Its interim correction
paragraph read the 2-misses-in-8 / 0-in-8 split as "the signature of a bound sitting on the edge
rather than of a difference between machines", and then instructed the reader to read two tables
through that conclusion - which the 48-run fit later in the same section refutes with the
likelihood-ratio test. A reader who stopped at the first complete-looking statement got the finding
backwards. Restated as what the split actually shows: ambiguous alone, and settled by the fit as
both a marginal bound and a real difference between machines. No measurement changed.

No test or assertion changed, and the bound stays at 1,000 - the slower machine's refinement remains
open and Antony's call (`docs/inflight/test-lincheck-lane-open-items.md`). Lincheck lane re-run on
this tree to confirm the master merge left it intact: all five classes selected, 8 tests, fresh
surefire reports, green - which for these harnesses means Lincheck still finds every seam.

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

The did-anything-run guard in `bin/lincheck-test.sh` asserted `selected -gt 0`. Zero is the loud
failure; a SHORT count is the quiet one. If three of the five harnesses stopped being selected - a
rename, a dropped `@Tag("lincheck")`, a changed surefire include pattern - the guard still passed and
the summary still printed a healthy-looking "Lincheck report files: 2". That is the same false green
the guard exists to catch, one step in.

So it now asserts the exact roster: `EXPECTED_LINCHECK_CLASSES=5`, skipped when `LINCHECK_TEST`
selects a single class, where a short count is the whole point. Adding a harness deliberately fails
until the number is updated. That friction IS the check - a harness the lane silently stopped running
is indistinguishable from one that never existed, so the alternative is a number nothing defends.

Suggested by the reviewer on #356 ("if it is cheap, an assertion that the lane selected
exactly five Lincheck classes would close the same hole from the other side"). It was cheap.

RED-PROVEN RATHER THAN OBSERVED PASSING, because a guard nobody has seen fail is decoration
(`docs/investigating.md`). Three arms, one variable each:

  expected=4, whole lane   -> exit 1, "Lincheck report files: 5, EXPECTED 4" + the roster message
  expected=5, whole lane   -> exit 0, 5 reports, 8 tests, all five classes named in the log
  LINCHECK_TEST=one class  -> exit 0, 1 report, exact check correctly skipped

Also records the class in its owner,
`docs/solutions/workflow-issues/a-check-that-reports-success-without-having-run.md`, rather than
starting a second home for it: a table row, plus a section 7 generalising what the original bug and
that doc's existing OSS Index cache trap have in common. **A guard reading a location it does not own
needs to establish provenance, not just presence** - point a structural did-it-run check at a shared,
persistent directory and it can no longer separate "this run produced nothing" from "a previous run
produced something", which are the exact two states it exists to separate. Nobody thinks of `target/`
as a cache, which is why this instance got past the same authors who had already written the cache
trap down.

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

Three review findings on #348, none of them touching the probe bodies, the
control arms or the module's deliberate unwiring.

THE ONE FACTUAL DEFECT. The note twice said `docs/refactoring.md` records the same "volatile for the
flags" fix on **two** sibling fields. Its `AT_STALE_THREAD_WRITE_OF_PRIMITIVE` entry lists **three**
- `AbstractParallelEoSStreamProcessor.lastWorkRequestWasFulfilled`, `ConsumerManager.commitRequested`
and `RetryQueue.closed` - and all three are still plain in the current tree, checked rather than
assumed. The count is externally verifiable and this note's whole job is to be a precise accounting
of what is open, so it is now three and they are named. Naming them also makes the entry usable: the
next person growing the module does not have to go and find which fields were meant.

THE UNWIRING COSTS STATIC ANALYSIS, NOT JUST CVE SCANNING. SpotBugs runs `-pl parallel-consumer-core
-am` today, so `jcstress-poc` is one of several unanalysed modules and nobody would remark on it.
#356 widens that to the whole reactor with `includeTests`; a module reached through neither
`<parent>` nor the root `<modules>` is outside the widened sweep as well, which leaves the probe
classes the only Java in the tree nothing analyses - and they are concurrency code. Recorded beside
the dependency-lane bullet it mirrors, so a later reader sees the exclusion was priced rather than
overlooked. The containment argument still wins; the module stays unwired.

THE POSITIVE-CONTROL ITEM NOW NAMES ITS MECHANICAL CLOSURE. "No check makes a vacuous run
distinguishable from a clean one" stated the gap without saying what would close it. The fix is to
assert a non-zero observation count rather than instruct a human to read the calibration - the same
instruction #356 reached from three unrelated instances of the class. An open item that names
its own remedy can be picked up; one that only names the hazard gets re-diagnosed.

@astubbs astubbs left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

lgtm

astubbs added a commit that referenced this pull request Aug 25, 2026
…thread, and defer @GuardedBy until a checker reads it

**`@GuardedBy` is not adopted here, deliberately.** It appears nowhere in this codebase and
`spotbugs-annotations` is not a declared dependency - only the SpotBugs plugin is. Adding
the annotation now means adding a dependency and writing assertions nothing verifies, on a
branch that is not the static-analysis change. #356 turns on RacerD,
which is the tool that actually CONSUMES `@GuardedBy`, and NullAway, which has an opinion on
the nullable `ThreadFacts` fields. Annotate after that lands. An unchecked annotation is a
claim with no enforcement - the shape this repo keeps finding and removing.

**What is worth stating now, because it is already load-bearing.** `ProgressProbe`'s fields
split three ways: safely published (volatile peaks and toggles, concurrent maps, the two
synchronized finding lists), sampler-thread-confined plain fields (`lastCount`,
`lastAdvance`, `rebalanceDwellStart`), and `samplerThread` itself.

The two seams this branch extracted - `recordRebalanceDwell` and `recordLagStagnation` - are
package-private and driven by broker-free tests from the MAIN thread. They are safe because
they touch only the first group and never the confined clock fields; the caller owns the
re-arm. **That is why those tests are legitimate rather than racy, and nothing said so.** Now
documented at both methods, with the constraint stated as a constraint: reaching for a plain
field inside a seam would silently turn its tests into a data race, and no current check would
notice.

That gap - a real invariant guarded only by prose - is the concrete reason to annotate later,
rather than a tidiness argument, and it is what the new note records so the follow-up is
mechanical instead of re-derived.

Three gate catches worth naming, since all three were real: `blind-spot` is a bug impact and
this is a task (`test-debt`); the note cites a rule registry that only exists once
#356 lands, so it carries a scoped `file-refs: N/A`; and its
reference to this PR needed the post-merge marker.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@astubbs
astubbs force-pushed the ci/static-analysis-expansion branch from ef027e0 to c6282ba Compare August 25, 2026 14:59
@astubbs

astubbs commented Aug 25, 2026

Copy link
Copy Markdown
Owner Author

@claude review this

Focus on bin/check-all.sh and bin/test-check-all.sh (commit f097df9). Everything else here has been reviewed already; the script is brand new and unreviewed.

It exists because the previous push failed check-branch-self-reference.sh in CI after a local sweep of seven gates chosen by hand. So it globs bin/test-*.sh then bin/check-*.sh instead of carrying a list. Please be hardest on these, roughly in this order:

  1. Can it report success while having swept less than it claims? That is the only failure mode that matters, because it is the exact defect the script was written to remove, one level up. Specifically: run_one captures rc from a command substitution under set -uo pipefail (note: no -e) - is there any path where a gate's real exit status is lost or masked? And does the glob genuinely fail closed if bin/ were empty or unreadable, rather than reporting "0 failed"?

  2. The exception list. Five scripts are excluded by name - four are PR-state reporters, one needs a maven-log argument. Every name is asserted to exist so a rename cannot silently shrink the sweep. Is that assertion actually sufficient? A script that is added and should have been excepted, or one that changes character (a tree gate that grows a required argument), still passes silently. Is there a better invariant available than "the names resolve"?

  3. The [[ " $LIST " == *" $n "* ]] membership test. It is substring matching on a space-padded string. I believe the padding makes a partial-name collision impossible, but I would rather be told I am wrong - a false positive there silently skips a real gate, which is failure mode 1 wearing a different hat.

  4. The self-test's honesty. Ten arms, fixtures in a throwaway bin/. The arm I care about is the one that deletes an excepted script and expects exit 2 - it is the guard on the guard. Are the arms actually independent, and does any of them pass for a reason other than the one named? An earlier arm in a sibling self-test on this branch passed because an empty PATH made it exit 127 on "bash: command not found", which is the shape I am asking about.

  5. --pr semantics. --pr opts the PR-state gates back in, but the needs-an-argument gate stays skipped regardless, and the self-test pins that. Is that distinction actually coherent, or should the two categories be handled the same way?

Secondary, much lower priority: bin/check-pr-analysis-surfaces.sh and its self-test (commit a0aef48) got one review round already, but a second pass on its diff-hunk parsing would be welcome - it decides which findings are "yours" versus "inherited" by parsing @@ headers, and getting that wrong in the lenient direction means it reports "none" over a defect the author just introduced.

Context for the rest of the PR: it is now 10 commits re-cut from 55, both dependencies (#347 and #348) have merged, and all seven earlier review threads are resolved. No need to re-review that ground.

@claude

claude Bot commented Aug 25, 2026 •

Copy link
Copy Markdown

Claude finished @astubbs's task in 8m 19s —— View job


Review complete

  • Read bin/check-all.sh and bin/test-check-all.sh in full
  • Q1: exit-status loss / masking under run_one; glob fail-closed behavior
  • Q2: exception-list invariant ("names resolve") - is it sufficient
  • Q3: [[ " $LIST " == *" $n "* ]] membership test - collision analysis
  • Q4: self-test arm independence
  • Q5: --pr semantics coherence
  • Secondary: second pass on bin/check-pr-analysis-surfaces.sh diff-hunk parsing
  • Post findings

One limitation up front: this session's sandbox refused every bash <script> invocation (even bash bin/check-all.sh --help) with "this command requires approval," and no interactive approver is available in this review flow, so I could not execute the fixtures myself. Everything below is traced by reading, not run - flagged per-item where that matters.


1. Exit-status handling - one real gap, everything else is sound

out="$(PR_NUMBER="${PR_NUMBER:-}" bash "$script" 2>&1)" followed by rc=$? on the next line (bin/check-all.sh:89-90) is not the classic local out=$(cmd) bug - out was already declared local on a separate line, so this is a bare assignment and $? survives correctly. And the glob genuinely fails closed: with no matches, bin/check-*.sh/bin/test-*.sh stay as the literal unexpanded pattern, [ -f "$g" ] || continue skips it, ran stays 0, and [ "$ran" -eq 0 ] exits 2 with "NOTHING RAN" (check-all.sh:118-119, 137-139). That holds whether bin/ is empty or unreadable - an unreadable directory also just yields no glob matches. Confirmed by reading; I could not execute it to be certain no bash version quirk changes this.

The real gap: run_one's case statement (check-all.sh:93-102) cannot tell "the gate intentionally reported it can't run" from "bash itself refused to parse the gate." A shell script with a syntax error - the concrete case is an unresolved merge-conflict marker left in a check-*.sh file - makes bash "$script" exit 2 from bash's own parser, before a single line of the gate's logic runs. run_one buckets any exit-2 as cannot ("CANNOT RUN... usually a missing tool or credential"), which is explicitly excluded from fail and therefore never fails the overall sweep. A genuinely broken, unparseable gate reads exactly like a gate that legitimately couldn't run - the collision is not hypothetical, it's the same "exit 2 means cannot-run" convention this whole PR establishes for bin/ci-mutation-test.sh and bin/racerd-test.sh, applied here to a code path bash itself can also emit for an unrelated reason. This is the exact defect class the script exists to prevent, one layer up: a broken gate reports the same "not a pass, but not a failure either" as a healthy gate that happened to lack a credential.

test-check-all.sh's only red arms use a syntactically valid script that calls exit 1/exit 2/exit 3 (make_fixture, line 38) - there's no arm with an actually malformed script, so this collision is untested.

Suggested fix: bash -n "$script" before executing for real; if that fails, record it as FAIL with the parse error, never letting it reach the cannot bucket. Add a red arm to test-check-all.sh with a fixture gate containing invalid syntax (e.g. if true with no fi), asserting FAILED/exit 1, not CANNOT RUN/exit 0.

Fix this →

2. The exception list - "the names resolve" catches rot in one direction only

The assertion (check-all.sh:71-81) only proves the five named scripts still exist. It does not prove the reason attached to each is still true - reason_for() (line 60-69) is prose nobody re-verifies. Concretely: if check-ossindex-audit.sh were later changed to no longer require a maven-log argument, it would stay in NEEDS_ARGS and stay silently skipped forever - exactly "checking less than it claims," just via staleness rather than deletion. The existence check can't see that.

The mirror-image gap is the opposite direction: a new check-*.sh script that is itself a PR-state reporter but never gets added to PR_SCOPED isn't caught by anything - it just runs as an ordinary tree gate. That's not silent under-checking, it's the noisier failure mode the header explicitly wants to avoid (false failures during a plain pre-push sweep, which is how a check trains people to stop reading its output) - worth naming since it's the same class of drift from the other side.

A stronger invariant than "the name resolves": have each excepted script assert its own excuse where practical - check-ossindex-audit.sh failing loudly when invoked with zero arguments (rather than silently "working" on nothing) would make the NEEDS_ARGS classification self-verifying rather than asserted-once-and-trusted. For the PR-state reporters, a lighter version: grep each for PR_NUMBER/gh pr usage as a second, independent signal that corroborates the hand-written reason.

3. The membership test - you're right, no collision

[[ " $PR_SCOPED " == *" $n "* ]] (check-all.sh:122, 127) is sound. Verified ls bin/check-*.sh bin/test-*.sh | cat -A - none of the 39 current filenames contain a space, so the space-padding on both the haystack and the needle prevents any prefix/suffix collision (e.g. a hypothetical check-pr.sh can't match inside check-pr-ready.sh, because the padded needle requires the whole token flanked by spaces). One thing beyond what you asked: $n is quoted inside the pattern (*" $n "*), so even a filename containing glob metacharacters would be matched literally rather than as a sub-pattern - already correctly defensive, not just lucky.

4. Self-test honesty - the named arm is genuine; one blind spot

Traced each arm against check-all.sh's actual control flow rather than trusting the assertion text:

  • The exception-list-rot arm (test-check-all.sh:83-89) deletes check-review-posted.sh and asserts exit 2 + both message substrings. The assertion loop runs unconditionally before mode dispatch, so --gates-only doesn't matter here - confirmed this isn't accidentally testing something else. The message text it matches ("the exception list names script(s) that do not exist:" + the filename) is specific enough that a coincidental match from an unrelated failure is implausible - unlike the RacerD self-test's PATH-emptying shape, nothing here manipulates the environment in a way that could produce a same-shaped-but-wrong failure.
  • The cannot/nothing arms (test-check-all.sh:71-78) correctly assert rc=0 for the runner's own exit code even though the fixture gate exits 2/3 - matching the design that cannot-run/nothing-in-scope don't fail the sweep. Each fixture is a fresh mktemp -d, cleaned up per-arm, so no cross-arm bleed.
  • Genuine gap: every arm passes --gates-only, so the self-tests-loop branch of check-all.sh (MODE=all/MODE=tests, the for t in bin/test-*.sh loop) is never exercised by test-check-all.sh itself - only the structurally similar but separate gates-loop is. The two loops share the same fail-closed idiom, so the risk is low, but the "self-tests run before gates" ordering claim in the header and in bin/AGENTS.md has no arm proving it.

5. --pr semantics - coherent, and the self-test pins the right thing

Keeping NEEDS_ARGS excluded regardless of --pr is the right call, not just a distinction for its own sake: --pr widens scope (which gates are relevant given the current context), while check-ossindex-audit.sh is excluded because check-all.sh has no value to supply for its required argument. Folding it into --pr would force a choice between inventing a placeholder argument (producing a verdict from garbage input - the exact "measures nothing, reports success" failure this PR is about) or having it exit 2 on a missing argument every time --pr is used (polluting the cannot bucket with a permanent, uninteresting entry). Leaving it a separate, always-skipped category is correct. test-check-all.sh:100-106 pins both halves (--pr opts the four PR-scoped gates in, the fifth stays skipped) with a single fixture, which is the right level of coverage for this.


Secondary: bin/check-pr-analysis-surfaces.sh diff-hunk parsing - two findings, both lean toward the risky "reports none" direction

The line-number bookkeeping itself (check-pr-analysis-surfaces.sh:128-154) is correct: +++ b/ tracks the current file, @@ -a,b +c,d @@ (via re.match, so trailing hunk context like a method signature doesn't break it) resets the running line counter, and -/context lines advance it exactly per unified-diff semantics. I checked whether stray diff-header lines (--- a/file, diff --git ..., index ...) could be misread through the bare raw.startswith('-')/(' ') branches when cur is stale between files - they can't, because those branches are no-ops (pass, or a newno increment that only fires after cur is set), so a header line landing there does nothing. No bug there.

Two real gaps, both false-negative shaped (matches what you asked about):

  1. Multi-line findings are classified on start_line alone (check-pr-analysis-surfaces.sh:172, 199-201). GitHub check-run annotations carry both start_line and end_line; this script reads only the former. A finding whose start_line sits on an untouched context line but whose end_line extends into a line the PR actually added would be bucketed as inherited and never trip exit 1, even though the PR is the proximate cause. SpotBugs/fb-contrib findings that span a method or block (rather than a single line) are exactly this shape.
  2. Silent truncation at 500 annotations per check run. The pagination loop (check-pr-analysis-surfaces.sh:107-120) hard-stops after 5 pages of 100, with no message when page 5 is reached still full. Given this PR's own numbers - 601 findings unfiltered across the reactor, 278 after the exclude filter - a single check run's annotation count is already in the range where this cap could bite, and nothing here would tell you it did; the script would just report fewer findings than exist, silently.

Fix this →


Not spent on: the rest of the PR per your note that seven earlier review threads are resolved and both dependencies have merged.

astubbs and others added 6 commits August 26, 2026 03:32
…ds themselves

No linter ran over `bin/` or `.claude/hooks/` at all, in a repo whose gates are
shell and whose recurring defect is a script reporting success without having
run. `shell: lint` gates at `error` only; the severities below it are tiered in
docs/inflight/static-shell-lint-severity-tiers.md with what turns each on.

Two real defects in the guards, both found by the lane on its first run:

`bin/check-shell-sigpipe.sh` opened a prose comment with the word `shellcheck`,
so it parsed as a DIRECTIVE, errored, and aborted analysis of the rest of that
file - a sentence about the linter silently switched the linter off, inside the
script whose whole job is guarding against silent failure. The warning count rose
from 10 to 14 once that file was actually analysed.

The same guard then rejected a line that already used the herestring it
prescribes: `[ -z "$w" ] || grep -qF "$w" <<<"$out"` is a logical OR, but the
regex read the second `|` of `||` as a pipe. A guard that fires on its own
recommended fix is worse than no guard, since the only way to satisfy it is to
rewrite correct code. Anchored with `(^|[^|])`, and pinned in both directions -
the OR-plus-herestring must pass, and a real pipe with an `||` earlier on the
line must still fail.

`bin/check-quarantine-registry.sh` gets the brace quoting the lane asked for.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GyqWU2v4hy7NGoxdrfqb74
…ed the wrong thing

Across the last 40 `maven.yml` pull_request runs the lane reported success 40
times and scored ZERO mutants 40 times. Each skip was individually correct - 23
had no core main-source change, 14 were outside the decidable packages - but
"correct skip", "stale scope that can never match again" and "185 mutants killed"
were all the same green tick.

The exit code is now the verdict, four states, none sharing a code: 0 scored, 2
CANNOT RUN, 3 nothing in scope, and PIT's own status passed through.

**The verdict also counted the wrong number.** `>> Generated 42 mutations` says
PIT created 42 mutants, not that any were scored - so a run whose minions all die
returns MEMORY_ERROR for every one, generates plenty, measures nothing, and
passed. Not hypothetical: the plan that scoped this lane recorded `state.*`
hanging with minions dying. The verdict now reads mutations.xml and gates on
mutants EVALUATED, treating a missing report as a broken lane rather than a clean
one. Control arm: with the verdict back on the generated count, exactly the three
new red arms flip, and they flip to 0.

A `head -50` truncating the survivor table could also kill the run before the
verdict: under `pipefail`, once the unread remainder passes the 64 KiB pipe
buffer, printf takes SIGPIPE and 141 becomes the script's status. awk now caps at
NR 50 and consumes its whole input. Swept every `| head` under pipefail in the
tree - this was the only one where it was not harmless.

20 self-test arms, each red control paired with a green near-miss.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GyqWU2v4hy7NGoxdrfqb74
…an a count

The tool was recorded as blocked and never run: Infer's Maven integration builds
under a JDK of its own choosing and this project needs 17. Capturing javac
directly sidesteps the wrapper, established with a two-arm control - the exact
command Infer runs succeeds standalone at JDK 17, and Infer's captured Maven
output carries JDK 24+ warnings the JDK 17 run does not emit.

It finds 13 thread-safety findings, including `lastCommitTime` which was on
nobody's list. The verdict on the calibration is negative and recorded as such:
RacerD does NOT refind the four named torn-read races, because those are
check-then-act and two-read divergence while RacerD models unguarded access.

**The ratchet compares identities, not a count.** A ceiling of 13 cannot tell a
fixed race from a race swapped for a different one - the total is 13 either way -
which an independent review caught. It fails in both directions: a new identity
means a race was introduced, and one that stopped firing means somebody fixed a
race without ratcheting, which is how a set quietly stops meaning anything.
Both `comm` inputs are `LC_ALL=C sort`ed, because Python's tuple order and the
shell's lexical order disagree and the first version reported known findings as
new.

Four ratchet arms, driven through a new `RACERD_DRY_RUN_REPORT` seam so they need
no toolchain. The decisive one is the same-count swap: regress the ratchet to a
ceiling and exactly that arm flips, to 0.

The JDK near-miss arm resolves `RACERD_JDK`, then `JAVA_HOME`, then the SDKMAN
path, and fails closed under `CI` - it previously looked only for a developer's
own SDKMAN install, printed `skip` on a hosted runner, and incremented neither
counter, so the one arm proving the JDK guard does not misfire had never run.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GyqWU2v4hy7NGoxdrfqb74
Both exist for the same reason and were both written after this branch proved the
need on itself: knowing a check exists is not the same as running it, and knowing
a tool reported something is not the same as reading it.

**`bin/check-pr-analysis-surfaces.sh [PR]` - read the analysis on your own PR.**
The tools here report to five places that are not each other: the Maven console,
check annotations, sticky PR comments, job summaries, and files under `target/`.
Checking all five by hand is a scavenger hunt, so it does not happen, and a
finding nobody read is indistinguishable from one that does not exist. This work
is the proof - it switched on `-Xlint:all` and SpotBugs-over-test-code, both
fired on files it was editing, including on the exact line it had just rewritten
to satisfy a DIFFERENT detector, and nobody looked. A human found them scrolling
Files Changed.

Two things make it usable rather than another wall of output. It splits by DIFF
LINE, not by file: a PR adding one helper to an 1800-line class inherits every
finding in it, so only findings on lines the diff wrote set the exit code and the
rest print as inherited context. And it de-duplicates across jobs, because
`setup-java` registers javac's problem matcher so every compiling job annotates
the same warning - one deprecation reported by eight jobs is one finding, with
all eight named.

**`bin/check-all.sh` - run every gate, discovered rather than remembered.** A push
on this branch failed `check-branch-self-reference.sh` in CI after a local sweep
of seven gates chosen by hand. The gate was not new, not subtle, and not broken;
it was not on somebody's list. There are eighteen `check-*.sh` and twenty-two
`test-*.sh` in `bin/`, so this globs both sets and a gate added tomorrow is swept
with no edit anywhere. That is the whole design, which is why the discovery loop
must stay a glob rather than becoming the array it keeps wanting to be.

Its exception list is the one hand-maintained thing left, and it is guarded: five
scripts are not tree gates - four report PULL REQUEST state, one needs a maven-log
argument - so they are skipped by default and run under `--pr`, and every name in
the list is asserted to exist. Rename one and the runner exits 2 rather than
quietly sweeping one gate fewer than it claims.

**Neither counts a skip as a pass**, which is the rule this repo keeps relearning.
Both exit 2 for "cannot run", and `check-all` gives exit 2 and exit 3 their own
columns outside the pass count - a runner that laundered "could not measure" into
"measured and found nothing" would be the defect it exists to catch, one level up.

Both are `gh`-reads-only, which is what keeps the `check-` prefix honest under
bin/AGENTS.md: the prefix grants them to the review agent by pattern, and the
reviewer is exactly who should be running them.

Twenty-three self-test arms between them, fixtures in throwaway directories so the
real repository cannot make an arm pass by accident. The pairs are the point - the
same finding inside and outside the diff must land in different sections, and
deleting an excepted script must make the sweep refuse. One arm in this family
first passed for the wrong reason, an empty `PATH` exiting 127 on "bash: command
not found", and now keeps a shell on PATH so it tests what it claims.

**What an independent review then found in them, and what it got wrong.**

A gate bash cannot PARSE exits 2, the same code as "cannot run", so an unparseable
gate landed in the skip bucket. The review called that "never fails the sweep",
which is too strong: measured, `check-shell-lint.sh` runs ShellCheck over all of
`bin/` at severity=error and an unterminated `if` is SC1072/SC1073, so the sweep
normally goes red via the linter. The residual hole is narrower and real - with
ShellCheck absent the linter itself exits 2, both skips agree, and the sweep
reports zero failures. `bash -n` now runs first, and a parse failure is a FAIL that
names the broken gate rather than a skip that excuses it.

The exception list's assertion caught rot in one direction only. Existence proves
a rename did not happen and says nothing about a script whose recorded REASON
expired - one that stopped needing an argument would sit skipped forever. Each
reason is now corroborated by an independent signal in the script itself: the
PR-scoped four must actually call `gh`, the needs-args one must actually print a
usage line.

`check-pr-analysis-surfaces.sh` classified findings on `start_line` alone, but
annotations carry an `end_line` and a SpotBugs finding spanning a method can start
on an untouched line while ending inside one the PR added - misfiled as inherited,
a false negative in the direction that matters. Any overlap now counts as yours.
It also hard-stopped after five pages of annotations in silence; past 500 it says
so, because "no findings on your diff" quietly meaning "none in the first 500" is
the false-clean it exists to prevent.

Two findings were checked and deliberately not acted on. The
`[[ " $LIST " == *" $n "* ]]` membership test is sound - the space padding makes a
partial-name collision impossible, and `$n` is quoted so a filename carrying glob
metacharacters matches literally. And `--pr` keeping the needs-args gate skipped is
coherent rather than arbitrary: `--pr` widens scope, while that script is excluded
because the runner has no value to supply for its argument, and inventing one would
be the measure-nothing-report-success failure this branch is about.

The review also found the gap in the tests themselves - every arm passed
`--gates-only`, so the self-tests loop and the documented "self-tests run before
gates" ordering had no coverage at all. 10 arms to 16.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GyqWU2v4hy7NGoxdrfqb74
…d register what stays off

SpotBugs analysed one module of five, main code only, with stock detectors. There
was no `<compilerArgs>` block in this build at all, so javac's own analysis was
entirely off. Neither Error Prone nor forbidden-apis existed.

Now: SpotBugs over the whole reactor including test code, with fb-contrib,
find-sec-bugs and findbugs-slf4j; Error Prone 2.42.0 with NullAway 0.12.7;
`-Xlint:all` without `-Werror`; forbidden-apis on `jdk-unsafe`; and the
enforcer's `requireUpperBoundDeps`.

**Error Prone is pinned below the JDK 17 line and cannot simply be bumped.**
2.43.0 is the first release compiled at class file 65, JDK 17 reads to 61, and
Jabel's Byte Buddy refuses Java 21 - the two constraints are mutually exclusive,
so the pin is a floor and a ceiling at once.

**Suppression is a checked-in rule filter, not a regenerated baseline.** The
baseline job rewrote an exclude filter on every push to master keyed on class,
method and bug type, recording nothing about what it swallowed, so anything not
triaged inside one PR window was absorbed permanently. Every entry in
config/spotbugs-exclude.xml has a row in the registry with a reason and a
re-enable trigger. Coarser on purpose: an off rule is visible in a diff and the
off-count only goes down.

**Two thirds of the -Xlint channel was the Truth generator's own output** - 559
of 843 warnings, 535 of them `rawtypes` on generated `List` parameters. javac
cannot scope a warning by path, so `rawtypes` is off for TEST compilation only:
main keeps every category, which is where the 58 real warnings are. 843 to 266,
predicted before running and confirmed after, and verified through
`help:effective-pom` rather than a green build - the check that caught the first
`-Xlint` attempt landing in a profile CI never activates.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GyqWU2v4hy7NGoxdrfqb74
Adds `static: spotbugs` over the whole reactor, `static: racerd` on
ubuntu-latest, and wires the new self-tests into Repo Hygiene. Deletes the
`spotbugs-baseline` job the rule filter replaces.

**SpotBugs runs `spotbugs:check -Dspotbugs.failOnError=false` as well as
`spotbugs:spotbugs`, and the second goal is the reporting half.**
`spotbugs:spotbugs` writes the XML and prints not one finding - the log says
"Skipping ... report goal" and stops - so every bit of reporting was GitHub-side
and a local build was silent over hundreds of findings. `check` prints each
finding WITH its rule name, which is the token needed to tier it, and
`failOnError=false` keeps the lane advisory.

**The Infer archive is verified against a pinned SHA-256 on every run, cache hits
included.** The cache is the mutable half: a fresh download arrives over TLS from
a pinned release URL, a restored one arrives from a writable store keyed by a
string. Verifying only the fresh copy would check the safer half and unpack the
other unexamined.

`setup-java` is pinned on the RacerD preflight self-test step, because that
self-test now fails closed without a JDK rather than skipping.

test-compile, not compile: the pom sets `includeTests`, and `target/test-classes`
has to exist for that to mean anything. Whole reactor rather than
`-pl parallel-consumer-core -am`, since `-am` adds only the parent pom and left
vertx, reactor, mutiny and the examples unanalysed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GyqWU2v4hy7NGoxdrfqb74
astubbs and others added 2 commits August 26, 2026 03:32
…sis found

**`@SuppressWarnings("BanJNDI")` sat on three method bodies, one of them fifty
lines.** A suppression is a claim about one call; at method scope it also excuses
every JNDI lookup a later edit drops into that body. Both classes now carry a
private helper whose entire body is the call being excused. The two are
deliberately NOT shared: they log different messages under different logger
names, and that text is what an operator greps for when a container executor was
not picked up. Verified by mutation - removing one annotation fails the compile
with [BanJNDI] - because otherwise "it compiles" would equally describe Error
Prone not running.

`PCMetricsDef` used default-locale `toUpperCase`/`format`, so generated
DOCUMENTATION differed by the author's locale. Fixed with `Locale.ROOT` - and
then fb-contrib flagged `s.replace("_", " ")` on that same line, both arguments
length-1 Strings where `replace(char, char)` exists. Satisfying one detector on a
line while leaving another's finding on it is worse than not touching the line,
because the diff then reads as reviewed. Swept the class: one such site in main
code tree-wide.

The metrics example's Prometheus endpoint called `response.getBytes()` twice -
once for Content-Length, once for the body - in the platform default charset. Two
encodings of one string that disagree the moment a tag is non-ASCII.

`ReactorTest` called `new Thread(...).run()`, which runs on the calling thread.
fb-contrib and Error Prone found it independently, disagreeing with a human audit
that had ruled it a defensible scratchpad.

An ArchUnit rule pins that the shard map is never replaced. The nested AGENTS.md
makes `@GuardedBy` a policy that arrives with the file rather than a backlog
entry; its CLAUDE.md bridge needs the `.gitignore` negation, without which it is
silently never committed - which happened once already here.

`LincheckToolchainProbeTest`'s javadoc said SpotBugs sees nothing on its shape.
True of the STOCK detectors; with fb-contrib it is named in seconds, on that very
probe. Narrowed rather than deleted, since the probe is still the right red
control for Lincheck.

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

Every rule switched off is listed with a reason and a re-enable trigger, per
engine, each with a ranked "turn these on next" so the backlog is a work order
rather than a list. Plus the two-profile design - full rules on new code, a small
enforced set on all of it - which is classified here and deliberately wired in a
later PR.

**Notes are injected as current state, so a stale one misroutes the next agent
rather than merely being wrong.** Corrected here, all found during this work:

- the `-Xlint` inventory said "172 warnings, all in test code or against
  deprecated third-party API". Both halves wrong: 58 are main code and our own
  API. A headline count also means nothing without saying whether generated
  sources are in it - the same tree is 843 or 284 on that one decision - so the
  old figure was unfalsifiable rather than merely stale.
- the SpotBugs baseline described in the present tense after its deletion.
- `RFI_SET_ACCESSIBLE`'s "two sites", which is 12 calls across 5 files.
- a coverage note whose every claim this work falsified - retired per
  docs/inflight/AGENTS.md rather than rewritten into a DONE narrative, with the
  one genuinely open question kept as its own note.
- the build-hardening register, extracted here off an encoder-race PR, ends with
  all thirteen entries struck and is cut from 252 lines to 64. Three inbound
  citations naming a specific entry are repointed at the notes that now own the
  subject: a citation whose file resolves but whose anchor does not is exactly
  what the cite-by-anchor rule exists to prevent, and no gate checks it.

- the jcstress containment note, which recorded in the FUTURE tense that this PR would make
  `jcstress-poc` the only Java in the tree nothing analyses. Written at the request made on
  #348 while this was still open; merging master brought both halves together, so it now
  describes as pending a state that exists. Resolved, and given the follow-on it lacked: if those
  probes ever want analysis, scope a SpotBugs invocation at that module rather than pulling it into
  the reactor, since joining the reactor is what the containment exists to prevent.

Also: `@SneakyThrows` blinding SpotBugs dataflow now has a home rather than being
a row in a rule registry, with 21 main-code sites counted and the cheapest
experiment written down; a polyglot survey for the ten non-Java clients, whose
headline is that CodeQL already supports nine of them and the Go client's gating
test command has no `-race`; and three solution write-ups for the defect class
this work kept hitting.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GyqWU2v4hy7NGoxdrfqb74
@astubbs
astubbs force-pushed the ci/static-analysis-expansion branch from f097df9 to 147067e Compare August 25, 2026 15:34
@astubbs
astubbs merged commit f9e860f into master Aug 25, 2026
35 of 38 checks passed
@astubbs
astubbs deleted the ci/static-analysis-expansion branch August 25, 2026 15:41
astubbs added a commit that referenced this pull request Aug 25, 2026
Brings in the static-analysis lanes (#356 work): ShellCheck gate,
-Xlint:all, SpotBugs-over-tests, the RacerD/PIT lane fixes, and the two
pre-review commands bin/check-all.sh and bin/check-pr-analysis-surfaces.sh.
docs/agent-harness.md merged cleanly on both sides' edits. Gates re-run
after the merge per the inherited instruction: bin/check-all.sh.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019HwDcZdfv1Ne4u3g6ThrG9
astubbs added a commit that referenced this pull request Aug 25, 2026
…on is test-scope only

The engine's new AGENTS.md rule, inherited from #356, says to write
`@GuardedBy` in the same change that fixes a race, and that "no separate project is needed".
Followed literally in `parallel-consumer-core/src/main/java`, that does not compile.

Measured rather than inferred: a throwaway annotated field in `internal/` fails with

    error: package com.google.errorprone.annotations.concurrent does not exist

`error_prone_annotations` resolves at TEST scope only - it arrives transitively and nothing
declares it - so Error Prone's GuardedBy CHECK runs on main code while the ANNOTATION is
unresolvable there. The failure message names the import, not the scope, so it reads as
"Error Prone is not set up" when the analysis is in fact wired correctly. `jcip-annotations`
is present and also test-scope; `jsr305` is absent entirely, so all three spellings Error
Prone accepts are equally unavailable.

Two changes, both small:

- The engine rule now states the prerequisite where an agent meets it, and routes to the note
  for the options. Left as a pom change to make deliberately rather than folded in here: a
  published library's compile-scope dependencies are not a chaos-suite PR's call, and
  `provided` scope is probably the right answer given @GuardedBy's CLASS retention.
- The note is rewritten against the real blocker and renamed. Its old premise - wait for #356,
  because RacerD must land before the annotations mean anything - died when #356 merged, and
  its claim that `spotbugs-annotations` was the missing dependency was wrong. The old name also
  carried state ("once-racerd-lands"), which `docs/inflight/AGENTS.md` forbids. Nothing cited
  it, so the rename is free.

The note also now records what the rule's own carve-out settles for this branch:
`ConsumerOffsetCommitter.owningThread` is `volatile`, which is publication rather than locking,
so there is no lock to name and no annotation to write for it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Uu5CHkQG4aFeyMHQu1jQ7M
astubbs added a commit that referenced this pull request Aug 25, 2026
…and record where it is inert

The engine's AGENTS.md tells you to write `@GuardedBy` with the fix. Until now doing that in
`src/main/java` failed to compile: `error_prone_annotations` resolved only in test scope, so the
CHECK ran on main code while the ANNOTATION was unresolvable there, and the failure named the
import rather than the scope - which reads as "Error Prone is not set up" when the analysis was
wired correctly all along.

Declared at `provided` scope: @GuardedBy is CLASS-retention, so javac needs it, nothing reads it
at runtime, and consumers of this library do not inherit it. Verified with a control probe - an
unguarded read of a monitor-guarded field now fails the build at ERROR, naming both the lock and
the access, while the correctly-guarded read compiles silently.

Testing it turned up something worth more than the dependency. On a ReadWriteLock the annotation
is not merely awkward, it is WRONG BOTH WAYS, and the spelling a reasonable person reaches for
first is the one that reads as a passing check:

  @GuardedBy("rwLock")             accepted, then NOT ANALYSED - reports nothing
  @GuardedBy("rwLock.readLock()")  fires, but also on every legitimate write-lock-held access

@GuardedBy carries one lock expression and a ReadWriteLock is two, so it cannot express "read
under the read lock, write under the write lock" at all. Annotating `RetryQueue` with the first
spelling compiled clean while `size()` read the map under no lock whatsoever - a claim with no
enforcement, which is the shape this repo keeps finding and removing. The engine rule now says
not to annotate ReadWriteLock-guarded state and names the two classes it applies to here.

Run once with the enforcing spelling, `RetryQueue` produced four distinct verdicts, separated in
the note rather than reported as a count: two real-but-dead (`size()`/`isEmpty()` have no callers
anywhere), one real and live (`removeAll` reads `unique.isEmpty()` before taking the write lock),
and two false positives from the ReadWriteLock modelling. The live one is independently
corroborated - static-racerd-findings.md already records `this.unique` read via
`Map.size()`/`isEmpty()` racing with writes, from a different engine entirely.

Assessed P2 and deliberately not fixed here; the reasoning both ways, and why a chaos-suite branch
is the wrong place to review a ShardManager concurrency change, is in the note.

The note this replaces claimed the missing dependency was `spotbugs-annotations` and said to wait
for #356 before annotating anything. Both were wrong: #356 had already
merged, and the missing artifact was Error Prone's own. Renamed off the old state-carrying name.

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

Found by running `bin/check-all.sh` between merging master and committing that merge - which is a
normal thing to do, and is exactly when the arm is wrong.

The merge base is still the OLD one until the merge commit exists, so every file master added since
it reads as a line this branch added, and the arm demands an attestation on notes this branch has
never seen. It fired on two of #356's registries that way. Committing the merge makes
`git merge-base HEAD origin/master` the merged tip and the accusations vanish - verified on both
sides of the commit.

Recorded rather than fixed, because the behaviour is correct for the definition the arm uses, and the
alternative - diffing against the merge base as it will be AFTER the merge - cannot be computed
before that merge exists. The header now says what to do instead: finish the merge, never mark
somebody else's note.
astubbs added a commit that referenced this pull request Aug 26, 2026
…sk the wrong repository (#364)

A hook that could not look up a PR said "No PR was found for this branch". Three
unrelated situations produced that one sentence and the operator could not tell
them apart: the branch really has no PR; the lookup FAILED; or the lookup asked
the WRONG REPOSITORY. `2>/dev/null || true` discarded both the error and the exit
status, so absence and failure were the same value.

The third cause is specific to this fork and the most damaging. None of these
calls carried `-R`, and `gh` prefers `upstream` unless `remote.origin.gh-resolved`
is set - a local, uncommitted config, so CI runners and fresh agent sandboxes all
start without it. AGENTS.md has a section on exactly this, and calls the silent
wrong-repo success the case that hurts.

Not hypothetical: hit twice in one session on #356, from
two different causes, both times asserting "nothing could be measured" without
saying why.

Each lookup now derives the repository slug from `origin`, runs bounded, and
reports which of four states it is in: found; measured absence; failed, quoting
what `gh` actually said; or did not run because the slug could not be derived - in
which case `gh` is deliberately NOT called rather than called unqualified. Every
guard stays fail-closed. This changes the message, never the verdict.

The same defect is fixed in `remind-inflight-on-push.sh`, where it was
live-dangerous - an upstream PR number would have matched this repo's
`docs/inflight/pr-<n>-*.md` and quoted an unrelated note - and in
`check-merge-outstanding-work.sh`, which keeps its deliberate fail-open and merely
stops being fail-SILENT. A class sweep found a fourth instance in
`bin/check-pr-ready.sh`, which could report a stranger's PR as this branch's.

Checked and ruled out: `check-branch-self-reference.sh` and
`check-pr-analysis-surfaces.sh` already qualify every call;
`check-squash-subject.sh`, `pre-commit-gate.sh`, `inject-merge-checklist.sh` and
`inject-recorded-knowledge.sh` make no `gh` calls at all.

A simplification pass then found the branch's own defect one level down. The
lookup contracts to answer found/failed/none, but two hooks dispatched on only the
first two, so an EMPTY answer - interpreter killed, or a `BaseException` their
`except Exception` cannot catch - matched neither test and fell through to
silence, exactly where "none" falls through. `check-history-rewrite.sh` already
carried the backstop the other two lacked. Both now route an unrecognised answer
to their existing advisory. It also overlapped two independent `gh` calls that had
been waiting on each other: measured 1.85s concurrent against 2.34s sequential,
non-overlapping across three runs, the gap equal to one round trip.

The lookup is now written four times, and the reasoning is narrower than "avoid
shared helpers". #341 draws the line at guards versus gates: "Guards are
inlined; gates share through `bin/lib/`", because sourcing a helper adds a failure
mode where the helper cannot be found, and a guard that cannot load its dependency
fails OPEN - four repeated lines beat a new way to pass silently.

#357 landed `.claude/hooks/lib/hook-common.sh` while this
branch was open, and drew that line in code rather than in prose, which moves it.
Its two non-blocking reminders source the library behind `[ -r "$hook_lib" ] || exit
0` - fail-open, and harmless for something that only advises - while every hook that
actually refuses a tool call still inlines. The split is therefore refusing-guard
against advisory-reminder, not hook against gate, and all of these are `PreToolUse`,
so the event type does not tell you which is which. Two of the four copies are free
to move on that basis: `remind-inflight-on-push.sh`, which is advisory and already
sources that library, and `bin/check-pr-ready.sh`, a gate where a load failure is
visible rather than silently permissive. The two refusing guards stay inlined unless
someone deliberately changes their failure mode with a fail-closed loader.
`docs/inflight/ci-pr-lookup-is-copied-into-three-hooks.md` records that, along with
the reason `bin/check-quarantine-owners.sh`'s older slug derivation must not be
copied: it predates the `file://` fix and would ask GitHub about a repository that
does not exist, reintroducing the very class this closes.

The pattern was adopted from #350 rather than invented -
origin-derived slug, bounded in python3 rather than GNU-only `timeout(1)`, no
swallowing. One departure: these use `gh pr list --head`, which exits 0 printing
nothing when there is no PR, so absence is read off the exit status and #350's
stderr regex is unnecessary.

An independent review raised three defects, all fixed, and overstated a fourth.
It said an unparseable gate "never fails the sweep"; measured, `check-shell-lint.sh`
runs ShellCheck over all of `bin/` at severity=error and an unterminated `if` is
SC1072/SC1073, so the sweep normally does go red. The residual hole is narrower
and real - with ShellCheck absent the linter itself exits 2, both skips agree, and
the sweep reports zero failures - so `bash -n` now runs first and a parse failure
is a FAIL naming the broken gate. The code carries the measured claim, not the
review's.

A second review then found the branch's remaining gap, and it was this same subject
one level further out: `bin/check-pr-ready.sh` received the fix above and shipped
with no behavioural coverage at all. Its self-test had eight cases and every one
grepped the script's own source text, so they passed identically before and after a
behavioural change - nothing exercised the new failure messaging, nothing checked
that `-R` reached the `gh` argv, nothing proved `PR_READY_REPO` overrode anything.
`bin/AGENTS.md` states the bar that missed: a regression test that has never failed
proves nothing. Twelve cases now run the script against a stubbed `gh` that records
its own argv, each in a throwaway repository on a named branch. Restoring master's
pre-fix script fails 10 of them; the 2 that survive are invariants, so they are
controls rather than coverage.

The new self-test arms come in pairs, and the pairs are the point: only the arms
that CAN flip are red controls, the rest are fail-open invariants that must pass
either way by construction. Proven red against the pre-fix hooks rather than
merely passing - restore the three hooks from master with the new arms in place
and 12 fail, the 10 that pass being the invariants.

Those figures are re-measured against this branch's final state after merging
master; an earlier draft of this message carried numbers that had drifted from an
earlier shape of the branch, which is this change's own subject turning up in its
own commit message.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Sep 1, 2026
… at it

Found by bin/check-pr-analysis-surfaces.sh, not by the review: SpotBugs
(fb-contrib HES_EXECUTOR_OVERWRITTEN_WITHOUT_SHUTDOWN) fires on the
foreignThread assignment in this fixture's @beforeeach, and it fires on a line
this branch wrote - the category AGENTS.md says you fix or explain, and which
nobody had read here. The static lane is non-gating, so it went green and said
nothing, which is the #356 shape that script exists to catch.

The named harm is not present: the pool's threads are daemons, so a leaked one
could not hold a JVM open, and JUnit runs the teardown between tests so the
field is never actually overwritten while live. But overwriting a live
ExecutorService field is a leak shape regardless of who currently guarantees it
cannot happen, and the guarantee here is JUnit's lifecycle rather than anything
this class states. Shutting down what is about to be dropped is simply correct.

Chose this over the registry route deliberately.
docs/inflight/static-spotbugs-rule-registry.md sanctions suppression by RULE, in
a checked-in filter, which would switch HES off for the whole repository and
lose every future instance in new code - and it prices that at "the count of
off-rules only goes down". Three lines at one site is the cheaper answer.

Verified rather than assumed: SpotBugs over the module at the CI settings
reported the finding before and does not report it after, with test sources
demonstrably in scope (test classes appear among the other 303 findings).

Same-class sweep: HES_EXECUTOR_OVERWRITTEN_WITHOUT_SHUTDOWN has exactly one
other instance in the reactor, ChaosConductor$ChaosConductorBuilder.pcExecutor,
which also carries HES_EXECUTOR_NEVER_SHUTDOWN. It is pre-existing on master in
a file this branch does not touch, so it is inherited and stays for the
registries rather than being bulk-fixed here.
astubbs added a commit that referenced this pull request Sep 3, 2026
… the pre-push sweep could not see it

`PR Checklist` went red on `bin/test-todo-index.sh` - `--check on a current index
passes (expected '0', got '1')` - while `bin/check-all.sh` reported clean. Two separate
defects, and the second is the one that matters.

THE IMMEDIATE CAUSE. `list_files()` scans `*.yaml`, and
`src/docs/development/upstream-map.yaml` is DOCUMENTATION that happens to be YAML. Its
branch-accounting notes quote markers as evidence - "still carries `// todo refactored to
constant in the remove statics branch`" is the point being made about a branch - so the
scan indexed the quotation. That is precisely the pathology this script's own header
already documents for `.adoc`/`.md`: the index lists the same marker from its .java
source, so the entry duplicates and the count inflates. The extension list simply did not
cover a doc written in YAML. `src/docs/` is now out of scope, and it contributed nothing
before: `git show HEAD:docs/todo-index.md | grep src/docs/` was empty.

THE GAP THAT LET IT REACH CI, recorded in `docs/inflight/ci-hygiene-gaps.md` rather than
patched here. `check-all.sh` discovers gates by globbing `bin/check-*` and runs each with
NO ARGUMENTS. `todo-index.sh` fails both halves: the name does not match, and run bare it
REGENERATES the index - a pre-push sweep that mutates the working tree is the one thing it
must not do. `--check` is the read-only mode and the uniform contract has no way to ask
for it. So this is a design constraint rather than an oversight, which is why it gets a
note with three costed options instead of a special case wedged into the glob.

It matters because `check-all.sh`'s promise is load-bearing: AGENTS.md sends every agent
to it precisely so the gate set cannot drift from what someone remembered. A sweep that
says "no gate failed" while a tree-health gate is red is the same failure #356
motivated the script with, arriving through a door it does not watch.

Not fixed here because changing the gate every agent runs before every push is not a
ride-along for a JStream fix.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RVXBFaG4YXFP7Gjrj6pbVM
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