Skip to content

ci(bin): make Node the default for new scripts, and make a rule a row rather than a script - #403

Merged
astubbs merged 10 commits into
masterfrom
ci/node-first-tooling
Sep 1, 2026
Merged

astubbs merged 10 commits into
masterfrom
ci/node-first-tooling

Conversation

@astubbs

@astubbs astubbs commented Sep 1, 2026 •

Copy link
Copy Markdown
Owner

Description

Node becomes the default language for new scripts in bin/, and adding a rule becomes adding a row rather than adding a script. Operator ruling, 2026-09-01.

The argument is silent wrong answers, not taste

Shell in bin/ has produced answers that were confidently wrong:

  • A gate written with gawk's ENDFILE parsed cleanly under mawk — the default awk on this platform — matched nothing, ran no check, and printed its success line over a file containing the exact defect it was written to catch.
  • exp turned out to be a reserved awk function name, a syntax error that only surfaces when the line is reached.

Neither was caught by review. But the structural evidence is stronger than either anecdote: two entire gates existed only to police shell's traps — check-shell-sigpipe.sh (for grep -q under pipefail inverting its own answer) and check-shell-hazards.sh — plus a shared helper written because grep -c prints 0 and exits 1. When a fifth of the tooling is tooling that guards the tooling, the language is the problem. This PR deletes the first of those two, folding its single rule into the table below.

What this is not

Not a migration backlog. Existing scripts are grandfathered; churn is its own risk, and check-source-patterns.mjs only ever looks at what is new against the merge base. Shell keeps an escape hatch, and it is a sentence rather than a flag — shell-justified: <reason> in a comment, because a written reason is one somebody can disagree with later. Reasons that qualify are listed in bin/AGENTS.md; "it is what the neighbouring scripts are" is explicitly not one, since that is how a default outlives what justified it.

Node rather than Python, decided by the repo

.github/scripts/ already holds eight JS gate implementations, each with a .test.js sibling, against exactly one Python file in the tree. Node is the established second language here and already carries the testing convention bin/ lacks.

A rule is a row, not a script

Most gates here are the same program — walk files, match a regex, complain — each re-implementing file walking, exclusions, an opt-out marker, an exit-code contract and a failure message, in a language where every one of those is a paragraph and each is a place to differ subtly from its neighbour. bin/lib/source-patterns.mjs is the table; bin/check-source-patterns.mjs is the single runner they share. Two rules seed it: the new-shell-script policy, and one MIGRATED from an existing gate (check-shell-sigpipe.sh, deleted here) rather than invented for the table. Two further rules were written and deleted before shipping - they encoded the awk traps above, and each generalised a single incident into policing a language now frozen for new work, which is the wheel-reinvention the table header now forbids.

Every row must carry a why, asserted by the self-test. A check that has to think — parse XML, call an API, compare numbers — is a real program and still gets its own file.

The reviewer grant does not cover a new language

bin/AGENTS.md records that check-*.sh is granted to the review agent by pattern. A Node gate is invoked as node bin/check-x.mjs and matches none of those patterns, so the reviewer would silently have been unable to run it — running fewer checks than the directory contains, with nothing to say so. Bash(node bin/check-*.mjs:*) and Bash(node bin/test-*.mjs:*) are granted alongside the shell ones.

CI compile-checks every Node script — and that is a compile, not analysis

pr-checklist.yml runs node --check over every tracked .mjs and .js, and fails if the glob matches nothing — a loop that found no files exits 0 and is indistinguishable from a clean pass.

It is not static analysis and is not described as such. JavaScript is the one language CodeQL's default setup here does not cover (actions, java-kotlin, python), so the repo's eight existing JS gates and these new ones are unanalysed. Enabling javascript-typescript is a repository setting, not a file — it cannot be done in a commit, and is the operator's call.

This PR is the base of the stack

bin/check-all.sh now globs check-*.sh and check-*.mjs, and dispatches by extension so a .mjs gate runs under node rather than bash. Both halves are needed and they close different holes:

  • Discovery. Globbing only *.sh does not make a Node gate fail — it makes it invisible. The sweep prints 15 ran, 15 passed having swept one fewer gate than the directory contains, and says nothing. Quieter than a failure and strictly worse.
  • Execution. Every gate was run through bash -n then bash, which gives a .mjs file a bash syntax error and reports a clean rule as a broken gate.

Those lines were briefly carried on #401 instead, on the reasoning that whichever branch merges first must have them. True, and the wrong conclusion: it made the PR that establishes Node in bin/ depend on one that already writes Node. The convention lands first; work written under it follows.

Merge order: this PR, then #401, then the confluentinc#857 branch that depends on both.

Verification

  • node bin/check-source-patterns.mjs — clean, 3 rules over 190 files in scope
  • node bin/test-check-source-patterns.mjs — all pass, including the must-NOT-match half
  • node --check over all 11 tracked .mjs/.js files — clean
  • bin/check-issue-refs.sh — clean

A defect this PR's own self-test caught: the reserved-word rule flagged if (exp == 3), because == starts with =. A pattern verified only against text that should match is a pattern nobody has shown to be selective — which is exactly how this repo shipped a gate that matched nothing and reported success.

The third instance of this PR's own defect class

The rule table needed check-all.sh to learn a second suffix in two places — the gates loop and the self-tests loop. Neither made a Node gate fail; both made it invisible, so the sweep printed "15 ran, 15 passed" having swept one fewer than the directory contains.

Review found a third, and it was the worst: .githooks/pre-commit names gates by filename, and its missing-file branch is deliberately silent — "a branch older than a gate simply does not have it. Not an error - say nothing." Deleting check-shell-sigpipe.sh therefore removed it from every local commit with nobody told, and the replacement was never registered — so both the sigpipe rule and the new-shell policy were dark locally until CI. Registered, with the failure mode written into the array's own comment.

What the codex review found, and the pattern behind it

Ten findings, two P1. Four of the ten came from one blanket sed substituting the deleted filename across the docs — a filename carries properties, and swapping one for another silently transfers claims true of the first and false of the second. The worst said this PR doubled a scope gap it had actually closed; another had ShellCheck aborting while analysing a JavaScript module; another pointed the migration backwards, telling a reader to fold the rule into the shell gate.

Fixing them by hand then repeated the mistake in miniature: substituting a description for the name is safe in a present-tense sentence and wrong in a historical one. The distinction is present-tense versus historical — a historical sentence must keep naming what was there at the time.

Also corrected: .github/scripts/ holds four JS implementations with four .test.js siblings — eight files, not eight implementations. The original wording implied sixteen and overstated the quantitative case for Node.

What the claude review then found, which codex had missed

It answered the focus question codex was asked and never addressed, and it reproduced the failure rather than reasoning about it — its own review checkout is shallow.

git merge-base HEAD origin/master had no shallow guard. On a shallow clone that call does not error; it returns a commit that is not the merge base, exit 0 — so the added-files list feeding the headline rule is silently wrong. That is the silent-wrong-answer class this PR argues against, occurring in the mechanism built to prevent it. Now checks --is-shallow-repository, proves origin/master is actually present, and fails closed with exit 2. Verified by cloning this repo --depth 1 and running it there.

And the fix would have caused a second bug without its partner. .githooks/pre-commit registered this gate with no soft exit codes, so the new "cannot run" would have hard-blocked every commit on a shallow or narrow clone — the exact anti-pattern that hook's own header warns about. Now ":2".

