Skip to content

docs+ci: run the issue-reference gate locally, and always record a mirror upstream title - #218

Merged
astubbs merged 2 commits into
masterfrom
ci/local-runner-for-issue-ref-gate
Aug 6, 2026
Merged

astubbs merged 2 commits into
masterfrom
ci/local-runner-for-issue-ref-gate

Conversation

@astubbs

@astubbs astubbs commented Aug 6, 2026 •

Copy link
Copy Markdown
Owner

Description

Two conventions that existed only in places you had to already know about. Both are now where you meet them by working. Independent commits — rebase-merge, don't squash.

1. bin/check-issue-refs.sh — run the issue-reference gate before pushing

The PR Checklist workflow fails a PR that adds an unqualified #NN below #1000, but the rule was only reachable from CI. The first sign you had written a bare #118 was a red check minutes after pushing — a slow loop for a one-character fix. It cost two CI round-trips on #217 alone.

No second copy of the rule. The script calls the same .github/scripts/issue-ref-gate.js module the workflow requires, rather than reimplementing the regex in bash. A bash version would drift, and a local check that disagrees with CI is worse than no local check: it teaches you to trust the wrong answer. Everything subtle — exempt paths, {@link #close()} false positives, the markdown/anchor/URL forms that already qualify a number — stays in the module, unit tested by issue-ref-gate.test.js.

Judges the working tree, following bin/check-copyright-headers.sh, so uncommitted edits are caught before the commit rather than after the push. Exit 2 when node is absent, matching the "cannot run" convention of the sibling scripts. The issue-refs: N/A opt-out lives in the PR body, which a local script cannot see — so it says so in its output rather than pretending to honour it.

Verified against the real failure: reintroducing the bare #118 that failed CI on #217 reproduces the gate's finding locally — same file, same ref, same line.

2. Mirrors record their upstream title, always

#118 was mirrored as "Error in onPartitionsAssigned in parallel consumer" — upstream's own words, naming where a failure surfaced and containing no term a sufferer would search for. Once #217 established the cause, it was retitled to lead with the error string.

That makes the upstream title worth recording in the body. Unconditionally, not "when you retitle": the conditional version needs whoever retitles to remember, and it leaves a reader unable to tell whether any given mirror's title is upstream's words or ours without opening upstream to compare. No bulk backfill of the other 77 — add the line when you touch one.

AGENTS.md gains a Mirror format section carrying the live spec: title form, the header-block template, summary-not-verbatim, no @mentions, labels, and fully-qualified cross-repo refs.

Retires docs/inflight/parked-upstream-issue-mirroring.md. The work landed 2026-08-05 (all 78 mirrored and backlinked), and AGENTS.md's own doc table says inflight files are deleted when their work lands, never archived into an index. Nothing is lost — it was a 27-line ledger entry pointing at the 459-line plan, which is kept and holds every decision it summarised, including the bulk-vs-incremental rationale. Its format rules were the only content it uniquely held.

The plan doc is updated rather than left stale. Its own Mirror format section was the single written copy of "what a mirror looks like", in a document explicitly allowed to go stale — and it had: it proposes a confluentinc#NNN: title prefix, while the import shipped upstream #NNN: and all 78 mirrors carry that. That divergence was recorded nowhere. It is now annotated as superseded at point-of-use (following the plan's existing strikethrough/withdrawn pattern), logged in What actually happened, and its Ledger entry: link repointed instead of left dangling. The proposal text is left unedited — a dated plan records the decision, it is not a place to retcon it.

Checklist

  • Docs updated - this PR is substantially documentation: AGENTS.md gains Mirror format and an Issue references pointer to the new script; the mirroring plan is annotated where it had gone stale.
  • Tests added/updated - N/A. The wrapper holds no rule logic; the rule lives in issue-ref-gate.js, already unit tested by issue-ref-gate.test.js. Verified behaviourally by reproducing the fix(core) #118: foreign offset metadata no longer kills the consumer on assignment #217 failure locally. Happy to add a bin/test-check-issue-refs.sh harness to match test-check-copyright-headers.sh if preferred.
  • Title & body reflect the final content of this PR
  • Self-hosted runner / security implications considered - N/A, no CI runners or workflows touched; this adds a script CI does not invoke.

🤖 Generated with Claude Code

https://claude.ai/code/session_01BK8ufGWcjXWJNyQ7WUzWer

@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 26s —— View job


Code Review

Overall: solid, low-risk change. Good instinct not reimplementing the regex — bin/check-issue-refs.sh calls the exact .github/scripts/issue-ref-gate.js module the PR Checklist workflow requires, so it genuinely cannot drift from CI's rule. I read both files plus the workflow (.github/workflows/pr-checklist.yml:122-152) and the gate module/tests closely; the execFileSync git calls use array args throughout, so there's no shell-injection surface from filenames or refs.

A couple of edge cases worth knowing about (none blocking):

  1. bin/check-issue-refs.sh:65 — the script always computes the full patch locally via git diff --unified=0, whereas the CI workflow gets patch from github.rest.pulls.listFiles, which GitHub omits for very large diffs (undocumented size threshold). gate.suspectRefs skips files with no patch, so on a huge added/changed file the local script would still scan it while CI silently wouldn't. In that narrow case the local check is stricter than CI, which is the safe direction to err in, but it means the AGENTS.md claim "reports exactly what the gate will" (AGENTS.md:351) isn't quite 100% for that edge case. Not worth solving, maybe worth a one-line caveat if you want to be pedantic about the doc claim.

  2. Exit code 2 doc comment (bin/check-issue-refs.sh:27) says 2 = cannot run (no node), but exit 2 is also returned when no merge-base can be found (line 48-51, e.g. shallow clone missing history). Minor — the behavior is fine, just the comment undersells what triggers it.

  3. Uncaught node exceptions collapse into exit 1. If the inline node script throws for an unrelated reason (e.g. a git invocation fails unexpectedly), node exits 1 — indistinguishable by exit code from "unqualified refs found." The stderr text would still show the real error, so this is discoverable, just a slight blur of the documented 0/1/2 contract. Low value to fix.

Diff-mechanics check: --unified=0 vs GitHub's default context lines doesn't affect results, since gate.suspectRefs only ever inspects lines starting with +; renames/deletes/binary files degrade gracefully (no + content lines to false-positive on). The "only lines you add are scanned" claim in AGENTS.md checks out against suspectRefs' raw.startsWith("+") filter.

Verification note: I wasn't able to execute the script in this sandbox (bash/node invocations required interactive approval that wasn't available), so the above is from static reading of bin/check-issue-refs.sh, .github/scripts/issue-ref-gate.js, its test file, and the workflow — not a live run. The PR body's reproduction of the #217 failure (bare #118 in docs/inflight/release-0600-blockers.md) isn't present on this branch (expected, since that content belongs to #217, not this PR), so I couldn't independently re-confirm that specific repro, only the logic that would produce it.

Docs (AGENTS.md:349-359): accurate description of the script's behavior and scope — no discrepancies found between the prose and the implementation.

No bugs, security issues, or missing test coverage found that would block merge. The "N/A" test rationale is reasonable given the wrapper holds no independent rule logic.

@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.23% 3.23% ➖ 0
Rule Limit Status
Max duplication 5% ✅ Pass (3.23%)
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.3
parallel-consumer-core/src/test/java/io/confluent/csid/utils/CollectionUtils.java 33.25
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.49
parallel-consumer-core/src/main/java/io/confluent/csid/utils/Java8StreamUtils.java 35.3
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.26 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 40.2
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PCRetriableException.java 36.9
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 36.8
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 35.12
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 35.08
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 35.08
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 33.91
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.96 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 54.75 ⚠️
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 40.36
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 37.02
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 32.67
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 31.4
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.96 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 50.64 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 36.72
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 32.4
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 31.61
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 30.15
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.9
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 33.1
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.26 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 53.12 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 44.82
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 34.87
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 33.51
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 30.85
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 30.85
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalRuntimeException.java 30.84
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.23
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.75 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 50.64 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 45.47
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 33.91
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 32.98
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 31.09
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.47
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 37.02
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 36.72
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 32.58
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.27
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.91
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/RecordContextInternal.java 33.09
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 32.67
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContext.java 32.27
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 31.61
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.09
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.34
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 32.98
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.34
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.54
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.48 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 53.12 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 50.81 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 48.7
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 40.2
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalRuntimeException.java 39.59
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 37.11
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 33.74
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 33.74
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PCRetriableException.java 33.1
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.59
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.84
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.85
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.23
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/ProducerManagerTest.java 30.52
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.56 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 37.46
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 37.46
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 37.11
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 35.12
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 34.87
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 32.71
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.48 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 51.56 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 48.3
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 47.14
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 47.14
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 46.63
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 44.82
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 36.8
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.7
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 46.63
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 45.21
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 38.04
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 38.04
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.81 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 48.3
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 45.21
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 33.91
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 33.51
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 32.71
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 31.46
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 31.46
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.42 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 47.14
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 38.04
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 37.46
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 35.08
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 33.74
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 31.46
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 30.85
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.42 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 47.14
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 38.04
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 37.46
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 35.08
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 33.74
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 31.46
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 30.85
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.42
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.6
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/PartitionState.java 30.42
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.68
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.68
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.6
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.6
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.24
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.03
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.47 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 46.94
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 38.64
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.64
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.42
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.42
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.94
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.47 ⚠️
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.16
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.66
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.04
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java 30.12
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 48.99
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 48.99
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 35.66
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 30.12
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.04
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.6
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.49
parallel-consumer-core/src/main/java/io/confluent/csid/utils/Java8StreamUtils.java 33.25
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.03
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.59
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.52
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.07 ⚠️
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyBatchTest.java 50.77 ⚠️
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/VertxBatchTest.java 44.88
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/BatchTestBase.java 30.59
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 57.0 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerSaslAuthenticationTest.java 49.67
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 53.07 ⚠️
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 53.07 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerCommitTimeoutTest.java 49.67
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java 47.04
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 57.0 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerEarlyCloseTest.java 55.45 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerSaslAuthenticationTest.java 47.04
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CommitRejectionTestBase.java 32.52
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.66 ⚠️
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/TestConventionsArchTest.java 89.66 ⚠️
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.24
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.85
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.52
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.09
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.0
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.0
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.19 ⚠️
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.99 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CoreBatchTest.java 50.77 ⚠️
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/VertxBatchTest.java 49.09
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.11 ⚠️
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/TestConventionsArchTest.java 90.44 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/TestConventionsArchTest.java 89.66 ⚠️
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.19 ⚠️
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.99 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CoreBatchTest.java 52.07 ⚠️
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/VertxBatchTest.java 50.35 ⚠️
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.11 ⚠️
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/TestConventionsArchTest.java 90.44 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/TestConventionsArchTest.java 89.66 ⚠️
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.49
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 40.36
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 39.83
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelStreamProcessor.java 35.4
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 32.4
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.83
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelStreamProcessor.java 39.27
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 32.58
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 31.4
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 30.15
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.66
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 41.49
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/ExternalEngine.java 39.54
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.66
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 39.27
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 35.4
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.16
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.11 ⚠️
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/TestConventionsArchTest.java 91.11 ⚠️
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.35 ⚠️
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyBatchTest.java 49.09
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CoreBatchTest.java 44.88

@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).

