Skip to content

docs(changelog): generation covers 0.6.0.0 now, not "from the next release on" - #210

Merged
astubbs merged 5 commits into
masterfrom
docs/changelog-policy-wording
Aug 6, 2026
Merged

docs(changelog): generation covers 0.6.0.0 now, not "from the next release on"#210
astubbs merged 5 commits into
masterfrom
docs/changelog-policy-wording

Conversation

@astubbs

@astubbs astubbs commented Aug 6, 2026

Copy link
Copy Markdown
Owner

Description

The changelog policy from #113 is correct. Only its stated timing is wrong, and the wrong timing has already misled a reader.

#113 (e3b1601e) moved the changelog off per-PR entries and onto release-time generation from the commit log. The sentence it wrote to describe that says:

Everything up to and including == 0.6.0.0 is hand-written and now frozen; from the next release on, each section is generated at release time from the commit log and then frozen in turn.

That puts 0.6.0.0 on the hand-written side of the line and starts generation after it. Generation is in effect now, and 0.6.0.0 is the release it applies to. git log -S "from the next release" confirms e3b1601e is the sole origin of the phrase; it reached three locations, and a fourth file had already copied the claim.

Why the wording, not just the fact, is the bug

An agent read it this week and concluded "0.6.0.0 is frozen, therefore v6 ships with whatever is written under that heading now." Both halves of that follow from the sentence as written.

The trap is that "frozen" is doing two jobs in one word. It is a statement about text in a file - do not add to it - and it reads as a statement about a release - settled, quotable, final. The rewrite separates them and hangs the state on a fact the reader can check: has the release shipped?

Section State
== 0.5.x and below Hand-written pre-fork legacy, shipped. Frozen.
== 0.6.0.0 - the release being cut Not shipped, so not settled. Working text; regenerated from the commit log at release time, frozen only once v6 ships.
Every release after Same: generated when cut, frozen once shipped.

Both wrong readings are then named and denied outright, rather than left to be inferred - a reader who has already formed one will not give it up to an implication.

The exception that had to be inferred, and now doesn't

"Do not add entries in a feature PR" does not obviously permit a correction - yet #198 made one, changing a Dependencies entry that claimed the Kafka client stayed on 3.9.1 after the pom had moved to 3.9.2. The rule is now explicit, with a test an author can apply:

In a PR the changelog is never added to. The one edit a PR may make is correcting a factual error in text that is already there. Changing an existing claim to be true is allowed; adding information about a change is the generator's job.

Before / after

Location Was Now
AGENTS.md § Changelog "Everything up to and including == 0.6.0.0 is hand-written and now frozen; from the next release on, each section is generated…" "Release-time generation is in effect now, and it covers 0.6.0.0 itself" + the shipped/not-shipped table + the two explicit anti-readings + the correction exception
AGENTS.md "where things live" row "Frozen up to == 0.6.0.0; later sections are generated at release time" "Sections for shipped releases are frozen; the section for the release being cut - == 0.6.0.0 included - is regenerated at release time … what is under it today is working text, not the notes v6 will publish"
CHANGELOG.adoc header NOTE:: "Everything up to and including 0.6.0.0 is hand-written and frozen. From the next release on, each section is generated…" "A section is frozen once its release has shippedThat includes 0.6.0.0 below: it has not shipped, so what you are reading there is working text and not the notes that release will publish"
docs/inflight/release-0600-blockers.md (4th site, already copied) "CHANGELOG.adoc is frozen up to == 0.6.0.0" "not a per-PR chore, and the == 0.6.0.0 section is not final … do not quote it as the release notes"

README.adoc is untouched and needs no regeneration - #113 stopped it embedding the changelog, and neither it nor src/docs/README_TEMPLATE.adoc restates the policy (verified). The == 0.6.0.0 section's content is deliberately not edited; regenerating it is release-time work.


Second defect: the changelog gate note was false when written

The same section claimed:

Still live, and now inert: … Since PRs no longer touch the file, it should never fire.

Four open PRs modify CHANGELOG.adoc right now - #51, #57, #105, #106 - all opened before #113 merged (verified via gh pr view --json files). Every PR predating the policy is in the same position.

Worse, the gate never enforced the policy in the first place, and misses in both directions:

The note now states this, and says plainly that a green gate is not compliance with the rule.

My call on tightening it: don't - documented instead