Staged files were invisible to the rule (codex, filed P2 — arguably misfiled). git diff <base> HEAD cannot see a file staged for its first commit, so at the pre-commit hook — the one place the rule is meant to stop a new shell script before it lands — it saw nothing and allowed exactly what it exists to reject. Now the union of committed and staged additions; verified by staging a bin/*.sh and watching it get rejected.

Two known limits of the sigpipe regex are now stated rather than implied: a pipeline split over a line continuation is not caught, and a heredoc body containing | grep -q as literal data is a false positive. Both checked against the deleted gate rather than assumed — they are parity, not regressions.

Checklist

  • Docs updated — bin/AGENTS.md gains the rule as its first section, ahead of naming, because language choice comes first
  • User-facing feature documentation data added under docs/features/ — N/A - repo tooling and conventions, no user-facing behaviour
  • Tests added/updated — bin/test-check-source-patterns.mjs, control pairs (must-match and must-not-match) for every rule, plus assertions that each row carries a why and a fix
  • Title & body reflect the final content of this PR
  • Ran ce-simplify and ce-code-review locally — N/A - asking for @claude review on the PR instead, which is the route that can open inline threads

… rather than a script

THE ARGUMENT IS SILENT WRONG ANSWERS, NOT TASTE

Shell in bin/ has produced answers that were confidently wrong. A gate written with gawk's ENDFILE
parsed cleanly under mawk - the default awk on this platform - matched nothing, ran no check, and
printed its success line over a file containing the exact defect it had been written to catch. `exp`
turned out to be a reserved awk function name, which is a syntax error that only surfaces when the
line is reached. Neither was caught by review.

The structural evidence is stronger than either anecdote: TWO ENTIRE GATES EXIST ONLY TO POLICE
SHELL'S TRAPS - check-shell-sigpipe.sh, for `grep -q` under pipefail inverting its own answer, and
check-shell-hazards.sh - plus a shared helper written because `grep -c` prints 0 and exits 1. When a
fifth of the tooling is tooling that guards the tooling, the language is the problem.

So: new scripts in bin/ are Node. Existing scripts are GRANDFATHERED and this is not a migration
backlog - churn is its own risk, and check-source-patterns.mjs only ever looks at what is new against
the merge base. Shell keeps an escape hatch, and it is a sentence rather than a flag:
`shell-justified: <reason>` in a comment, because a written reason is one somebody can disagree with
later. "It is what the neighbouring scripts are" is explicitly not a reason - that is how a default
outlives the thing that justified it.

NODE RATHER THAN PYTHON, DECIDED BY THE REPO

.github/scripts/ already holds eight JS gate implementations, each with a .test.js sibling, against
exactly one Python file in the tree. Node is the established second language here AND it already
carries the testing convention bin/ lacks. Python would be the outlier.

A RULE IS A ROW, NOT A SCRIPT

Most gates here are the same program - walk files, match a regex, complain - each re-implementing file
walking, exclusions, an opt-out marker, an exit-code contract and a failure message, in a language
where every one of those is a paragraph, and each a place to differ subtly from its neighbour.
bin/lib/source-patterns.mjs is the table and check-source-patterns.mjs is the single runner they
share. Three rules seed it: the new-shell-script rule, and two that encode the traps above so they
cannot recur. A check that has to THINK - parse XML, call an API, compare numbers - is a real program
and still gets its own file.

Every row must carry a `why`, asserted by the self-test. A rule whose reason is not written down
survives long after the thing it guarded stopped mattering, which is how a linter becomes noise.

WHAT THE WORK ITSELF CAUGHT, WHICH IS THE ARGUMENT IN MINIATURE

The self-test's must-NOT-match half caught a real false positive: the reserved-word rule flagged
`if (exp == 3)`, because `==` starts with `=`. A pattern verified only against text that should match
is a pattern nobody has shown to be selective, and this repo has already shipped one gate that
matched nothing and reported success over the defect it was written for.

Two further defects were found and belong to #401, which carries the
bin/check-all.sh change and merges first. Recorded here because they are the same argument: that
script ran every gate through `bash`, so the first .mjs gate reported as a FAILING GATE while being
clean - a rule shown as broken - and both its discovery loops globbed *.sh only. The gate loop was the
obvious half; the SELF-TEST loop was the worse one, because an undiscovered self-test costs nothing
visible: the sweep still reports every test passing, having found fewer than exist.

That is also why this commit adds no per-self-test step to a workflow. check-all.sh's header forbids
reintroducing that list, and once its glob takes either suffix, repo-hygiene.yml's --with-tests picks
up a Node self-test with no edit anywhere.

DEPENDS ON #401

Both halves of the bin/check-all.sh change live there - the glob that finds a .mjs gate and the
dispatch that runs it with node rather than bash - so on this branch the sweep does not fail on
check-source-patterns.mjs. It does something quieter and worse: it never finds it. `bin/check-all.sh`
reports 15 ran, 15 passed, having swept one gate fewer than the directory contains and said nothing,
which is the precise failure that script was written to prevent.

So the gate is verified directly here - `node bin/check-source-patterns.mjs` and
`node bin/test-check-source-patterns.mjs`, both clean - and its integration with the sweep is
exercised by #401 rather than by this PR. Re-adding the glob and dispatch
here to make the local sweep green would duplicate the change across two branches, which is the
duplication splitting them was meant to avoid.

THE REVIEWER GRANT DOES NOT COVER A NEW LANGUAGE

bin/AGENTS.md records that check-*.sh is granted to the review agent by pattern. A Node gate is
invoked as `node bin/check-x.mjs` and matches none of those patterns, so the reviewer would silently
have been unable to run it - running fewer checks than the directory contains, with nothing to say so.
`Bash(node bin/check-*.mjs:*)` and `Bash(node bin/test-*.mjs:*)` are granted alongside the shell ones.

CI COMPILE-CHECKS EVERY NODE SCRIPT, AND THAT IS A COMPILE RATHER THAN ANALYSIS

pr-checklist.yml runs `node --check` over every tracked .mjs and .js, and fails if the glob matches
nothing - a loop that found no files exits 0 and is indistinguishable from a clean pass, which is the
failure this repo keeps meeting. It is not static analysis and is not described as such. JavaScript is
the one language CodeQL's default setup here does not cover (actions, java-kotlin, python), and
enabling it is a repository setting rather than a file, so it cannot be done in a commit.
@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown

Dependency Review

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

Scanned Files

None

@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown

✅ Duplicate Code Report

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

✅ PMD CPD

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

No new clones introduced by this PR.

✅ jscpd (language-agnostic)

PR Base Change
Clones 86 86 ➖ 0
Duplicated lines 1239 1239 ➖ 0
Duplication 0.98% 0.98% ➖ 0
Rule Limit Status
Max duplication 2% ✅ Pass (0.98%)
Max increase vs base +0.1% ✅ Pass (+0.00%)

No new clones introduced by this PR.

Powered by astubbs/duplicate-code-cross-check

@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown

🧪🔒 Quarantine Lane Report

Quarantined test Outcome Owner Meaning
ProducerManagerTest.producedRecordsCantBeInTransactionWithoutItsOffsetDirect 🔴 failing (expected) #262 quarantine holding

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

@github-actions

github-actions Bot commented Sep 1, 2026 •

Copy link
Copy Markdown

📌 Duplicate code detection tool report

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

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

Full similarity report
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 40.34
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/SeenSucceededOrderingProbes.java 36.14
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 36.86
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/SeenSucceededOrderingProbes.java 36.67
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 54.92 ⚠️
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/BootstrapResetTripleWriteProbes.java 40.34
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CalibrationProbes.java 36.86
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 54.92 ⚠️
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CalibrationProbes.java 36.67
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/BootstrapResetTripleWriteProbes.java 36.14
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 55.93 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 38.32
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 34.24
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 33.14
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 32.42
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 32.38
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 31.58
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 64.91 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 58.72 ⚠️
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 42.94
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 42.11
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 36.12
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 33.4
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 31.72
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/RecordContextInternal.java 30.03
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 64.91 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 54.81 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 41.83
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 35.47
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 35.18
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 32.71
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 30.54
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/test/java/bz/stub/parallelconsumer/PCRetriableExceptionTest.java 33.93
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/ThrowableUtils.java 32.47
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 55.93 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 48.37
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 39.13
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 30.92
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 30.58
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 58.72 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 54.81 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 50.05 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 36.9
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 34.75
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 32.73
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 50.05 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 42.11
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 41.83
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 36.98
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 43.71
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 30.5
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.9
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 36.12
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 35.18
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/RecordContextInternal.java 34.03
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContext.java 30.5
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 43.71
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 34.03
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 30.03
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 43.22
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ExternalEngine.java 39.36
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 37.54
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/BrokerPollSystem.java 35.15
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ConsumerManager.java 32.09
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 30.58
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ProducerManager.java 30.43
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java 30.26
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 35.15
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/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 32.09
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 30.42
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-core/src/test/java/bz/stub/parallelconsumer/internal/ExternalEnginePipelineBufferTest.java 43.35
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 39.36
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 36.14
parallel-consumer-reactor/src/main/java/bz/stub/parallelconsumer/reactor/ReactorProcessor.java 30.83
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 55.97 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 50.19 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 48.37
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 48.28
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 38.32
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCInternalRuntimeException.java 37.03
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 32.38
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 30.05
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCInternalRuntimeException.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 37.03
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCModule.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/AmbientProbeExtension.java 31.23
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PollThreadStallDiagnosisTest.java 30.16
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/internal/AbstractParallelEoSStreamProcessor.java 30.43
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 31.95
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 37.05
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/Java8StreamUtils.java 31.95
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/ThrowableUtils.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/ThrowableUtilsTest.java 35.5
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PCRetriableException.java 32.47
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/metrics/PCMetrics.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/metrics/PCMetrics859Test.java 42.55
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/MetricsTeardownCannotBreakCloseTest.java 32.08
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 47.86
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 34.17
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 33.32
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 32.42
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 32.38
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 30.92
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 55.97 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 47.86
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 46.8
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 45.95
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 44.97
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 44.81
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 39.13
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 34.24
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 48.28
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 46.5
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 44.97
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 35.0
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 34.13
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 50.19 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 46.8
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 46.5
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 33.14
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 30.58
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 60.3 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 45.95
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 35.0
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 34.17
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 32.38
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 30.05
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 60.3 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 44.81
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 34.13
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 33.32
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 31.58
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/WorkManager.java 34.25
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionStateManager.java 32.82
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 30.26
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 43.45
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java 32.82
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/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java 39.67
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java 38.3
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 37.84
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkContainer.java 37.82
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardAvailableCountOwnershipTest.java 37.39
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 30.58
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 38.3
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 36.78
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java 33.74
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkContainer.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkClaimStateMachineTest.java 49.17
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 37.82
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 43.45
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 37.84
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 37.54
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java 36.78
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java 34.25
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/AmbientProbeExtension.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/LoopingResumingIteratorTest.java 32.74
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 54.82 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 43.16
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 37.28
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 40.1
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 39.66
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 37.28
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.44
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.44
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.26 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 43.16
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 39.66
parallel-consumer-vertx/src/test-integration/java/bz/stub/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 30.9
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 54.82 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 54.26 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 40.1
parallel-consumer-vertx/src/test-integration/java/bz/stub/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 35.68
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/ChaosChurnStormIT.java 43.55
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkKeyOrderIT.java 42.23
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 38.83
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 34.48
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java 33.66
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ProgressProbe.java 30.99
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 43.65
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 43.55
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 39.51
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 52.4 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 43.65
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 38.83
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 35.65
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ProgressProbe.java 30.15
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 38.71
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 41.78
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 38.71
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 41.78
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 33.66
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 52.4 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 42.23
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/ChaosChurnStormIT.java 39.51
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 35.65
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 34.48
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ProgressProbe.java 31.49
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/DiagnosticQuietCap.java

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/KeyOrderLedgerIT.java 31.56
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 31.56
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/ChaosScenarioBase.java 31.49
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 30.99
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 30.15
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 38.31
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/ParallelEoSStreamProcessorTest.java 33.06
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/KafkaTestUtils.java 31.21
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.38
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 47.71
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineRegistryScriptTest.java 45.25
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 31.66
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 35.43
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CommitRejectionTestBase.java 31.66
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ConsumerOffsetCommitter.java 30.42
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 52.03 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java 50.73 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java 44.58
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/BatchTestBase.java 30.38
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MdcBoundaryProbe.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MdcBoundaryProbe.java 36.25
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.32
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.32
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 35.43
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/PCRetriableExceptionTest.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PCRetriableException.java 33.93
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 32.82
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/AbstractParallelEoSStreamProcessorTestBase.java 33.06
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/ParallelEoSSStreamProcessorRebalancedTest.java 32.82
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 47.71
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineRegistryScriptTest.java 30.35
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 45.25
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineLaneReportScriptTest.java 30.35
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.54 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 87.17 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 86.74 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 83.81 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 83.81 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 83.81 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 82.32 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 82.32 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ConsumerManagerCloseOwnershipTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ThreadConfinedConsumerTest.java 35.28
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/EpochAndRecordsMapRaceTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerStaleContainerTest.java 33.89
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ExternalEnginePipelineBufferTest.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/metrics/PCMetrics859Test.java 37.34
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/metrics/PCMetrics.java 32.08
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PCModuleCollaboratorOwnershipTest.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PollThreadStallDiagnosis.java 30.16
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 43.22
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AbstractParallelEoSStreamProcessorConfigurationTest.java 38.31
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 34.75
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 31.72
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 30.54
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ThreadConfinedConsumerTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ConsumerManagerCloseOwnershipTest.java 35.28
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 30.38
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 30.38
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 37.05
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 31.21
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.74
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/ThrowableUtilsTest.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/ThrowableUtils.java 35.5
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/metrics/PCMetrics859Test.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/metrics/PCMetrics.java 42.55
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/MetricsTeardownCannotBreakCloseTest.java 37.34
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 37.55
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 37.55
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/ShardManagerLincheckTest.java 31.39
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckToolchainProbeTest.java 31.08
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.75
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckHarness.java 31.08
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/OffsetEncoderWidenedRangeRaceTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateCommitEncodeShift894Test.java 46.54
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RacingEncodeWindowState.java 38.05
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateCommitEncodeShift894Test.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/OffsetEncoderWidenedRangeRaceTest.java 46.54
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateCommitShiftCompounding894Test.java 42.53
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateLincheckTest.java 33.73
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateCommitShiftCompounding894Test.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateCommitEncodeShift894Test.java 42.53
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/PartitionStateCommitEncodeShift894Test.java 33.73
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerLincheckTest.java 32.89
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueLincheckTest.java 31.4
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerLincheckTest.java 30.67
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ProcessingShardStaleReplacement909Test.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerStaleContainerTest.java 44.28
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RacingCommitCycleState.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RacingEncodeWindowState.java 58.99 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RacingEncodeWindowState.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RacingCommitCycleState.java 58.99 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/OffsetEncoderWidenedRangeRaceTest.java 38.05
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueLincheckTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerLincheckTest.java 41.2
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateLincheckTest.java 31.4
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerLincheckTest.java 30.41
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardAvailableCountOwnershipTest.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 37.39
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java 33.4
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerLincheckTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueLincheckTest.java 41.2
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckToolchainProbeTest.java 35.75
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateLincheckTest.java 32.89
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckHarness.java 31.39
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerRevokeSweepNpeTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerStaleCheckDoubleLookupTest.java 34.11
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerStaleContainerTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ProcessingShardStaleReplacement909Test.java 44.28
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/EpochAndRecordsMapRaceTest.java 33.89
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 39.67
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java 33.74
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardAvailableCountOwnershipTest.java 33.4
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkClaimStateMachineTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerTest.java 54.29 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkContainer.java 49.17
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/PartitionStateLincheckTest.java 30.67
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueLincheckTest.java 30.41
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerStaleCheckDoubleLookupTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerRevokeSweepNpeTest.java 34.11
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkClaimStateMachineTest.java 54.29 ⚠️
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.29
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.29
parallel-consumer-examples/parallel-consumer-example-core/src/main/java/bz/stub/parallelconsumer/examples/core/CoreApp.java

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

File Similarity (%)
parallel-consumer-examples/parallel-consumer-example-reactor/src/main/java/bz/stub/parallelconsumer/examples/reactor/ReactorApp.java 36.47
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 39.46
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/integrationTests/CoreAppMetricsIntegrationTest.java 36.31
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/VertxAppTest.java 35.36
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.81 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 83.4 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 83.04 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 82.63 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 79.84 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 79.84 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 78.43 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 78.43 ⚠️
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.32 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 81.92 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 81.57 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 81.17 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 78.43 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 78.43 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 78.43 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 77.04 ⚠️
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.31
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 70.13 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/main/java/bz/stub/parallelconsumer/examples/core/CoreApp.java 36.47
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.28
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/CoreAppTest.java 39.46
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.81 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 83.4 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 83.04 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 82.63 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 79.84 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 79.84 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 78.43 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 78.43 ⚠️
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.32 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 81.92 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 81.57 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 81.17 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 78.43 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 78.43 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 78.43 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 77.04 ⚠️
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 70.13 ⚠️
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.81 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 83.4 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 83.04 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 82.63 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 79.84 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 79.84 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 78.43 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 78.43 ⚠️
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.28
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/CoreAppTest.java 35.36
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 44.82
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 80.82 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 50.73 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java 48.82
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyMdcPropagationTest.java

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

File Similarity (%)
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorMdcPropagationTest.java 48.05
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 69.15 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyUnitTestBase.java

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

File Similarity (%)
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorUnitTestBase.java 31.26
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 87.17 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 86.74 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 85.94 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 83.04 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 83.04 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 83.04 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 81.57 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 81.57 ⚠️
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 44.82
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ExternalEngine.java 30.83
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 80.82 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 52.03 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java 50.06 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorMdcPropagationTest.java

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

File Similarity (%)
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyMdcPropagationTest.java 48.05
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 69.15 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorUnitTestBase.java

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

File Similarity (%)
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyUnitTestBase.java 31.26
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.74 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 86.31 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 85.94 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 82.63 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 82.63 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 82.63 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 81.17 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 81.17 ⚠️
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.94
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 41.36
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java 37.71
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 37.46
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 35.47
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 32.73
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 42.49
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 41.36
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 36.98
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 33.4
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 32.71
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 40.77
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 37.46
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ExternalEngine.java 36.14
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/JStreamVertxParallelStreamProcessor.java 42.49
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 40.77
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 37.71
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.68
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 30.9
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.54 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 86.74 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 86.31 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 83.4 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 83.4 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 83.4 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 81.92 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 81.92 ⚠️
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 50.06 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java 48.82
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 44.58

@github-actions

github-actions Bot commented Sep 1, 2026 •

Copy link
Copy Markdown

⚠️ SpotBugs Report

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

This branch adds a .mjs gate, so bin/check-all.sh has to be able to see it and run it. Two separate
holes, and the first is the dangerous one:

DISCOVERY. The sweep globbed bin/check-*.sh. A Node gate does not fail under that - it is INVISIBLE.
check-all prints "15 ran, 15 passed" having swept one fewer gate than the directory contains, and says
nothing at all. Quieter than a failure and strictly worse, and precisely the shape that script exists
to prevent.

EXECUTION. Every gate was run through `bash -n` then `bash`, which gives a .mjs file a bash syntax
error and reports a clean rule as a broken gate. Dispatch now picks node or bash by extension.

WHY IT LIVES HERE RATHER THAN ON #401

It was briefly on that PR, on the reasoning that whichever branch merges first must carry it. That is
true and it is not a good enough reason: it made the PR that ESTABLISHES Node in bin/ depend on a PR
that already writes Node, which is backwards to read and backwards to review. The convention lands
first; work written under it follows. #401 now depends on this.
astubbs added a commit that referenced this pull request Sep 1, 2026
…ch, rather than carrying it

This PR's gate is bin/check-throughput-regression.mjs, and bin/check-all.sh cannot see or run a .mjs
gate without the glob and the extension dispatch. Those ~10 lines were briefly carried here, on the
reasoning that whichever branch merges first must have them.

That reasoning was right and the conclusion was wrong. It made #403 - the PR
that ESTABLISHES Node as the default in bin/ - depend on this one, which already writes Node. Backwards
to read and backwards to review: the convention should land first and work written under it should
follow.

So the dispatch goes back to #403 and this PR declares the dependency. The
merge order is #403, then this, then the confluentinc#857 branch that depends
on both.

Until #403 lands, bin/check-all.sh on this branch does not sweep
check-throughput-regression.mjs at all - it is not run and reported broken, it is simply not
discovered. Verify it directly meanwhile:

  node bin/check-throughput-regression.mjs
  node bin/test-check-throughput-regression.mjs
…two rules that were reinventing wheels

MIGRATING A REAL RULE IS WHAT TESTS THE TABLE

The table shipped with three rules invented for it, which proves nothing: an abstraction validated only
against its author's examples is an abstraction nobody has shown fits anything. check-shell-sigpipe.sh
was the right first migration because it asked to be moved - its own header says it is "a hazard
category, not a gate of its own", and docs/inflight/ci-fold-sigpipe-into-shell-hazards.md tracked the
fold. That note is now deleted rather than left as a request nobody will action.

IT IMMEDIATELY DEMANDED A FIELD THE TABLE DID NOT HAVE, which is the point

The rule only applies to files that set pipefail - piping into `grep -q` is only a wrong ANSWER when
pipefail promotes the reader's SIGPIPE to the pipeline status. So rules gained `requires`. A table that
could not express that would have been a table that only fits rules its author made up.

AND THE FIRST PORT WAS WRONG IN A WAY THE OLD GATE WAS NOT

A whole-file regex flagged thirteen files the shell gate passes, because most only MENTION the hazard
in a comment - including the gate being replaced and its own self-test. The shell version got this by
running line-oriented and piping through a second `grep -v` for comments; a single pattern has to carry
both halves. Now line-anchored with a comment guard.

Every flag spelling the deleted gate covered is pinned in the self-test - -q, -qE, -qF, -Eq, --quiet,
--silent, `grep -v -q`, `grep -E -q` - because -qE, -qF and the space-separated form are exactly the
ones a hand-written regex gets wrong, and reasoning about whether they match is how you convince
yourself of the wrong answer. Verified against all twelve before deleting anything.

TWO RULES DELETED BEFORE SHIPPING, FOR THE REASON THAT SHOULD GOVERN THE TABLE

gawk's ENDFILE under mawk, and awk's reserved function names used as variables. Both real - each had
bitten within a day - and both wrong to keep: each was generalised from a single incident into policing
a language now frozen for new work. This repo already runs ShellCheck, SpotBugs with
fb-contrib/findsecbugs/findbugs-slf4j, Infer, forbiddenapis, ArchUnit and CodeQL, and a rule one of
those covers must never become a row here - a second implementation of somebody else's check is a wheel
that will eventually disagree with theirs. The table header now says so.

The surviving rules are the two that earn it: a repo policy no tool can know (Node for new scripts in
bin/), and a hazard measured to be invisible to ShellCheck which once reported "no review posted" on
four PRs whose reviews had posted.

REFERENCES REPAIRED RATHER THAN LEFT DANGLING

Seven of them, found by check-file-refs.sh. Live docs repoint at the rule; the dated solutions record
carries a marker instead, because docs/citations.md forbids rewriting a dated record to match today's
tree and the gate accepts a stated reason as the repair.
…idate, no queue

Records the answer to 'which other check-*.sh are really just pattern matchers', so it is not
re-derived and so the table is not assumed to want gates it does not fit.

check-shell-hazards.sh is the one real candidate, and the interesting part is WHY: it is already a rule
table written in shell - a HAZARDS heredoc with categories and a why per entry, a file-level opt-out,
and a comment guard whose own comment says a comment about a hazard is not a use of it. It reached the
same design independently, which is the best evidence available that the design is right. It is also
why the fold is not trivial: matching its opt-out and comment semantics exactly is the work, and
getting either subtly wrong is how a migration covers less than what it replaced - which already
happened once, when the first sigpipe port flagged thirteen files the shell gate passes.

The non-candidates are listed with the reason each fails, because 'why not' is the half that stops
somebody trying: aggregation across files, cross-file consistency, required-vocabulary rather than
forbidden-pattern, a ShellCheck wrapper, and everything that fetches from GitHub.

And the rule that governs additions at all: check what we already run first. A rule ShellCheck,
SpotBugs, Infer, forbiddenapis, ArchUnit or CodeQL covers must never become a row, because a second
implementation of somebody else's check eventually disagrees with it.

@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

…thing

THE SECOND INSTANCE OF THE SAME HOLE, IN THE SAME PR

The gates loop globbed check-*.sh and was widened to include .mjs. The SELF-TESTS loop globbed
bin/test-*.sh and was not, so bin/test-check-source-patterns.mjs was executed by nothing: the named
step had been dropped from pr-checklist.yml on the belief that check-all.sh --with-tests covered it,
and two documents in this very PR asserted that it did.

The compile step made it PARSE in CI, which reads like coverage and is not. So the must-NOT-match
controls - the half that caught a real false positive in this PR, `exp == 3` matching `exp\s*=` - never
ran once.

MISSING A SELF-TEST IS WORSE THAN MISSING A GATE, and the comment in check-all.sh now says so. An
unswept gate is absent from the count, and a count that moves is something somebody eventually
notices. An unswept self-test leaves its gate present, running, and LOOKING tested.

WHAT ELSE REVIEW FOUND

`checker` and `runner` were the only variables in run_gate not declared local, so they leaked to global
scope while every neighbour was contained.

`forbid: /^/` for the new-shell-script rule was an abuse of the field - "the file existing is the
violation" dressed up as a pattern. `forbid` is now optional, with the typedef saying to omit it when
existence is the violation, so the next person adding a rule is not taught the wrong idiom by example.

The runner now prints the merge base it resolved. `scope: 'added-files'` is only as good as
origin/master being current, and a stale ref moves the base backwards and flags files master added -
which the root AGENTS.md warns about in another context. Printing the base makes that visible rather
than baffling.

Files were read once per rule, and both rules match every shell script in bin/. Now cached.

TWO CLAIMS THE MIGRATION FALSIFIED, corrected rather than left: bin/AGENTS.md still said "two entire
gates exist only to police shell's traps" when one of them is now a row in the table, and still
described the deleted gate's self-exclusion of two files - a .mjs rule cannot match /\.(sh|bash)$/, so
it excludes nothing.

WHAT REVIEW DID NOT FIND, which is worth as much

No disagreement between this rule and the gate it replaced, over 1,470 generated cases - 7 prefixes x
6 pipe spellings x 7 grep forms x 3 suffixes, plus comment variants and 8 multi-line cases aimed at
the comment guard. The migration is behaviour-preserving on everything anybody has thought to try.

One correction to a comment rather than to code: the regex is described as line-anchored, and `[^|]`
also matches a newline, so a match can straddle lines. It cannot bypass the comment guard - reaching a
comment line's pipe would need `\|` immediately after the newline, and a comment starts with `#` - but
the comment overstated the mechanism and now says what actually holds.
@astubbs

astubbs commented Sep 1, 2026

Copy link
Copy Markdown
Owner Author

@codex review

Focus areas, in rough priority order:

  1. bin/lib/source-patterns.mjs, rule sigpipe-into-grep-q. This replaces bin/check-shell-sigpipe.sh (deleted in this PR; read it with git show 65977478c^:bin/check-shell-sigpipe.sh). The old gate ran line-oriented and filtered comments with a second grep -v; this is one regex claiming to do both. A prior review compared them over 1,470 generated cases and found no disagreement — please try to find one it missed, particularly around multi-line constructs, heredocs, and grep inside $(...).
  2. bin/check-all.sh. Two loops (gates, self-tests) each had to learn a second suffix. Is there a third place that enumerates scripts by extension and was missed?
  3. bin/check-source-patterns.mjs, scope: "added-files". It resolves a merge base against origin/master and never fetches. What happens with a stale ref, a shallow clone, or a fork PR?
  4. The escape hatch shell-justified: is satisfied by any single non-space character. Is that acceptable, or should it require something checkable?

Context worth having: this PR makes Node the default for new scripts in bin/, and folds one existing gate into a rule table so a rule is a row rather than a script. Two other rules were written and deleted before shipping, because they duplicated what ShellCheck/SpotBugs/CodeQL already cover — that principle is in the table header and is the one I most want challenged.

@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

@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

Here are some automated review suggestions for this pull request.

Reviewed commit: 65977478cd

ℹ️ 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 bin/lib/source-patterns.mjs Outdated
Comment thread bin/lib/source-patterns.mjs Outdated
Comment thread docs/inflight/ci-copyright-gate-review-leftovers.md Outdated
Comment thread docs/inflight/ci-conflict-marker-gate.md
Comment thread docs/inflight/static-shell-lint-severity-tiers.md
Comment thread bin/AGENTS.md Outdated
Comment thread docs/ci.md Outdated
Comment thread bin/AGENTS.md Outdated
Comment thread bin/check-source-patterns.mjs
Comment thread bin/lib/source-patterns.mjs
Merge prep for #403 asked the checklist's 'other instances of the same
defect' question - two loops had already needed widening to see .mjs, so a third that globs
bin/test-*.sh looks like the same miss.

It is not. That job exists to catch BSD userland differences - bash 3.2, BSD sed and awk - and a Node
self-test has no such exposure. The .mjs self-tests are already swept on Linux by the
bin/check-all.sh --with-tests step in the same workflow, whose globs cover both suffixes.

Recorded because the NEXT person to ask that question will reach the same wrong conclusion I did, and
'fixing' the glob would look like closing a gap while actually just running the same test twice.
…nd eight claims the rename inverted

THE ONE THAT MATTERED (P1): THE GATE STOPPED RUNNING LOCALLY

.githooks/pre-commit carries a GATES array naming each gate by filename, and its missing-file branch
is deliberately silent - "a branch older than a gate simply does not have it. Not an error - say
nothing." Deleting check-shell-sigpipe.sh therefore removed it from every local commit without a
word, and check-source-patterns.mjs was never registered in its place. So both the sigpipe rule AND
the new-shell policy were dark on every commit until CI ran.

That is the THIRD instance of this PR's own defect class - a coverage hole that reports nothing. The
gates loop had it, the self-tests loop had it, and the pre-commit registry had it. The array now names
the replacement, and a comment above the loop says that a renamed or deleted gate must be changed here
in the same commit, because the silent branch is by design and will not tell the next person either.

Verified the way the hook invokes it: git mode 100755, `#!/usr/bin/env node`, runs clean as
`./bin/check-source-patterns.mjs`.

TWO RULE FIXES, BOTH REAL HOLES

`.bash` was not covered by the new-shell rule while the sigpipe rule in the same table already treated
.bash as shell, so `bin/tool.bash` bypassed the Node-default policy silently.

`shell-justified:` matched anywhere in the file, so `echo 'shell-justified: x'`, usage text or heredoc
data exempted a script carrying no justification at all. Now anchored to a comment. Reason QUALITY
stays a review judgment - no regex checks that - but the documented form is mechanically checkable, so
it is checked. Both fixes carry self-test cases, including the must-NOT-match halves.

SIX DOCUMENTS THE BULK RENAME MADE FALSE

A global .sh -> .mjs substitution does not preserve meaning, and here it inverted several claims:

- The copyright-gate note said the new module shares shell-corpus.sh's one-level corpus, so this PR
  "doubled the gap's reach". It uses `git ls-files` and matches every tracked .sh/.bash path - the PR
  CLOSED that gap for this rule. The note said the opposite of what happened.
- docs/ci.md said check-shell-hazards.sh should eventually absorb the source-pattern rule. The
  migration runs the other way; following that sentence would undo this PR's architecture.
- check-shell-hazards.sh's own header still said the sigpipe gate "BELONGS IN HERE, and has not moved
  yet". It has moved, outward. That file is now the candidate to fold INTO the table, not the
  destination.
- static-shell-lint-severity-tiers.md ended up claiming ShellCheck aborted while processing a
  JavaScript module. ShellCheck never reads a .mjs. Restored to the deleted .sh and marked as the
  dated record docs/citations.md forbids rewriting.
- ci-conflict-marker-gate.md cited a self-exclusion-by-name mechanism as prior art. No such mechanism
  exists: the rule avoids its own fixtures only because its files regex excludes .mjs.
- bin/AGENTS.md said ".github/scripts/ holds eight JS gate implementations, each with a .test.js
  sibling" - implying sixteen files. It is four implementations and four tests. And it credited
  pr-checklist.yml with running the self-tests; that workflow only compile-checks, while
  repo-hygiene.yml runs them via check-all.sh --with-tests.

TEN LIVE REFERENCES, NOT THE THREE REPORTED

The review named three files still pointing readers at the deleted executable in the present tense.
Sweeping the class found ten across check-shell-hazards.sh, chaos-test.sh, ci-mutation-test.sh,
check-branch-self-reference.sh, quarantine-common.sh, chaos-experiment-common.sh, test-check-docs-data.sh,
test-check-review-posted.sh and test-check-cve-exclusions.sh. Genuinely historical mentions are left
alone. shell-corpus.sh also now states it has one consumer left, since its own rationale implied two.
…s findings

Ten findings, two P1. The pattern worth naming: FOUR of the ten were caused by one blanket
`sed 's/check-shell-sigpipe.sh/<new name>/'` across the docs when the gate was folded into the rule
table. A filename carries properties, and substituting one for another silently transfers claims that
were true of the first and false of the second.

  * an open note said sigpipe shares shell-corpus.sh's one-level corpus - the rule does not use
    shell-corpus at all and scans every tracked .sh/.bash, so the substitution claimed this PR DOUBLED
    a scope gap it had actually closed (P1);
  * another cited a self-exclusion-by-name mechanism the rule does not have - it avoids its own
    fixtures only because its `files` regex excludes .mjs;
  * a dated ShellCheck measurement became a claim that ShellCheck aborted while analysing a JavaScript
    module;
  * docs/ci.md ended up pointing the migration backwards, telling a reader to fold the rule INTO the
    shell gate - undoing the architecture.

Fixing them by hand, one sentence at a time, then repeated the mistake in a smaller way: substituting a
DESCRIPTION for the name is safe in a present-tense sentence and still wrong in a historical one, so
"the sigpipe check (bin/lib/source-patterns.mjs) opened a PROSE comment with the word shellcheck"
briefly asserted a .mjs module had a shell directive problem. The distinction is not name-versus-
description, it is PRESENT-TENSE versus HISTORICAL, and a historical sentence must keep naming the
thing that was there at the time.

THE OTHER P1: THE PRE-COMMIT REGISTRY

.githooks/pre-commit's GATES array still named the deleted script, and its missing-file branch is
silent by design - so every local commit lost BOTH the sigpipe rule and the new-shell policy until CI,
with nobody told. Registered the replacement and wrote the failure mode into the array's own comment,
because the next rename will do this again otherwise.

CORRECTIONS OF FACT

`.github/scripts/` holds FOUR JS gate implementations with four .test.js siblings - eight files, not
eight implementations. The wording implied sixteen and overstated the quantitative case for Node,
which was quoted in this PR's description and in bin/AGENTS.md.

Compile-checking and self-testing are two different workflows: pr-checklist.yml compiles, and
repo-hygiene.yml runs bin/check-all.sh --with-tests, which is what discovers bin/test-*.mjs. Naming
only the first sends anyone repairing the wiring to a job that never runs the tests.

RULE COVERAGE

`.bash` now counts as shell for the new-script rule - the sigpipe rule already treated it as shell, so
bin/tool.bash bypassed the Node-default policy silently. And `shell-justified:` must now appear as a
COMMENT: it matched anywhere in the file, so echoed output, usage text or heredoc data exempted a
script carrying no justification at all. Reason quality stays a review judgement, because no regex
checks that; the documented form is mechanically checkable, so it is checked.
@astubbs

astubbs commented Sep 1, 2026

Copy link
Copy Markdown
Owner Author

@claude review this

@claude

claude Bot commented Sep 1, 2026 •

Copy link
Copy Markdown

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


Review: bin/check-source-patterns.mjs and its merge-base call

  • Gather context (PR body, prior codex review + fixes, branch commits)
  • Read the current diff / files (bin/lib/source-patterns.mjs, bin/check-source-patterns.mjs, bin/check-all.sh, .githooks/pre-commit, bin/AGENTS.md, docs/ci.md)
  • Review the rule table + runner
  • Review check-all.sh discovery/dispatch
  • Review pre-commit wiring
  • Review docs changes
  • Post review

Codex's review already found and astubbs already fixed ten real issues (.bash coverage, the allowIf anchor, several stale-reference doc fixes, and — the most valuable one — the missing pre-commit registration for this gate). I verified those fixes are present in the current tree and are correct. Astubbs also asked codex a fourth focus question that, as far as I can tell from the visible thread, never got answered: "[scope: "added-files"] resolves a merge base against origin/master and never fetches. What happens with a stale ref, a shallow clone, or a fork PR?" I chased that one down and it's real.

Finding: new-shell-script's scope detection trusts an unguarded git merge-base that is provably wrong on a shallow clone

bin/check-source-patterns.mjs:

let mergeBase = null
try { mergeBase = sh('git', ['merge-base', 'HEAD', 'origin/master']) } catch { /* reported per rule */ }