@claude

claude Bot commented Aug 6, 2026 •

Copy link
Copy Markdown

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


Code Review

  • Gather context (diff, changed files, related workflow/gate script, previous review)
  • Review bin/check-issue-refs.sh
  • Review AGENTS.md doc changes
  • Review docs/inflight deletion / docs/plans update
  • Verify claims (static analysis; script execution blocked by sandbox, see note)
  • Post final review

Summary: solid change, low risk. One finding worth the author's attention before merge; nothing blocking.


Finding: PR description doesn't cover half the diff

This branch carries two commits, and only the first is described:

  • 960021e0 — ci: run the issue-reference gate locally (bin/check-issue-refs.sh + a 7-line AGENTS.md pointer). This is what the PR title and body describe.
  • 79acfb47 — docs: record a mirror's upstream title always, and retire the landed ledger entry, pushed after the previous automated review ran on this PR. It adds a new AGENTS.md → Mirror format section (48 lines), deletes docs/inflight/parked-upstream-issue-mirroring.md outright, and updates docs/plans/2026-08-04-001-chore-mirror-upstream-issues-plan.md to repoint its now-dangling "Ledger entry" link and record how the mirror title convention evolved.

The PR body's Description section only talks about the CI-gate script; the mirror-format/ledger-retirement work isn't mentioned anywhere. That also makes the checked box "Title & body reflect the final content of this PR" inaccurate as the PR currently stands — worth either expanding the description to cover the second commit, or splitting it into its own PR, since the two changes are unrelated (CI tooling vs. issue-mirroring documentation convention).