Reasoning is inlined in the AGENTS.md gate subsection itself, so a reader gets it without a second hop. The scope of the gate is unchanged and the citation check is not weakened. Three reasons:

  1. The distinction the policy turns on is not mechanically detectable. "Adds an entry" and "corrects an entry" are both +* lines. The gate's own header records that fuzzy-matching removed bullets against added ones was built, became the largest and subtlest part of the file, and still mispaired entries built from a common template. Re-deriving it repeats known-failed work.
  2. A blanket rule would be enforced by the honour system anyway. Its only escape is changelog-ref: N/A - <reason>, a self-declared line in the PR body. The same line that legitimises a correction legitimises a policy-violating addition - so the strict gate buys no enforcement over the written rule, and costs an opt-out line on every legitimate correction.
  3. It would fail four PRs opened in good faith. feat: support virtual threads (#190, upstream #896) #51, fix: unbounded PCMetrics heap growth (#120, upstream #859), offset reset after rebalance (#121, upstream #894), and no hot-shard metric #57, perf(ci): pack the unit-test fork tail - run the slowest classes first #105 and perf(offsets): stop walking every offset when only distance-based encoders are active #106 followed the rule that was live when they were written.

If entries do start reappearing after 0.6.0.0 ships, the mechanically honest version is a warning, not a gate: any CHANGELOG.adoc change posts a comment asking the author to confirm it is a correction. No false failures, and it teaches the policy at the point of edit rather than at a release-time merge conflict.


changelog-ref: N/A - the only CHANGELOG.adoc change is the header NOTE:: describing how the file is maintained. No entry is added, edited or removed.

Checklist

  • Docs updated - the wording fix, plus the gate-scope reasoning inlined in AGENTS.md
  • Tests added/updated - N/A, no behaviour change; .github/scripts/changelog-ref-gate.test.js was run and passes unchanged
  • Title & body reflect the final content of this PR
  • Self-hosted runner / security implications considered - N/A, no workflow or runner change (the gate is described, not modified)

One test kept from the review-gate work

An earlier revision of this PR also fixed bin/check-review-posted.sh:94 - printf | grep -q under set -o pipefail, which reports failure exactly when it matches, because grep -q exits on the first hit and pipefail promotes the writer's EPIPE. That fix has since landed on master via #211, so it is no longer part of this diff - merging master resolved it to a no-op.

What survives here is case 13 in bin/test-check-review-posted.sh: a match followed by >64 KiB of further comments must still pass.

It is worth keeping alongside #211's guard rather than being redundant with it. That guard is static - it greps bin/*.sh for a literal | grep -q. This case is behavioural: it drives the checker with a real oversized payload and asserts exit 0, so it catches a regression that reintroduces the failure by any route the static grep does not recognise.

The existing suite could not have caught the original bug: case 5 buries the match in a multi-line body but keeps it small, and case 6 puts the match last, so nothing follows it to fill the pipe buffer.

References

Qualified as astubbs#NN throughout, per the gate added in #114 (735b1d3a), which merged after this branch was written. The fork's numbers sit inside upstream's range, and #114 found 48 that exist in both repos meaning different things.

Known-red check

Check PR Dependencies does not report on this branch - it needed an admin bypass to push. Unrelated to this PR's content.

…lease on"

#113 moved the changelog from per-PR entries to release-time generation. The
policy is right; the sentence describing it put 0.6.0.0 on the wrong side of the
line. "Everything up to and including == 0.6.0.0 is hand-written and now frozen;
from the next release on, each section is generated" reads as: v6 is finished,
generation starts with v7. Generation is in effect now and 0.6.0.0 is the
release it applies to.

The misreading is not hypothetical - an agent hit it this week and concluded
that whatever currently sits under == 0.6.0.0 is what v6 ships with. The trap is
that "frozen" is doing two jobs in one sentence. It is a statement about text in
the file (leave it alone) and it reads as a statement about a release (settled,
quotable). The rewrite splits them: a section's state follows from whether its
release has SHIPPED, and 0.6.0.0 has not, so its contents are working text that
release-time generation will replace. Both wrong readings are named and denied
explicitly, because a reader who has already formed one will not give it up to
an implication.

Also states the exception that previously had to be inferred. "Do not add
entries in a feature PR" does not obviously permit a correction, and #198 made
one - the Kafka client entry said 3.9.1 after the pom moved to 3.9.2. The test
is now written down: changing an existing claim to be true is allowed, adding
information about a change is the generator's job.

Three locations carried the phrase (AGENTS.md's Changelog section and its "where
things live" row, and the CHANGELOG header NOTE). A fourth, in
docs/inflight/release-0600-blockers.md, had already copied it. README.adoc is
unaffected - it stopped embedding the changelog in #113 and only links to it.

Separately, the same section claimed the PR Checklist changelog gate "should
never fire ... since PRs no longer touch the file". That was false when written:
#51, #57, #105 and #106 all modify CHANGELOG.adoc and all predate the policy.
The gate also does not enforce the policy in either direction - it only fails
UNCITED entries, so #57's cited entries would pass while violating it, and it
cannot tell an edit from an addition, so a correction like #198's trips it and
needs the changelog-ref: N/A opt-out.

The gate is left alone deliberately, with the reasoning in
docs/inflight/ci-changelog-gate-scope.md. Rejecting every addition would fail
the one edit the policy permits, since "adds an entry" and "corrects an entry"
are both +* lines - the gate's own header records that fuzzy-matching removed
bullets against added ones was built, and abandoned as its subtlest code. And
the strict version's only escape is a self-declared PR-body line, so it would
buy no enforcement over the written rule while putting an opt-out on every
legitimate correction, and would block four PRs that followed the rule that was
live when they were opened.

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

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown

Dependency Review

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

Scanned Files

None

@claude

claude Bot commented Aug 6, 2026

Copy link
Copy Markdown

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


Review complete ✅

Tasks

  • Gather context (diff, changed files, AGENTS.md/CLAUDE.md guidance)
  • Review AGENTS.md changes
  • Review CHANGELOG.adoc changes
  • Review docs/inflight/ci-changelog-gate-scope.md (new file)
  • Review docs/inflight/release-0600-blockers.md changes
  • Verify factual claims in PR body
  • Post final review

Summary

Docs-only PR, one commit, no behaviour change. It corrects a genuine ambiguity left by #113: the old wording ("frozen ... from the next release on, each section is generated") put 0.6.0.0 on the hand-written/frozen side of the line, when in fact release-time generation applies to 0.6.0.0 itself. The rewrite fixes this consistently across all three original sites plus the fourth location that had already copied the stale phrasing, and adds an explicit "shipped vs not-shipped" framing that's easy to check.

Verification performed

I independently checked the load-bearing factual claims rather than taking the PR body at face value:

Observations (non-blocking)

  • The decision to leave the gate unchanged (documented in docs/inflight/ci-changelog-gate-scope.md) is well-reasoned: the edit-vs-addition distinction isn't mechanically detectable without repeating the fuzzy-matching approach the gate's own header says was tried and abandoned, and a stricter gate would only be enforced by the same honour-system opt-out it already has.
  • The PR title focuses on the primary "0.6.0.0 timing" fix; the second workstream (the false "gate is inert" claim, and the new inflight doc) is real scope in this diff but isn't reflected in the title. The commit body and PR description both cover it fully, so this is a minor readability nit at most, not a completeness problem.
  • No code, workflow, or test files are touched — consistent with the checklist's "N/A, no behaviour change."

No bugs or factual errors found. The rewording is internally consistent (AGENTS.md's two spots, CHANGELOG.adoc's NOTE, and release-0600-blockers.md all agree with each other and with the actual repo state), and every checkable claim in the PR body held up.

@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown

✅ Duplicate Code Report

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

✅ PMD CPD

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

No new clones introduced by this PR.

✅ jscpd (language-agnostic)

PR Base Change
Clones 75 75 ➖ 0
Duplicated lines 1087 1087 ➖ 0
Duplication 3.24% 3.24% ➖ 0
Rule Limit Status
Max duplication 5% ✅ Pass (3.24%)
Max increase vs base +0.1% ✅ Pass (+0.00%)

No new clones introduced by this PR.

Powered by astubbs/duplicate-code-cross-check

@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown

📌 Duplicate code detection tool report

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 54.27 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 40.23
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PCRetriableException.java 36.86
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 36.83
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 35.15
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 35.13
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 35.13
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 33.94
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 60.98 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 54.77 ⚠️
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 40.4
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 37.06
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 32.69
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 31.45
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 60.98 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 50.67 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 36.76
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 32.44
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 31.64
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 30.2
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PCRetriableException.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 54.27 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 53.15 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 44.85
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 34.9
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 33.55
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 30.9
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 30.9
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalRuntimeException.java 30.85
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerOptions.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 54.77 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 50.67 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 45.51
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 33.94
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 33.02
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 31.13
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 45.51
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 37.06
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 36.76
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 32.63
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContext.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 33.94
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/RecordContextInternal.java 33.12
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 32.69
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContext.java 32.33
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 31.64
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/RecordContextInternal.java

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 60.5 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 53.15 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 50.84 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 48.73
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 40.23
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalRuntimeException.java 39.58
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 37.14
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 33.78
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 33.78
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PCRetriableException.java 33.06
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalRuntimeException.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 39.58
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 31.5
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 30.85
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/PCModule.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerOptions.java 32.25
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/ProducerManagerTest.java 30.55
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 51.59 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 37.51
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 37.51
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 37.14
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 35.15
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 34.9
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 32.75
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 60.5 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 51.59 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 48.33
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 47.19
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 47.19
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 46.67
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 44.85
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 36.83
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalRuntimeException.java 31.5
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 48.73
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 46.67
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 45.26
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 38.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 38.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 50.84 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 48.33
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 45.26
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 33.94
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 33.55
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 32.75
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 31.52
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 31.52
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 63.46 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 47.19
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 38.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 37.51
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 35.13
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 33.78
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 31.52
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 30.9
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 63.46 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 47.19
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 38.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 37.51
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 35.13
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 33.78
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 31.52
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 30.9
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/PartitionState.java

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 44.15
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 41.11
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 38.65
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/RebalanceEoSDeadlockTest.java

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 60.67 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 46.95
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 41.11
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 60.67 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 55.48 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 44.15
parallel-consumer-vertx/src/test-integration/java/io/confluent/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 39.17
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java 32.51
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerCommitTimeoutTest.java 32.43
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CoreBatchTest.java

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

File Similarity (%)
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorBatchTest.java 52.04 ⚠️
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyBatchTest.java 50.74 ⚠️
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/VertxBatchTest.java 44.86
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/BatchTestBase.java 30.61
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerCommitTimeoutTest.java

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerEarlyCloseTest.java 52.92 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerCommitTimeoutTest.java 49.53
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java 46.92
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerCommitTimeoutTest.java 56.99 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerEarlyCloseTest.java 55.45 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerSaslAuthenticationTest.java 46.92
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CommitRejectionTestBase.java 32.51
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/ParallelEoSSStreamProcessorRebalancedTest.java

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

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

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/DrainingMemberRebalanceIT.java 31.37
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/ExceptionConstructorsTest.java

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 41.54
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 40.4
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 39.88
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelStreamProcessor.java 35.45
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 32.44
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java

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

File Similarity (%)
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 39.88
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelStreamProcessor.java 39.32
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 32.63
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 31.45
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 30.2
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java

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

File Similarity (%)
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelStreamProcessor.java 41.7
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 41.54
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/ExternalEngine.java 39.55
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelStreamProcessor.java

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

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

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

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

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

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

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

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

@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown

✅ SpotBugs Report

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

astubbs and others added 2 commits August 6, 2026 12:53
The note said what the AGENTS.md subsection above it already said. Its one
unique contribution - why tightening the gate to reject every addition was
rejected - now sits inline where the gate is described, so a reader gets the
reasoning without a second hop.

docs/inflight/ tracks work that is open and needs picking up. This is a settled
decision with its rationale, which is what AGENTS.md is for. A note recording a
decision already made is the stale-marker failure that directory's own charter
warns about.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RtNUsxokE9g2pSEjBHZqNA
check-review-posted.sh:94 ran `printf | grep -q` under `set -o pipefail`. grep
exits the instant it matches, printf then dies with EPIPE (141), and pipefail
promotes that to the pipeline's status - so a comment citing the run made the
check fail. It only bites when more than one pipe buffer (64 KiB) of comment
data follows the match, which is why it looked intermittent.

Observed on #198, #199, #204 and #210. On #210 the review comment sat 4.7 KB
into the stream with a 127 KB similarity report behind it; the job log carries
`printf: write error: Broken pipe` directly above the failure. The emitted error
blamed the workflow-validation guard, which none of those PRs had tripped.

The fix is the herestring this repo already prescribes: the same bug class is
guarded against in bin/test-check-copyright-headers.sh, whose comment records it
"seen live in CI". check-review-posted.sh shipped in that same commit without
the guard.

Two tests, both verified to fail against the old line:
- functional: match found, then >64 KiB of further comments. The existing cases
  dance around this - case 5 buries the match but keeps it small, case 6 puts it
  last so nothing follows to fill the buffer.
- structural: the checker may not pipe into grep -q or awk at all, mirroring the
  copyright scanner's guard, so the next instance of the class is caught rather
  than the next occurrence of this one.

The error text is left alone: it misdiagnosed those four PRs only because of this
bug, and becomes accurate again once the SIGPIPE path is gone.

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

astubbs commented Aug 6, 2026

Copy link
Copy Markdown
Owner Author

Two follow-ups pushed

1. The red claude-review on this PR was a bug in the gate, not a missing review

The review ran (is_error: false, ~4 min) and posted a comment citing run 31060452485 - confirmed against the comments API. The gate said no comment cited it.

bin/check-review-posted.sh:94 used printf | grep -q under set -o pipefail: grep -q exits on match, printf takes EPIPE, pipefail promotes 141 to the pipeline status. Finding the review is what failed the check. Needs >64 KiB after the match to fire, which here was the 127 KB similarity report sitting behind a 4.7 KB review comment.

Fixed with the herestring this repo already prescribes - bin/test-check-copyright-headers.sh guards the copyright scanner against this exact class, with a comment noting it was "seen live in CI". This checker shipped in the same commit without the guard.

Two tests added, both verified red against the old line: a functional case (match, then >64 KiB) and the structural guard (no piping into grep -q/awk). The existing suite missed it because case 5 keeps the match small and case 6 puts it last, so nothing follows to fill the buffer.

Fixing a gate from inside the PR it fails deserves scrutiny, so to be explicit: the gate is not weakened. A green review check still requires a review that actually posted. Its scope is unchanged; it just stops reporting failure when one did. The error text is deliberately untouched - it misdiagnosed #198, #199 and #204 only because of this bug, and is accurate again now.

2. Dropped docs/inflight/ci-changelog-gate-scope.md

Its one unique contribution - why tightening the gate to reject every addition was rejected - is now inline in the AGENTS.md gate subsection, where the gate is described. docs/inflight/ is for work that is open and needs picking up; a settled decision recorded there is the stale-marker failure that directory's own charter warns about.

The recommendation itself is unchanged: do not tighten the gate. "Adds an entry" and "corrects an existing one" are both +* lines and are not mechanically distinguishable, and a blanket rule's only escape hatch legitimises a violating addition as easily as a legitimate correction.

@claude

claude Bot commented Aug 6, 2026

Copy link
Copy Markdown

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


Review complete ✅

Tasks

  • Gather context (diff, changed files, AGENTS.md guidance)
  • Review AGENTS.md wording changes
  • Review CHANGELOG.adoc header change
  • Review docs/inflight/release-0600-blockers.md change
  • Review bin/check-review-posted.sh pipefail fix
  • Review bin/test-check-review-posted.sh new tests
  • Verify factual claims independently
  • Post final review

Summary

Two independent, well-scoped fixes, both docs/tooling with no runtime behavior change to the product itself.

1. Changelog policy wording (AGENTS.md, CHANGELOG.adoc, docs/inflight/release-0600-blockers.md). The old text from #113 put 0.6.0.0 on the frozen/hand-written side of the line and said generation starts "from the next release on." That's backwards: generation applies to 0.6.0.0 itself, since it hasn't shipped yet. The rewrite fixes this consistently in all three sites, adds the shipped/not-shipped table, and makes the correction-vs-addition distinction explicit with a citable precedent (#198's Kafka-version fix).

2. bin/check-review-posted.sh SIGPIPE/pipefail bug. printf '%s\n' "$comment_bodies" | grep -qE ... under set -o pipefail: grep -q exits the instant it matches, printf gets EPIPE if more than one pipe buffer (64 KiB) of data still needs writing, and pipefail promotes that 141 to the pipeline's exit status — so finding the citation is what failed the check. Fixed with a herestring (<<<), matching the existing guard in bin/check-copyright-headers.sh.

Verification performed

I independently checked every load-bearing factual claim rather than trusting the PR body:

Observations (non-blocking)

  • Both fixes are self-consistent and narrowly scoped — the changelog wording fix doesn't touch the gate's enforcement behavior, and the gate fix doesn't touch the error text or the check's scope, as the PR body promises.
  • The decision to document (not tighten) the changelog-ref-gate.js behavior is sound: the edit-vs-addition distinction isn't mechanically detectable without redoing the fuzzy-matching the gate's own header says was tried and abandoned, and a stricter gate's only escape hatch is the same honor-system changelog-ref: N/A line, so it wouldn't add real enforcement.
  • No code/product behavior changes; this is docs + a CI script fix, matching the checklist.

No bugs or factual errors found. Every checkable claim held up against direct verification.

astubbs added a commit that referenced this pull request Aug 6, 2026
#211 added a rule to bin/AGENTS.md - never pipe into `grep -q` under pipefail -
while the repo broke it in four places. A rule shipped with known violations is
not a rule.

`writer | grep -q PATTERN` under `set -o pipefail` reports failure exactly when
it MATCHES: grep exits on the first hit, the writer takes EPIPE (141), pipefail
promotes that to the pipeline's status. It only fires once the writer still has
more than one pipe buffer (64 KiB) to write, so it passes every small fixture
and surfaces when real data grows.

- check-review-posted.sh:94 - live. Reported "no review posted" on four PRs
  whose reviews had posted (#198, #199, #204, #210).
- check-quarantine-owners.sh:98,110 - latent, and close. `git show` pipes a whole
  source file into `grep -q` inside an `if`. The largest file in the repo is
  65,185 bytes against a 65,536-byte buffer: 351 bytes of headroom, on a file two
  open PRs are adding lines to. It would fail as "annotation missing", not as a
  pipe error.
- quarantine-lane-report.sh:201 - the `||` makes a SIGPIPE take the wrong branch
  and silently retarget, rather than shielding it.

All four become herestrings, which have no pipeline to fail.

Adds bin/check-shell-sigpipe.sh, run in CI beside the copyright self-test
(seconds, no JDK) and granted to the reviewer. Verified both directions: clean on
this tree, exit 1 when the old line is reinstated. It skips itself, since its
failure message necessarily contains the anti-pattern as the "wrong" half of a
worked example.

shellcheck does NOT detect this - run against the known-bad line, it passed
clean. Hence a bespoke grep rather than adopting a linter.

Note check-review-posted.sh:94 is also fixed in #210, which adds the functional
regression test for it. Conflict expected and cheap; this PR fixes it because it
is this PR that states the rule.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RtNUsxokE9g2pSEjBHZqNA
astubbs added a commit that referenced this pull request Aug 6, 2026
bin/test-check-review-posted.sh was missing from --allowedTools while its
sibling bin/test-check-copyright-headers.sh was granted. So when #210 changed
the review gate, the reviewer could not run the gate's self-test and verified
the fix by reading instead - and said so - on the one PR where executing it
mattered most. The workflow already runs that same script itself, at its
"Self-test the review gate" step.

Both spellings granted for each script: these are prefix matches, not globs, so
Bash(bin/foo.sh:*) does not cover ./bin/foo.sh.

Deliberately NOT widened to bin/*. The comment above the list explains why it is
enumerated rather than Bash(*) - the job has no fork guard beyond
sender.type != Bot and reads attacker-influencable text - and a directory glob
gives that margin away just as effectively.

Adds bin/AGENTS.md, because nothing failed to keep the allowlist in sync: no
rule existed. `allowedTools` appears in zero docs, scripts or checks, so a new
verification script stays invisible to the reviewer until someone remembers by
hand. An automated "every script must be granted" check would be wrong - the
list is a security boundary and most scripts belong off it - so the rule is
written down instead: what earns a grant, what must never get one, that both
spellings are needed, and that editing this workflow costs you the review on
that PR.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RtNUsxokE9g2pSEjBHZqNA
astubbs added a commit that referenced this pull request Aug 6, 2026
`writer | grep -q` under `set -o pipefail` reports failure exactly when it
MATCHES: grep exits on the first hit, the writer takes EPIPE (141), pipefail
promotes that to the pipeline's status. It only fires once the writer still has
more than one pipe buffer (64 KiB) to write, so it passes every small fixture
and surfaces when real data grows.

- check-review-posted.sh:94 - live. Reported "no review posted" on four PRs
  whose reviews had posted (#198, #199, #204, #210).
- check-quarantine-owners.sh:98,110 - latent, and close. `git show` pipes a whole
  source file into `grep -q` inside an `if`. The largest file in the repo is
  65,185 bytes against a 65,536-byte buffer: 351 bytes of headroom, on a file two
  open PRs are adding lines to. It would fail as "annotation missing", not as a
  pipe error, sending the reader nowhere near the cause.
- quarantine-lane-report.sh:201 - the `||` makes a SIGPIPE take the wrong branch
  and silently retarget, rather than shielding it.

All four become herestrings, which have no pipeline to fail.

Kept separate from the guard that enforces this, so the fixes can be reviewed -
and reverted - on their own.

shellcheck does NOT detect this: run against the known-bad line, it passed clean.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RtNUsxokE9g2pSEjBHZqNA
astubbs added a commit that referenced this pull request Aug 6, 2026
bin/test-check-review-posted.sh was missing from --allowedTools while its
sibling bin/test-check-copyright-headers.sh was granted. So when #210 changed
the review gate, the reviewer could not run the gate's self-test and verified
the fix by reading instead - and said so - on the one PR where executing it
mattered most. The workflow already runs that same script itself, at its
"Self-test the review gate" step.

Both spellings granted for each script: these are prefix matches, not globs, so
Bash(bin/foo.sh:*) does not cover ./bin/foo.sh.

Deliberately NOT widened to bin/*. The comment above the list explains why it is
enumerated rather than Bash(*) - the job has no fork guard beyond
sender.type != Bot and reads attacker-influencable text - and a directory glob
gives that margin away just as effectively.

Adds bin/AGENTS.md, because nothing failed to keep the allowlist in sync: no
rule existed. `allowedTools` appears in zero docs, scripts or checks, so a new
verification script stays invisible to the reviewer until someone remembers by
hand. An automated "every script must be granted" check would be wrong - the
list is a security boundary and most scripts belong off it - so the rule is
written down instead: what earns a grant, what must never get one, that both
spellings are needed, and that editing this workflow costs you the review on
that PR.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RtNUsxokE9g2pSEjBHZqNA
astubbs added a commit that referenced this pull request Aug 6, 2026
`writer | grep -q` under `set -o pipefail` reports failure exactly when it
MATCHES: grep exits on the first hit, the writer takes EPIPE (141), pipefail
promotes that to the pipeline's status. It only fires once the writer still has
more than one pipe buffer (64 KiB) to write, so it passes every small fixture
and surfaces when real data grows.

- check-review-posted.sh:94 - live. Reported "no review posted" on four PRs
  whose reviews had posted (#198, #199, #204, #210).
- check-quarantine-owners.sh:98,110 - latent, and close. `git show` pipes a whole
  source file into `grep -q` inside an `if`. The largest file in the repo is
  65,185 bytes against a 65,536-byte buffer: 351 bytes of headroom, on a file two
  open PRs are adding lines to. It would fail as "annotation missing", not as a
  pipe error, sending the reader nowhere near the cause.
- quarantine-lane-report.sh:201 - the `||` makes a SIGPIPE take the wrong branch
  and silently retarget, rather than shielding it.

All four become herestrings, which have no pipeline to fail.

Kept separate from the guard that enforces this, so the fixes can be reviewed -
and reverted - on their own.

shellcheck does NOT detect this: run against the known-bad line, it passed clean.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RtNUsxokE9g2pSEjBHZqNA
Picks up the two new required contexts (shell: sigpipe, workflows: action
versions) so this PR can report them, and resolves the overlap with #211.

check-review-posted.sh:94 - both branches fixed the same SIGPIPE line. The code
was identical; only the explanatory comment differed. Took master's wording.

test-check-review-posted.sh - this branch's structural guard (no `| grep -q` in
the checker) is now redundant: bin/check-shell-sigpipe.sh landed on master with
#211 and enforces that across every bin/*.sh, in every flag spelling, with its
own self-test. Removed the local copy rather than keep two rules for one thing.

Case 13 is KEPT. It is behavioural where the repo-wide guard is static: it drives
the checker with a match followed by >64 KiB of comments and asserts exit 0, so
it would catch a regression that reintroduced the failure by some route other
than a literal `| grep -q` - which is the only shape the static guard sees.

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

claude Bot commented Aug 6, 2026

Copy link
Copy Markdown

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


Review complete ✅

Tasks

  • Gather context (diff, changed files, AGENTS.md)
  • Review AGENTS.md wording changes
  • Review CHANGELOG.adoc header change
  • Review docs/inflight/release-0600-blockers.md change
  • Review bin/test-check-review-posted.sh new test (and the referenced bin/check-review-posted.sh fix)
  • Verify factual claims independently
  • Post final review

Summary

This synchronize event's diff against origin/master is identical in scope to what the two prior automated reviews already covered (AGENTS.md +54/-10, CHANGELOG.adoc +1/-1, bin/test-check-review-posted.sh +11, docs/inflight/release-0600-blockers.md +5/-4 — line counts match the PR's stated totals exactly). The merge commit (13cad31a, merging master in) introduced no new content. I re-verified independently rather than trusting the prior reviews or the PR body.

1. Changelog policy wording. The old text from #113 put 0.6.0.0 on the frozen/hand-written side and said generation starts "from the next release on." That's backwards — generation applies to 0.6.0.0 itself. The rewrite is consistent across AGENTS.md (two spots) and CHANGELOG.adoc's header NOTE::, and adds an explicit shipped/not-shipped table plus a citable precedent for the edit-vs-addition exception (#198's Kafka version correction).

2. bin/check-review-posted.sh SIGPIPE/pipefail bug. printf | grep -q under set -o pipefail: grep -q exits on match, printf gets EPIPE if >64 KiB still needs writing, pipefail promotes that 141 — so finding the citation is what failed the check. Already fixed with a herestring (<<<"$comment_bodies") matching bin/check-copyright-headers.sh's guard; this PR's only remaining touch here is the added regression test.

Verification performed

One thing I could not execute directly: this sandbox required interactive approval to actually run shell scripts (bash bin/test-check-review-posted.sh), which wasn't available in this context — plain git/gh/grep/Read calls worked fine. I verified the test logic and fixture sizing by hand instead of by execution; the reasoning is straightforward bash/pipe semantics and the fixture math checks out, but this is static verification, not an executed pass/fail confirmation.

Observations (non-blocking)

  • No code or behavior changes to the product itself — this is docs plus a CI test addition, consistent with the checklist.
  • The decision to document rather than tighten changelog-ref-gate.js remains sound: the edit-vs-addition distinction isn't mechanically detectable without redoing the fuzzy-matching the gate's own header says was tried and abandoned, and a stricter gate's only escape hatch is the same honor-system changelog-ref: N/A line already in use.

No bugs or factual errors found. Every checkable claim in the PR body held up against direct, independent verification.
(branch: docs/changelog-policy-wording)

@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

…anch

PR Checklist failed with "12 reference(s) below #1000 do not say which repo they
mean". The gate arrived in 735b1d3 (#114), which merged 17 minutes AFTER
#211 - so this branch was written before the rule existed.

The fork's numbers sit inside upstream's range, so a bare number is a coin flip:
#114 found 48 numbers that exist in BOTH repos meaning different things.
All twelve here are fork PRs, now written astubbs#NN.

Pointed, given this PR is about a reference convention.

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

claude Bot commented Aug 6, 2026

Copy link
Copy Markdown

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


Review complete ✅

Tasks

  • Gather context (diff against origin/master, changed files)
  • Review AGENTS.md wording changes
  • Review CHANGELOG.adoc header change
  • Review docs/inflight/release-0600-blockers.md change
  • Review bin/test-check-review-posted.sh new test
  • Verify factual claims independently (including against live CI logs, not just diffs)
  • Post final review

Summary

The wording fix itself is sound: the old "from the next release on" phrasing did put 0.6.0.0 on the wrong side of the frozen/generated line, and the rewrite (three sites in AGENTS.md/CHANGELOG.adoc, plus the release-0600-blockers.md copy) is internally consistent and matches repo reality (README.adoc/README_TEMPLATE.adoc genuinely don't restate the policy; the check-review-posted.sh SIGPIPE fix is in place and has no remaining pipe hazards).

However, digging into the two specific PRs cited as live evidence for "don't tighten the gate" turned up a real problem: the mechanism described for both examples is wrong, verified against the actual CI logs.

Finding: the false-pass/false-fail examples in AGENTS.md don't match what actually happened in CI

New AGENTS.md text (the "gate is a different, narrower check" section):

It passes entries the policy forbids... an added entry that links an issue sails through. #57's entries all cite issues.
It fires on the one edit the policy allows... so a correction like #198's looks like a new entry. That is what changelog-ref: N/A - <reason>... is for.

Neither holds up:

  • fix: unbounded PCMetrics heap growth (#120, upstream #859), offset reset after rebalance (#121, upstream #894), and no hot-shard metric #57 does not "sail through via citation." Its PR Checklist run (job 92512322148) logs Opted out via PR body: "changelog-ref: N/A - the shards.max.size entry has no issue to cite..." — the gate never even evaluated citations, because the PR itself opts out. And the claim "entries all cite issues" is also just false: of the three added bullets, the shards.max.size feature entry (in === Improvements, a monitored section) cites only /pull/57 and /pull/905 links, no /issues/ link — which is exactly why the author had to add the opt-out. Only the two fix: entries cite issues.
  • docs #197: fix the two release-blocking factual errors in the 0.6.0.0 artefacts #198 never needed the opt-out at all. Its PR Checklist run (job 92241986370) logs Changelog OK - every new entry that needs an issue reference has one — a clean pass, no opt-out declared (confirmed: gh pr view 198 --json body has no changelog-ref: line anywhere). That's because the edited entry is in === Dependencies, which SECTIONS_REQUIRING_AN_ISSUE (.github/scripts/changelog-ref-gate.js:41) never covers — the edit/addition ambiguity the prose blames never came into play for this example.

So the two illustrative cases are effectively swapped from how they're described: #57 is the one that actually relied on the opt-out (to legitimize what the new policy calls a forbidden addition — arguably a better, more concrete example for the "the opt-out legitimises a violation as easily as a correction" argument made two paragraphs later), and #198 is the one that passed cleanly with no opt-out in play. This doesn't overturn the PR's bottom-line recommendation (leave the gate alone) — the four-open-PRs point and the honour-system point stand independently — but the specific evidence offered for two of the four bullets is inaccurate, in a section whose entire premise is "verified against reality, not assumed." Worth fixing before this lands, since AGENTS.md is the kind of doc that gets cited back later.

Other verification performed

One limitation: couldn't execute bin/test-check-review-posted.sh or the gate's own node .github/scripts/changelog-ref-gate.test.js directly in this sandbox (shell-script/node execution required interactive approval that wasn't available), so the CI-log verification above substitutes for local execution — it's actually stronger evidence here since it shows the gate's real behavior against the real PRs rather than a synthetic re-run.
(branch: docs/changelog-policy-wording)

@astubbs
astubbs merged commit 8faf658 into master Aug 6, 2026
27 of 29 checks passed
@astubbs
astubbs deleted the docs/changelog-policy-wording branch August 6, 2026 03:57
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