No fetch, no shallow-repository check, no git cat-file -e origin/master^{commit} guard. I reproduced the exact failure mode in this review session (git rev-parse --is-shallow-repository → true here, since the review checkout is shallow): running git merge-base HEAD origin/master in a shallow clone doesn't error — this repo's own check-shallow-history hook intercepted it and reported "merge-base returned a commit that was not the merge base" as a measured fact, not a hypothetical. execFileSync('git', ...) inside this script bypasses that interactive-shell hook entirely, so a developer running bin/check-all.sh (or the pre-commit hook, which invokes it directly) from a shallow or narrowly-fetched clone gets a silently wrong "added files" list feeding the new-shell-script rule — the headline rule this PR adds. That's exactly the "silent wrong answer, not taste" failure class the PR's own bin/AGENTS.md section and commit messages argue against, reproduced in the mechanism meant to prevent it.

This repo already has the fix pattern, used by several sibling gates (check-copyright-headers.sh, check-issue-refs.sh, check-branch-self-reference.sh, check-quarantine-owners.sh): confirm the needed commit is actually present (git cat-file -e <ref>^{commit}, or git rev-parse --is-shallow-repository) and fail closed with exit 2 ("cannot run") rather than trusting merge-base's answer. check-source-patterns.mjs is the one new script in this PR that skipped that convention.