I checked the second commit isn't just scope creep dressed up — it's internally consistent:

  • No dangling references to the deleted docs/inflight/parked-upstream-issue-mirroring.md remain anywhere in the tree; the one inbound link (from the plan file) was correctly repointed.
  • The deletion matches AGENTS.md's own doc-ownership table: docs/inflight/ entries are deleted (never archived) once their work lands, and this one's work landed 2026-08-05.
  • Fittingly, the new prose practices what the sibling commit preaches: every #118/#217 reference it adds is either qualified (astubbs#118, astubbs#217) or wrapped in a code span (`#118`, which issue-ref-gate.js's stripQualified strips before matching) — so it wouldn't itself trip the gate.

So the content is fine; it's the description/title accuracy that's the actual gap.

Technical review of bin/check-issue-refs.sh (unchanged since the last automated pass)

Confirmed by re-reading bin/check-issue-refs.sh, .github/scripts/issue-ref-gate.js, and .github/workflows/pr-checklist.yml:118-152:

  • No second copy of the rule — the script really does require("./.github/scripts/issue-ref-gate.js") and calls gate.suspectRefs, the same function the workflow calls. It can't drift.
  • No injection risk — all git calls go through execFileSync with array args; the heredoc uses <<'NODE' (quoted delimiter), so no shell interpolation of arbitrary content into the embedded JS.
  • Judges the working tree, matching bin/check-copyright-headers.sh's convention, via git diff --name-only "$base" -- against the merge-base (not HEAD), so uncommitted edits are included.
  • Opt-out honesty: the script correctly does not attempt to read issue-refs: N/A from the PR body (it can't see it) and says so explicitly in its own output rather than silently pretending to support it.

Two pre-existing minor edge cases, carried over from the previous review, still apply and remain non-blocking:

  1. bin/check-issue-refs.sh:65 computes the diff locally via git diff --unified=0, while CI's patch comes from pulls.listFiles, which GitHub omits for very large diffs. In that narrow case the local script is stricter than CI (safe direction), but the AGENTS.md:351 claim that it "reports exactly what the gate will" isn't 100% for that edge case.
  2. The exit-2 doc comment (bin/check-issue-refs.sh:27) says "cannot run (no node)" but exit 2 is also returned when no merge-base is found (e.g. shallow clone). Cosmetic only.

Verification note: as with the prior automated review, I could not execute bin/check-issue-refs.sh or node directly in this sandbox (both require interactive approval unavailable here) — the technical assessment above is from static reading of the script, the gate module, its test file, and the workflow, plus manually re-deriving what suspectRefs/stripQualified would do against every #NNN the diff actually adds (all qualified or code-span-wrapped, confirmed by grep). I was not able to independently re-run the #217 (#118) repro described in the PR body.

No bugs, security issues, or missing test coverage found that would block merge. The "N/A" test rationale for the wrapper script remains reasonable — it holds no independent rule logic.

@astubbs astubbs changed the title ci: run the issue-reference gate locally, instead of learning it from CI docs+ci: run the issue-reference gate locally, and always record a mirror upstream title Aug 6, 2026
@astubbs

astubbs commented Aug 6, 2026

Copy link
Copy Markdown
Owner Author

Both carried-over points are valid and both are now fixed in 783d048a. Neither changes behaviour — they were the docs describing the script more confidently than it earns.

1. AGENTS.md:351 "reports exactly what the gate will" — overclaimed. You're right, and the distinction is worth stating rather than softening away: the rule is genuinely shared (same issue-ref-gate.js, so it cannot drift), but the input is not. CI reads patches from pulls.listFiles, which omits patch on a very large diff, and the gate skips a file it cannot see; this script builds its own patch from git diff and still checks it.

Rewritten to say what the guarantee actually is, since "stricter in the safe direction" is only reassuring if you know which direction that is:

The inputs can differ in one narrow case, and only in the safe direction: CI reads patches from GitHub's pulls.listFiles, which omits patch for a very large diff, and the gate skips a file it cannot see - while the local script builds its own patch with git diff and still checks it. So a green local run is not a promise that CI has looked at every file, but a red one is always real. It can flag something CI would silently pass; it cannot pass something CI would flag.

The same caveat is now in the script's own header, under WHERE IT CAN DISAGREE WITH CI, and why that is safe — someone reading the script shouldn't have to find AGENTS.md to learn its one limitation.

2. bin/check-issue-refs.sh:27 exit-2 comment — incomplete. Confirmed two exit-2 sites, :44 (node missing) and :58 (no merge base), so the comment described half of them. Anyone scripting around the exit codes would have been misled by omission. Now:

# Exit codes: 0 = clean, 1 = unqualified refs found,
#             2 = cannot run (node missing, or no merge base with the base ref - e.g. a shallow clone).

Added as a separate commit rather than amended, so the reviewed commits aren't rewritten underneath the review and this diff shows exactly what the feedback caused. Happy to fold it into 960021e0 when the branch is re-cut for merge.

Still open from the checklist and not silently dropped: whether this wants a bin/test-check-issue-refs.sh harness to match test-check-copyright-headers.sh. I left it out because the wrapper holds no rule logic, but that's a judgement call and I'd rather it be yours.

astubbs added a commit that referenced this pull request Aug 6, 2026
…tion

Both from review of #218. Neither changes behaviour; both are the docs
describing the script more confidently than the script earns.

"Reports exactly what the gate will" was not true in one narrow case. The
*rule* is shared - same issue-ref-gate.js module, so it cannot drift - but
the *input* is not. CI reads patches from GitHub's `pulls.listFiles`, which
omits `patch` on a very large diff, and the gate skips a file it cannot see;
this script builds its own patch with `git diff` and still checks it. The
divergence is one-directional, which is worth stating rather than hiding: a
red result here is always real, a green one is not a promise that CI examined
every file. It can flag what CI would silently pass, never the reverse.

The exit-code comment claimed 2 meant "cannot run (no node)", but there are
two exit-2 sites - a missing node and a missing merge base (a shallow clone
reaches the second). Someone scripting around the exit codes would have been
told only half of it.

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

claude Bot commented Aug 6, 2026 •

Copy link
Copy Markdown

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


Code Review — follow-up on 783d048a

  • Gather context (diff since last review, new commit 783d048a)
  • Verify the two fixes claimed in 783d048a against the actual diff
  • Re-check nothing else regressed
  • Post final review

Both carried-over findings are correctly and precisely fixed. No new issues.

I checked each claim in 783d048a against the actual code rather than just the commit message:

  1. "Reports exactly what the gate will" → corrected. AGENTS.md:349-359 now says the script "applies the same rule as the gate" (true — same issue-ref-gate.js module) and adds a new paragraph on where inputs can diverge: CI's pulls.listFiles omits patch for very large diffs, and issue-ref-gate.js:84 (if (!f.patch || isExempt(f.filename)) continue;) does skip such files, while bin/check-issue-refs.sh builds its own patch via git diff (bin/check-issue-refs.sh:73) and still checks it. I confirmed this in the gate module directly — the "one-directional, always safe" framing ("a red result here is always real, a green one is not a promise CI saw everything") is accurate: the local script can only ever check a superset of what CI's patch data covers. The same explanation is duplicated in the script's own header comment (bin/check-issue-refs.sh:26-31), so a reader doesn't need to find AGENTS.md to learn the limitation — good call putting it in both places since they're read by different audiences.

  2. Exit-code comment → corrected. bin/check-issue-refs.sh:34-35 now documents both exit-2 sites. I verified both actually exist and are the only two: node missing (bin/check-issue-refs.sh:44) and no merge-base found (bin/check-issue-refs.sh:58) — nothing else in the script calls exit 2, so the comment is now complete, not just less-wrong.

Both changes are docs-only, as the commit message states — I diffed bin/check-issue-refs.sh's executable logic (lines 37-98) against the version reviewed previously and confirmed it's byte-identical apart from the comment block; only the doc header and AGENTS.md prose changed.

On the open question from the previous comment (a bin/test-check-issue-refs.sh harness): still a fair judgement call to leave for the author, not something I'd block on — the wrapper genuinely holds no rule logic to regression-test, and the behavior is already covered indirectly by issue-ref-gate.test.js.

Nothing else in the branch changed since the last review pass. No bugs, security issues, or missing coverage — good to merge as far as this review is concerned.

astubbs and others added 2 commits August 7, 2026 10:30
The `PR Checklist` workflow fails a PR that adds an unqualified `#NN` below
#1000, but the rule was only reachable from CI. The first sign you had
written a bare `#118` was a red check minutes after pushing - a slow loop
for a one-character fix. It cost two CI round-trips on #217 alone.

bin/check-issue-refs.sh applies the same rule as the gate, because it calls
the same .github/scripts/issue-ref-gate.js module. A bash re-implementation
of the regex would drift, and a local check that disagrees with CI is worse
than no local check: it teaches you to trust the wrong answer. Everything
subtle - exempt paths, `{@link #close()}` false positives, the
markdown/anchor/URL forms that already qualify a number - stays in the
module, unit tested by issue-ref-gate.test.js.

The rule is shared; the input is not, and the difference is documented
rather than glossed. CI reads patches from GitHub's `pulls.listFiles`, which
omits `patch` on a very large diff, and the gate skips a file it cannot see,
while this script builds its own patch with `git diff` and still checks it.
The divergence is one-directional: a red result here is always real, a green
one is not a promise that CI examined every file. It can flag what CI would
silently pass, never the reverse.

It judges the working tree rather than HEAD, following
bin/check-copyright-headers.sh, so uncommitted edits are caught before the
commit rather than after the push. Exit 2 covers both ways it can fail to
run - node missing, and no merge base with the base ref (a shallow clone
reaches the second).

Verified against the real failure: reintroducing the bare `#118` that failed
CI on #217 reproduces the gate's finding locally - same file, same
ref, same line. Both exit-2 paths, the optional base-ref argument, and
running from an unrelated working directory were each exercised too.

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

Mirror titles started as upstream's own, and many of them name only where a
failure surfaced - #118 was "Error in onPartitionsAssigned in parallel
consumer", which contains no term anyone hitting it would search for. Those
are ours to rewrite once the cause is known, and #118 now is.

That makes the upstream title worth recording in the body. The rule is
deliberately unconditional rather than "record it when you retitle": the
conditional version needs whoever retitles to remember, and it leaves a
reader unable to tell whether any given mirror's title is upstream's words
or ours without opening upstream to compare. Recording it always makes the
mirror self-describing. No bulk backfill - add the line when you touch a
mirror.

Also retires docs/inflight/parked-upstream-issue-mirroring.md. The work
landed on 2026-08-05 (all 78 mirrored and backlinked), and inflight files do
not outlive their work - AGENTS.md's own doc table says they are deleted,
never archived into an index. Nothing is lost: it was a 27-line ledger entry
pointing at the 459-line plan, which is kept untouched in docs/plans/ and
holds every decision it summarised, including the bulk-vs-incremental
rationale it existed to record. The format rules were the only content it
uniquely held, and they move to AGENTS.md -> Mirror format, where someone
editing a mirror will actually meet them.

The plan's "Ledger entry:" link is repointed rather than left dangling.

The mirror body template comes along with it. It had been living only in the
plan, which is a dated record rather than durable reference, so the single
written copy of "what a mirror looks like" was in a document that is allowed
to go stale - and had: it proposes a confluentinc#NNN: title prefix, while
the import shipped upstream #NNN:, which is what all 78 mirrors use. The
live copy is now in AGENTS.md, with the upstream-title line included.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@astubbs
astubbs force-pushed the ci/local-runner-for-issue-ref-gate branch from 783d048 to 2124ea2 Compare August 6, 2026 22:31
@astubbs
astubbs merged commit a2bb49f into master Aug 6, 2026
4 checks passed
@astubbs
astubbs deleted the ci/local-runner-for-issue-ref-gate branch August 6, 2026 22:35
astubbs added a commit that referenced this pull request Aug 6, 2026
#218 landed a local runner for the gate while this branch was open. It
is the natural way to reproduce the link-form false positives, so the note
should name it rather than leaving the next reader to push and wait for CI.
astubbs added a commit that referenced this pull request Aug 6, 2026
Three shapes made stripQualified report a number as unqualified when the URL
beside it already named the repo:

- asciidoc `URL[link text]` - the bare-URL rule matches \S+, so it consumed
  ".../issues/65[Enhanced" and left "retry epic #65]" looking like loose prose.
  The new rule runs BEFORE the bare-URL one, or the URL eats the opening
  bracket first and there is nothing left to recognise.
- asciidoc `{attr}/path[link text]` - no http prefix at all, so nothing
  stripped it. This is how the README writes upstream links.
- an html anchor wrapped across two lines - suspectRefs works a line at a
  time, so the existing single-line rule never sees a complete element.
  Each half now strips only when its counterpart is absent, which leaves a
  complete anchor to the original rule and keeps a #NN sitting OUTSIDE the
  element visible.

This was found by the tree-wide qualification sweep in this PR, which had to
work around it: the qualifier had to sit immediately before the number, so
the README gained "[PR confluentinc#291 ...]" where "[confluentinc PR #291
...]" is the more natural house form and would have failed. With the gate
fixed those six README references and one Java anchor are correctly seen as
already qualified, so README.adoc, README_TEMPLATE.adoc and
ParallelEoSStreamProcessorTest revert to untouched. The sweep now changes
only genuinely ambiguous references - 366 of them.

Stripping MORE is the direction that produces false negatives, and AGENTS.md
is explicit that a wrong reference which resolves is worse than a broken one.
So the fixtures cover both directions: link macros are accepted, and a bare
ref elsewhere on the same line, or after a split anchor closes, is still
flagged. 24 assertions pass.

docs/inflight/ci-issue-ref-gate-link-forms.md is deleted - it recorded this
as a follow-up while #218 was open against the gate's area. That PR
has merged, so the reason to defer is gone.
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