Related bug this causes: .githooks/pre-commit's soft-exit-code registration for this gate is wrong

GATES=(
    ...
    "check-source-patterns.mjs:"
    ...
)

with the comment above it claiming "check-source-patterns.mjs and check-action-versions.sh exit 1 on a finding [only]." That contradicts the script's own documented contract, right there in its header: // EXIT CODES follow bin/check-all.sh: 0 pass, 1 violation, 2 cannot run, 3 nothing in scope. Because the registry entry has no soft code for 2, the exact "cannot run" case above (whenever mergeBase genuinely can't be resolved, e.g. a fresh worktree or a single-branch fetch with no local origin/master) hard-blocks the commit instead of soft-skipping it — precisely the anti-pattern this hook's own header warns against ("blocking a commit because node is absent teaches people to bypass the hook"). Fix: "check-source-patterns.mjs:2", and correct the comment above the array.

Both are one-line-ish fixes; happy to make them if you'd like, since you only asked for a review here. Fix this →

Secondary, lower-confidence note (not a blocker)

Astubbs's focus area 1 to codex asked specifically about multi-line constructs and heredocs for the sigpipe-into-grep-q regex. The forbid pattern is line-anchored (^...[^\n]*...$/m), so a pipeline split across a line continuation (printf x | \ then grep -q foo on the next line) won't be caught, and a heredoc body line that merely contains | grep -q as literal data would be a false positive (only #-comment lines are excluded, not heredoc bodies). I believe both are carried over unchanged from the deleted check-shell-sigpipe.sh (also described as "line-oriented"), so this looks like pre-existing behavior parity rather than a regression this PR introduced — worth a one-line note in the rule's why if it hasn't been verified either way, but not something I'd hold the PR on.

Everything else looks solid

  • bin/check-all.sh's two discovery loops (gates, self-tests) both cover *.sh and *.mjs; the macOS self-test lane's shell-only loop is deliberate and already documented as such.
  • The reviewer-agent grant (bin/AGENTS.md) and CI compile-check/self-test wiring are consistent with what actually runs where.
  • The rule table itself (bin/lib/source-patterns.mjs) is well-commented, each row carries a why, and the self-test's must-NOT-match half is genuinely exercised (not just decorative).
    (branch)

THE CLAUDE REVIEW FOUND WHAT CODEX DID NOT, AND IT IS THE QUESTION CODEX WAS ASKED

`scope: 'added-files'` resolved a merge base with `git merge-base HEAD origin/master` and no guard. On
a SHALLOW CLONE that call does not error - it returns a commit that is not the merge base, exit 0 - so
the added-files list feeding the new-shell-script rule is silently wrong. Reproduced on a real shallow
checkout during review, not theorised; and reproduced again here before and after the fix.

That is the silent-wrong-answer class this whole PR argues against, occurring in the mechanism built to
prevent it. This repo already answers it elsewhere - check-copyright-headers.sh proves its fork point
with `git cat-file -e <ref>^{commit}` before trusting it - and this was the one new script that skipped
the convention.

Now it checks `--is-shallow-repository`, proves `origin/master` is actually present (a single-branch or
narrow fetch leaves no local ref, and merge-base's answer then means nothing), and FAILS CLOSED with
exit 2 when either check fails. A gate that cannot establish its baseline must say so; reporting "no
violations" because it could not look is the failure this file exists to prevent.

AND THE BUG THAT FIX WOULD HAVE CAUSED

.githooks/pre-commit registered this gate as "check-source-patterns.mjs:" - no soft exit codes - while
the script documents exit 2 as "cannot run". So the very case above would have HARD-BLOCKED every
commit on a shallow or narrowly-fetched clone, which is the anti-pattern that hook's own header warns
about: blocking a commit because the environment is incomplete teaches people to bypass the hook. Now
":2", with the comment above the array corrected to match the script's actual contract.

TWO KNOWN LIMITS OF THE SIGPIPE REGEX, STATED RATHER THAN LEFT IMPLIED

A pipeline split over a line continuation is not caught, and a heredoc body line containing `| grep -q`
as literal data is a false positive. Both are inherited from the line-oriented gate this replaced -
checked against it rather than assumed - so they are parity, not regressions. Recorded in the rule's
own `why` so nobody reads it as tighter than it is.
@astubbs

astubbs commented Sep 1, 2026

Copy link
Copy Markdown
Owner Author

Both findings fixed in 469f92c62. Thank you — the shallow-clone one is the best catch on this PR, and it was the focus question codex was asked and never answered.

Shallow / narrow-fetch merge base — fixed, and verified both ways. The script now checks git rev-parse --is-shallow-repository, proves origin/master is actually present with git cat-file -e origin/master^{commit} (a single-branch or narrow fetch leaves no local ref, and merge-base's answer then means nothing), and fails closed with exit 2. Verified by cloning this repo --depth 1 and running it there: exit 2 with cannot determine what this branch ADDED - the repository is a shallow clone; unchanged exit 0 on a full clone. It follows check-copyright-headers.sh's existing pattern, which as you say is the convention this one script skipped.

Worth naming why it stung: the PR argues that shell produces silent wrong answers, and this was a silent wrong answer in the gate written to prevent them.

Pre-commit soft code — fixed. "check-source-patterns.mjs:2", and the comment above the array corrected. You were right that the two findings interact: without this, the fail-closed fix above would have hard-blocked every commit on a shallow or narrowly-fetched clone — the exact anti-pattern that hook's own header warns about.

Line continuations and heredocs — checked, and it is parity. I verified against the deleted gate rather than assuming: it was grep -nE line-oriented with a second grep -v for comments, so a continuation-split pipeline escaped it too, and a heredoc body line was equally a false positive. Both limits are now stated in the rule's own why so nobody reads it as tighter than it is. Not a regression, but you were right that it was unverified.

The new-shell-script rule read `git diff <merge-base> HEAD`, which cannot see a file staged for its
first commit. The pre-commit hook is the one place this rule is meant to stop a new shell script BEFORE
it lands, and there it saw nothing - so it allowed exactly the addition it exists to reject, leaving CI
to catch it after the fact. Local enforcement of the PR's headline rule was silently ineffective.

Found by the codex review on #401, filed P2. It is a functional hole in the
rule rather than a polish item: the gate ran, reported clean, and was wrong.

Now the union of committed and staged additions, deduplicated - the hook sees the staged file, CI sees
the committed one. Verified by staging a new bin/*.sh and watching the rule reject it, then unstaging
and watching it go clean again.
astubbs added a commit that referenced this pull request Sep 1, 2026
…rong answer, not a polish item

I had stopped at the P1s because the batch was large, which is not a reason. Working through them, none
of the three is cosmetic: each makes the tooling report something confidently wrong.

STAGED FILES WERE INVISIBLE TO THE NEW-SHELL RULE (arrives via the #403 merge)

`git diff <merge-base> HEAD` cannot see a file staged for its first commit, so at the pre-commit hook -
the one place the rule is meant to stop a new shell script BEFORE it lands - it saw nothing and allowed
exactly the addition it exists to reject. Now the union of committed and staged additions. Verified by
staging a new bin/*.sh, watching the rule reject it, and watching it go clean when unstaged.

A RUN THAT GAINED A TEST CASE LOOKED FASTER

Summing every <testcase> means a larger denominator for a reason that is not performance: a
parameterised control picking up one more @EnumSource value inflates the control total and makes the
ratio look healthier, which can mask a real subject regression. The check now compares the CASE SET
identity between this run and each reference, and refuses a run whose workload differs rather than
averaging the difference in and calling the result a verdict. When that leaves nothing comparable it
says so - naming the runs and the reason - instead of falling back to a number.

A TIMED-OUT LargeVolumeInMemoryTests REPORTED NOTHING

Control flow left before the reporter, so the failing case produced no rate at all - and because
earlier parameterised cases have already emitted this class's label, bin/performance-test.sh's "NOT
MEASURED" check could not notice the missing failing case either. Silent twice over. It now reports on
the failing exit and rethrows unchanged, matching what the other performance classes already do.
@astubbs
astubbs merged commit 1f25f49 into master Sep 1, 2026
31 checks passed
@astubbs
astubbs deleted the ci/node-first-tooling branch September 1, 2026 12:13
astubbs added a commit that referenced this pull request Sep 1, 2026
…-multi-consumers-bug

Brings in #403 ahead of its own merge, because #401
is stacked on it and is wanted here.

WHAT IT CHANGES FOR THIS BRANCH

Node becomes the default for NEW scripts in bin/, enforced by check-source-patterns.mjs against the
merge base. Three scripts on this branch are new relative to master and were therefore caught -
torture-overnight.sh, its self-test, and soak-deadlock-probe.sh. They predate the rule; they are
"new" only because this branch has not merged yet. Each now carries a shell-justified reason written
per script rather than boilerplate, and the torture harness's names its own weakness: the verdict
logic is the part the rule is actually aimed at, it has been wrong three times, and if it grows
further it should move to .mjs rather than be defended by a comment.

check-hot-log-args.sh AND ITS SELF-TEST ARE DELETED

Operator ruling. One bespoke script for one pattern is exactly what bin/lib/source-patterns.mjs
replaces - the incoming PR's own argument is that a rule should be a row rather than a script - and
the rule was NOT carried over as a row. That leaves a real gap: nothing mechanical now catches the
eager log-argument form being written at a new call site. It is recorded as a known gap in three
places rather than quietly dropped, and the cheap fix if it ever bites is a row, not another script.

HotPathLogArgumentsAreDeferredTest survives and is the stronger of the two guards anyway: it asserts
the SLF4J behaviour the fix RESTS on, which a source check cannot see.

Six references to the deleted gate were updated - two docs, a test javadoc and a main-code comment.
The javadoc's claim that the shortfall was "the leading candidate" for the regression was corrected
in the same pass: it has since been measured, so that wording was stale.

NOTED, NOT FIXED: check-all.sh reported one violation where the gate itself reported three. Running
bin/check-source-patterns.mjs directly showed all of them. A summary that under-reports is worth
knowing about in the script whose purpose is that the set of gates cannot drift silently.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UH2q829FDKQcqQseE8Cp7q
astubbs added a commit that referenced this pull request Sep 1, 2026
…mption-multi-consumers-bug

Brings in #401, which is stacked on #403 (merged
here in the previous commit).

WHAT ARRIVES

A throughput regression check that normalises the subject against the neighbour classes in the SAME
run, so a slow runner and a slow tree stop looking alike - which is exactly the control that had to be
applied by hand to diagnose the control-loop defect on this branch. It ships as .mjs, conforming to
the Node-first rule that arrived in the previous merge, with its verdict logic in a shared lib and a
self-test that pins the bounds. Also wires throughput reporting into the three performance classes
that previously emitted no figure, so the lane measures more than the two tests it started with.

WHY IT IS HERE RATHER THAN AWAITED FROM MASTER

Asked for directly. The earlier recommendation on this branch was to wait for it to land on master and
pick it up with an ordinary master merge, on the grounds that this PR's own lane would gain nothing
its parent PR's lane does not already provide. That reasoning is recorded rather than deleted, and the
operator's call overrides it.

ONE PLAN INSIDE IT IS NOW UNRUNNABLE AS WRITTEN, AND SAYS SO

perf-validate-the-regression-check-against-a-known-defect.md planned a red/black experiment whose
step 2 required this branch to pick up the CHECK without the FIX. This branch has held the fix since
5ed8856, so its lane can only produce the black arm now. Rewritten to say that, and to state what a
red arm would now cost: a throwaway branch reverting the single log line, which is still the only
variable. Nothing was lost by accident - the threshold had already been settled from recovered CI
history, which demoted that experiment from source-of-the-threshold to confirmation before the
ordering could matter.

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

ZERO CONTENT CHANGE, AND THAT IS THE EXPECTED RESULT RATHER THAN A SUSPICIOUS ONE

Master gained exactly one commit since this branch last merged it: the squash of
#403. This branch had already merged that PR's own branch
(ci/node-first-tooling) directly, so both sides carry identical content by different history - the
squash on master, the original commits here.

`git diff HEAD` after the merge is empty. No conflicts, nothing staged. The merge is a pure history
join that tells git the two lines agree, which is what stops the next master merge from trying to
re-apply the same change.

WHY THIS WAS WORTH CHECKING RATHER THAN ASSUMING

A squash-merged PR's commits are not on master, so a branch that merged the pre-squash commits and a
master that merged the squash look like divergent work on the same files - here, 34 overlapping ones.
That normally produces conflicts or, worse, a clean merge that silently reverts one side. Verified it
did neither: the working tree is byte-identical to the pre-merge tree, both sides' additions are still
present (check-source-patterns.mjs and its lib from #403,
check-throughput-regression.mjs and its lib from #401), and the deliberately
deleted check-hot-log-args.sh has not come back.

PRE-MERGE CHECKS AGENTS.MD REQUIRES

Not a shallow clone. The io.confluent -> bz.stub rename is already applied on this branch, checked
with the prescribed `grep -rnE 'io[./]*conflu'` rather than the habitual literal - the only surviving
matches are the historical prefix mappings inside bin/check-copyright-headers.sh, which are meant to
be there. All gates pass.

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

Picks up the squash of #401, which landed on master minutes after the
previous merge took #403's.

MASTER'S VERSION WAS NEWER THAN THE BRANCH THIS HAD ALREADY MERGED, AND MASTER WINS

This branch merged ci/perf-throughput-baseline directly at 161d768. The squash on master carries
later refinements that never reached that branch ref: a shared ThroughputReport helper extracted into
test utils, the four performance classes slimmed to call it instead of reporting inline, and a
substantially reworked check-throughput-regression.mjs. Six files conflicted, all of them the same
add/add shape - the pre-squash commits here against the squash there.

HOW EACH WAS RESOLVED, AND WHY NOT WITH A BLANKET --theirs

Five files turned out to be pure old-astubbs/parallel-consumer#401 content with no edits of this
branch's own - checked by diffing each against 161d768 rather than assumed - so master's newer
version was taken whole and each was verified byte-identical to master afterwards. There was nothing
of ours in them to lose, which is the only condition under which taking one side wholesale is safe.

The sixth, perf-validate-the-regression-check-against-a-known-defect.md, DID carry an edit of ours:
the rewrite recording that the note's red/black sequence can no longer run here, because this branch
now holds the fix as well as the check. Master's copy of that file is byte-identical to the old base -
it never touched it - so ours is that base plus the rewrite, a strict superset. Kept ours, and
confirmed the rewrite survived.

VERIFIED AGAINST BOTH PARENTS, NOT ONE

A resolution that drops one side reads as clean from the other, so: no conflict markers anywhere;
ThroughputReport.java, check-throughput-regression.mjs and all four performance classes identical to
master; the diff against master contains only this branch's own work. Gates pass and the module
compiles, which matters here because those test classes were rewritten to call the extracted helper.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UH2q829FDKQcqQseE8Cp7q
astubbs added a commit that referenced this pull request Sep 1, 2026
…mode-battle-test

#262's declared parent had moved a long way: #257 has since merged master up to
#403, so taking it also takes nearly all of master, and 262's own CONFLICTING state against
master goes with it. 846 files, nine conflicts.

Package rename: both sides were already on `bz.stub.*`, so the merge was ordinary and
`bin/rename-packages.sh` was not needed. Verified by `git ls-tree -d` on all three refs before
starting, not assumed.

Conflicts, and which side won:

- ProducerManager - TAKE 257. Master has already absorbed 262's produce-callback fix and improved it:
  the callback is hoisted to a `sendCallback` field with the reasoning in javadoc rather than a
  comment, and it carries the fact 262 established last (Kafka's own ProducerBatch catches and logs
  whatever a callback throws, so the throw was only ever observable on the synchronous doSend path).
  262's local copy is deleted as the duplicate it now is. `InternalRuntimeException` is
  `PCInternalRuntimeException` on master; the three places 262 still named the old class are renamed.

- AbstractParallelEoSStreamProcessor#cleanUpContext - BOTH. Code takes 262's catch-and-log, which
  master does not have: this runs in runUserFunction's `finally`, and a throw from a finally REPLACES
  the exception the catch above is propagating, destroying the user function's real failure. Javadoc
  takes 262's correction (an ExternalEngine can never reach here holding a produce lock - its
  constructor rejects PERIODIC_TRANSACTIONAL_PRODUCER, so 257's claim that this is that path's only
  release is wrong) plus 257's new paragraph on the lock being taken rather than read.

- KafkaClientUtils#createNewProducer - BOTH, and neither could just win. 262 added a typed
  (mode, transactionTimeout, stableTransactionalId) overload; master added (mode, Properties
  overrides). The auto-merged body already used all three parameters, so both overloads now delegate
  to one private four-arg builder.

- TransactionalPartialResultSetIT - add/add, TAKE 257 plus one thing. 257's is the reviewed
  descendant of the same test: it pins MAX_REQUEST_SIZE_CONFIG rather than inheriting it, holds
  POISON_KEY to NONE rather than all-or-none (its oversized result can never be sent, so isAnyOf(0, n)
  would also accept a full set that cannot physically exist), and uses commons-lang3 `repeat` instead
  of a local Java-8 helper. Only 262's `@Timeout(600)` guard is carried over.

- ProducerManagerTest - TAKE 262's extracted `acquireProduceLockInto` /
  `assertProduceLockStillOwnedByContext` helpers over 257's inline copies of the same code and
  comments; the fact 257's comment had and the helper javadoc did not (#257 made cleanUpContext
  the ONLY release point) is folded into the javadoc.

- ProduceLockReleaseTest, WorkContainer - imports only.

- docs/quarantined-tests.md is now EMPTY, by two independent routes meeting. #351 diagnosed and
  fixed OffsetEncodingBackPressureTest on master (it asserted an offset back pressure exists to stop
  advancing), and this branch performs its own rule-3 re-enable of
  ProducerManagerTest.producedRecordsCantBeInTransactionWithoutItsOffsetDirect. No @Quarantined
  annotation remains anywhere in the tree and the registry check confirms 0 entries.

- docs/inflight/test-untracked-ci-flakes.md - master's rows (both entries 262 knew about are fixed and
  gone; simpleBatchTest and processInKeyOrder are new) plus 262's now-current account of the
  BlockedThreadAsserter collision. Fixed a blank line that was splitting the table in two.
  Worth flagging for the handoff: master's new `processInKeyOrder` section is about one of the three
  unexplained failures this branch pushed with at 48d210f, and says it is a solved flake still
  firing rather than a fresh one.

- docs/inflight/pr-blockers-and-collisions.md - master's collision list, plus 262's transactional-stack
  section updated for reality: #261 merged on 2026-08-14, so the chain is now two PRs, not
  three. 261 is named rather than deleted because a reader who knows the stack as three links needs
  telling which one is already master.

Verified locally: full-reactor `test-compile` green (main and both test source roots),
check-quarantine-registry 0 entries, check-issue-refs clean. The unit suite has not run yet.
astubbs added a commit that referenced this pull request Sep 1, 2026
… only, no content

Records that this branch's work has already landed on master by other routes, so
that it can be deleted and so a later merge attempt is a no-op rather than the 74
conflicts a content merge raises. `-s ours` deliberately: every one of its twelve
commits was audited against origin/master and nothing survives the audit.

WHY IT LOOKED LIKE STRANDED WORK. It was branched 2026-08-19 from a46b7df, a
mid-stack commit on fix/909-load-reproduction - which became #322 and merged
2026-08-26 as cf2741c. A child cut from a PR that merged a week later and was
never rebased, so it carries its parent's confluentinc#909 ancestry as a fossil while
the real version went in through #322. That is the whole explanation for both
the 114-commit lag and the conflict count.

WHERE EACH COMMIT ACTUALLY LIVES NOW:

  2e22e83 ShardManager through the module   identical patch-id on master
  30c09a3 broker-level reproduction         via #322 - RegistrationRaceStaleResidentIT
                                              and PausableInsertShardManager are on master,
                                              which is why they conflicted add/add
  6982b9f the third precondition            relocated to docs/solutions/logic-errors/
                                              909-needs-a-saturated-pipeline-...-2026-08-19.md
  92c9a73 refuse a merge with work in flight .claude/hooks/check-merge-outstanding-work.sh
  b1b7a47 hooks simplify + self-test fix    both halves on master: the `*merge*` pre-filter,
                                              and the `fails`->`failures` fold whose absence
                                              made the suite unable to fail
  e8db3c5 ShardKey javadoc contradiction    master's KeyOrderedKey carries the correction
  9013c47 drop the ShardKey refactoring row  followed it
  a46b7df agent self-review as PR comments  renamed next- -> ci-agent-self-review-...
  f7f558a index open work by cost           superseded - inject-recorded-knowledge.sh does
                                              this from bin/lib/inflight-tags.sh
  2db9a51 give every note a priority        superseded by the impact axis
  ddf6465 classify by consequence           superseded - see below

THE ONE GENUINELY UNIQUE THING, AND THE DECISION IT SETTLES. The branch proposed a
single consequence axis, `<!-- inflight-class: X -->`. Master went the other way and
shipped three - inflight-type, inflight-impact, inflight-labels, plus inflight-state
for disposition - with bin/lib/inflight-tags.sh as their single source, a gate in
bin/check-inflight-tags.sh, and the session index consuming the same lib. The
successor even carries the branch's own sentence forward verbatim, "Classify by
CONSEQUENCE, not by what kind of file it is", and then splits it. Three axes win: a
single axis cannot say that a feature addressing a crash belongs beside the crashes,
which is the case bin/lib/inflight-tags.sh's header calls out by name.

Sixty-five of the seventy-four conflicts were nothing but those two schemas meeting.
Resolving them would have meant re-deciding the taxonomy sixty-five times.

NOTHING IS LOST BY TAKING NO CONTENT. Thirty-six files exist on the branch and not on
master; all are stale names from master's later prefix rework (next- and parked- into
core-, ci-, release-, upstream-), two are the sigpipe scripts #403 deliberately
folded into a rule row, one is a workflow 025d0b7 deleted on purpose, and three are
Java classes present on master at other paths. The single note that is real open work
and genuinely absent from master -
bug-retry-queue-orphaned-by-inline-stale-removal.md, a distinct defect from master's
bug-stale-sweep-iterator-evicts-fresh-replacement.md - is carried on fifty-six other
refs, so it lands with whichever of those merges and cannot be stranded by this.

Merged here rather than to master because #400 is where the harness-survey
context lives, and the taxonomy question is the same question that PR is answering.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UTX8obQMsjs9kq2rkpU5cZ
astubbs added a commit that referenced this pull request Sep 2, 2026
Ten commits, no Java overlap - master's core work (#257's produce-lock
handover, #393's thread-confined consumer) is nowhere near the offsets
package this branch changes. All three conflicts were in docs, and all three
were two ledgers being appended to from both sides on the same day.

WHAT THE RESOLUTION KEPT

Both flake ledgers gained entries from master AND from this branch on
2026-09-01, so every conflict resolution keeps both sides rather than choosing
one:

- test-load-tightness-flakes.md: master's inFlightMessagesCommittedIfProcessed-
  DuringShutdown[1] paragraph and this branch's committedOffsetRemoved[1] latest
  recurrence are about different tests and neither supersedes the other.
- test-untracked-ci-flakes.md: both sides added a processInKeyOrder row for
  sightings on the same day from different branches. Merged into one entry
  rather than two, because two rows under one test name is exactly the
  conflation master's own section warns against. This branch's four sightings
  are folded in as a sub-section of master's [3] bullet, where they turn "seen
  once, not reproduced" into a control-armed contention finding - and master's
  isolated-run result stops reading as a contradiction, since isolation removing
  the failure is what the contention reading predicts.
- refactoring.md auto-merged: master deleted the produce-lock double-release
  OPEN QUESTION entry because #257 answered it.

TWO REPAIRS MADE WHILE IN THERE

Master's table had a blank line between two rows, which markdown renders as two
tables with the second missing its header. Closed up.

The JStream entry said "delete this entry when #116 lands" - a marker
docs/inflight/AGENTS.md explicitly forbids on master, because the merge is the
moment nobody is looking here. Replaced with the migrate-rather-than-delete
outcome that doc names, and the attestation block it opened is now closed
rather than running into the next section's.

INHERITED AND READ

#403 makes Node the default for new bin/ scripts and deletes
check-shell-sigpipe.sh; #382 rewrites the hook guards to derive identity
from the command rather than the session; a new core AGENTS.md binds @GuardedBy
to any field change in the engine. This branch adds no scripts and changes no
shared field, so none of the three change what it does - recorded because a
green build is not evidence the ground under a design held still.

AND ONE FIX THE MERGE COULD NOT BE COMMITTED WITHOUT

#403's new bin/check-source-patterns.mjs refused this merge commit,
reporting seven of #381's experiment runners as new shell scripts and
advising --no-verify. They are master's, already grandfathered there, and this
branch never touched them.

The cause is that its `added-files` scope is the union of committed and staged
additions against the merge base - and while a merge is staged but not yet
committed, HEAD is still the pre-merge tip, so every file master added since
the branch was cut is an addition against that base. It corrects itself the
moment the merge commit exists, which is why nothing on master has seen it: it
fires only in the window where the fix has to be applied.

Membership of origin/master settles it without needing to know about merges at
all - a path already there is not new to this repository, whoever staged it -
so the subtraction lives in bin/lib/added-files.mjs as a pure function of three
lists. That placement is what lets it be tested by control pair like every rule
in the table, instead of standing up a fixture repository, which is the reason
the runner had no test to break. The four must-NOT-match cases are red-proven
against the pre-fix implementation.

Carried here rather than split out because the alternative was committing this
merge with --no-verify, and a gate that fires on somebody else's merged work
teaches exactly that bypass.
astubbs added a commit that referenced this pull request Sep 2, 2026
Master's Node-default ruling for new scripts in bin/ (bin/lib/source-patterns.mjs, landed
2026-09-01 on #403) fires on this branch's self-test, because the
gate reads NEW as "added since the merge base" and merging master moved that base under a
file written well before the rule existed.

Taking the shell-justified escape hatch rather than porting, on the ruling's own reasoning:
it grandfathers existing scripts, is explicitly not a migration backlog, and says churn is
its own risk. bin/test-release-notes.sh is the release renderer's only safety net and the
port is not this PR's subject.

Left deliberately visible rather than silent - the justification names the rule and the date,
so a later sweep can find it and decide the port on its merits.
astubbs added a commit that referenced this pull request Sep 2, 2026
… port

bin/release-notes.py landed the same day the Node-default ruling did (bin/lib/source-patterns.mjs,
#403), which says the repo already chose Node over Python. The gate matches only sh|bash,
so nothing flagged the .py; the .sh beside it carries a shell-justified: line. Owner's ruling,
2026-09-02: let it ride, port later. This line is where that decision lives, so the next sweep
finds a decision rather than an oversight.

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