Skip to content

docs: index every TODO/FIXME/XXX marker, triage into the existing refactoring backlog - #103

Merged
astubbs merged 8 commits into
masterfrom
docs/todo-index
Aug 3, 2026
Merged

astubbs merged 8 commits into
masterfrom
docs/todo-index

Conversation

@astubbs

@astubbs astubbs commented Aug 1, 2026 •

Copy link
Copy Markdown
Owner

Description

91 TODO/FIXME/XXX markers were scattered across the tree with nothing tracking them. This adds a generated inventory, and triages the useful ones into the backlog that already exists rather than a new one.

docs/TODO_INDEX.md - generated inventory

bin/todo-index.sh walks the tracked tree and writes every marker, grouped by module with file and line. --check exits non-zero when the committed index is stale, so it can be wired into CI later.

This does not overlap docs/refactoring.md's existing // TODO(refactor): convention - that captures 3 markers; this inventories all 91, a population nothing was tracking.

Triage goes in docs/refactoring.md

An earlier revision of this PR added a separate docs/TODO_TRIAGE.md. That was wrong and has been removed. docs/refactoring.md was already a 295-line backlog (before this PR; 319 after) that had:

My triage re-derived that taxonomy from scratch, with worse provenance. The root error: I concluded "no breaking-changes list exists" after grepping only docs/inflight.md - too narrow a search to support that conclusion.

Two findings genuinely absent from refactoring.md were folded into it:

  • ParallelEoSStreamProcessorTest waits on loop cycles, not events (four markers). Not a style point - the class is on the known intermittent-failure list, and cycle-counting is the flake mechanism: a loaded machine changes how much happens per cycle.
  • MockConsumer.groupMetadata() workaround duplicated x4 across the example tests - one Apache Kafka defect, copy-pasted four times. Not ours to fix; the duplication is.

Guardrail

AGENTS.md now records that refactoring.md owns marker triage, and says to read it before concluding some category of deferred work is untracked - because it is easy to miss by grepping only inflight.md, which is exactly how this PR went wrong. That note is the durable fix; the rest is cleanup.

TODO_INDEX.md and docs/inflight.md both point at refactoring.md for triage, with an explicit "do not start a parallel list".

Marker detection

101 markers on the first pass, 91 real. Excluded with reasons recorded in the script: shell variables (todo=(), ${todo[*]}), YAML field keys (upstream-map.yaml uses todo: as a schema field), string literals, prose referencing a marker elsewhere, and compound names where the word is part of a filename rather than a marker (todo-index.sh). That last one is live, not theoretical: merging master brought in #102's workflow comment naming the script, and the scanner counted it as a 92nd marker until filtered — caught by --check, which is a fair self-validation of the tool.

Worth flagging one self-inflicted bug found while building it: the anchored exclusions were applied to grep -n output, so ^ never matched and they silently did nothing - noted in the script so it isn't reintroduced.

Why .adoc/.md are not scanned

Raised in review, and worth recording because "surely docs could contain a TODO too" is a reasonable first reaction. It was tried, and the result is in a comment in list_files():

Scanning docs added 4 hits and not one was a marker. Three were docs/refactoring.md quoting markers the index already lists from their .java source — so the same work appeared twice and the count inflated — and the fourth was prose ("seeded from a code scan (TODO/FIXME + ...)").

That is structural rather than bad luck: refactoring.md is where marker triage lives, and AGENTS.md / docs/inflight.md / CHANGELOG.adoc describe this tool, so scanning docs means indexing the index-of-work. The generated index is the reductio — on its own it accounts for ~95 self-referential hits.

The comment also says what to do instead: if a genuine marker ever does land in prose, move it into the code it concerns, where the scan will find it. $OUT is now excluded belt-and-braces so a future widening cannot make the index index itself.

Notes

  • Not wired into CI as a gate. --check exists for it, but making it gating means every added or removed marker fails the build until regenerated - worth deciding deliberately, not as a side effect here.

Checklist

  • Changelog entry added (CHANGELOG.adoc) - Build & CI, citing this PR; README.adoc regenerated
  • Docs updated - new TODO_INDEX.md; refactoring.md gains two backlog items and the marker-triage ownership note; inflight.md and AGENTS.md updated to point at it
  • Tests added/updated - N/A - documentation tooling; bin/todo-index.sh --check is its own round-trip check and was run against the generated output
  • Title & body reflect the final content of this PR
  • Self-hosted runner / security implications considered - N/A - no CI runner or workflow changes; the script is run manually

🤖 Generated with Claude Code

Two companion files, split so that neither invalidates the other:

- docs/TODO_INDEX.md is GENERATED by bin/todo-index.sh - the raw
  what/where, 91 markers grouped by module with file and line.
  --check fails when the committed index is stale, so it can be wired
  into CI later.
- docs/TODO_TRIAGE.md is HAND-CURATED - the same markers grouped into
  themes in priority order. It deliberately names classes and themes
  rather than line numbers, so regenerating the index never invalidates
  it. The machine owns what/where; a human owns what-matters.

The triage exists so the analysis is done once instead of every future
reader re-deriving it. What it found is more useful than a list:

- The 91 markers are not 91 tasks. Five of them across three classes
  carry the same issue number (#233) and describe ONE design problem -
  OffsetMapCodecManager being encoder, decoder and consumer-holder at
  once. Four more are the same Apache Kafka MockConsumer workaround
  copy-pasted into four example tests.
- Two P1 groups turn out to be the same story: state that should be
  instance state is static, and tests reach in to mutate it. That is
  what produced the largeOffsetMap flake, and #233 is why the class has
  static state at all - so fixing #233 likely subsumes most of the
  statics group, making it better value than its size suggests.
- Most markers are correctly P4: notes-to-self next to the code they
  concern. The triage says so explicitly, so nobody converts them into
  tickets.

Also fixes marker detection: shell variables (todo+=, ${todo[*]}), YAML
field keys, string literals and references-to-a-marker were all counted.
The anchored filters were being applied to grep -n output, so ^ never
matched - noted in the script so it is not reintroduced.

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

github-actions Bot commented Aug 1, 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 1, 2026 •

Copy link
Copy Markdown

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


Claude finished the review

  • Gather context (read diff, changed files)
  • Review bin/todo-index.sh
  • Review docs/TODO_INDEX.md (generated output)
  • Review docs/TODO_TRIAGE.md (hand-curated)
  • Review docs/inflight.md, CHANGELOG.adoc, README.adoc
  • Post final review

Summary

Good idea, cleanly split (generated what/where vs. hand-curated what-matters), and the triage content itself is well-reasoned. Spot-checked the #233 cluster and the statics group against the actual source — the groupings hold up. Found one concrete factual bug and a couple of minor nits.

Findings

1. Changelog/README state a stale marker count (101), contradicting the PR's own generated index (91)
CHANGELOG.adoc:29 and README.adoc:1600 both say "a generated index of every TODO/FIXME/XXX marker in the tracked tree (101 at time of writing)". But docs/TODO_INDEX.md:6 says 91 marker(s), and the PR description itself explains why: "The first pass counted 101; the real number is 91" (after fixing the ^ anchoring bug in the exclusion filter). It looks like the changelog entry was drafted before that fix and never updated. Since precision is the entire point of this PR, worth fixing before merge — either drop the number from the changelog line or update it to 91.
Fix this →

2. PR body slightly overstates the #233 cluster ("five... carry the same issue number")
Only 4 markers literally contain the string #233: OffsetMapCodecManager.java:114, :131, PartitionStateManager.java:124, PartitionState.java:491. The 5th marker grouped into that cluster — OffsetMapCodecManager.java:136 ("this should be controlled for - improve consumer management so that this can't happen") — doesn't tag #233 in its text; it's grouped by inferred theme, which is reasonable, but the PR body's wording ("carry the same issue number") isn't quite accurate for that one. Minor, doesn't affect the grouping's validity — just the phrasing.

3. bin/todo-index.sh's string-literal exclusion (NOT_A_MARKER_RE, line 50, the "[^"]*TODO[^"]*" alternative) can misfire on lines with two unrelated string literals
Because it just looks for any quote before the marker and any quote after with no quote in between, a line like log.info("start"); // TODO fix "this" thing would false-positive: the closing quote of "start" and the opening quote of "this" get treated as a pair enclosing the TODO, silently dropping a real marker from the index. I didn't find an existing line in the tree that triggers it today, so it's not causing any current inaccuracy, but given the PR already found and fixed one silent-exclusion bug from an overly broad heuristic (the anchoring bug), this is the same failure class and worth a comment/test case, or at least a known-limitations note. Not blocking.

4. Scope choice worth confirming is deliberate
list_files() in bin/todo-index.sh:31-36 scans .java .sh .xml .yml .yaml only — not .adoc/.md. That's a reasonable and apparently intentional choice (markers belong in code, not prose), and I didn't find any genuine marker currently in the excluded doc files, but it's not called out explicitly in the script's scope comment or the PR description's "excluded, with reasons" list. A one-line comment noting the extension scope is deliberate would save a future reader from wondering.

Not verified

I don't have shell-execution permission in this environment (script execution requires interactive approval), so I could not actually run bin/todo-index.sh --check to confirm the committed TODO_INDEX.md is byte-for-byte reproducible from the current tree. I verified consistency by manual grep spot-checks (case-insensitive TODO/FIXME/XXX matches against several files named in the triage), which lined up with the generated index's content. Recommend running --check in CI (as noted in the PR itself) to get durable enforcement of this rather than relying on manual spot checks.

Per AGENTS.md's reference convention ('link the PR/issue'). Added at
PR-creation time, since the entry necessarily predates the number.

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

github-actions Bot commented Aug 1, 2026 •

Copy link
Copy Markdown

✅ Duplicate Code Report

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

✅ PMD CPD

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

No new clones introduced by this PR.

✅ jscpd (language-agnostic)

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

No new clones introduced by this PR.

Powered by astubbs/duplicate-code-cross-check

@claude

claude Bot commented Aug 1, 2026 •

Copy link
Copy Markdown

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


Review

I cross-checked docs/TODO_INDEX.md against a fresh grep sweep of the tree (all 51 files it lists, plus the 3 files it correctly omits — scripts/upstream-backlink.sh, RunLengthEncoderTest.java, ReactorApp.java — matched exactly, so the exclusion heuristics work as documented). I wasn't able to actually execute bin/todo-index.sh --check in this sandbox (script execution requires interactive approval that isn't available here), so I couldn't do a byte-for-byte regeneration check — the manual cross-check above is the substitute.

Findings

1. CHANGELOG.adoc:29 / README.adoc:1600 say "101 at time of writing" — the real, generated count is 91.
docs/TODO_INDEX.md:6 and docs/TODO_TRIAGE.md:10 both say 91, and the commit message for 6f5bd45 says 91 too. 101 was the pre-anchoring-fix count that the PR description explicitly calls out as wrong ("The first pass counted 101; the real number is 91"). It looks like the changelog line was written before the anchoring bug was fixed and never updated. The second commit (53454b6) touched the changelog again (to add the PR link) without catching it. Since README.adoc is regenerated from CHANGELOG.adoc, fixing the one line fixes both.
Fix this →

2. The exclusion regex can silently drop a whole line — including a real marker on it — not just the excluded token.
In bin/todo-index.sh:70, exclusion is grep -nE "$MARKER_RE" "$file" | grep -vE "$NOT_A_MARKER_RE". The quoted-string branch of NOT_A_MARKER_RE ("[^"]*[Tt][Oo][Dd][Oo][^"]*") matches anywhere on the line, not just inside the marker occurrence. So a line with a genuine // TODO: ... comment that also happens to contain a quoted string mentioning "todo" elsewhere on the same line (e.g. a log message) would have the entire line dropped by grep -v, silently losing a real marker — the exact "silent because the filter never matched what you thought it matched" failure mode the script's own comments warn about for the ^ anchoring bug. Doesn't currently manifest anywhere in this tree (confirmed by the file-coverage cross-check above), but it's a latent gap worth a comment or a follow-up todo-index-selftest-style fixture, since nothing will flag it if it happens later.

3. Minor: total in emit_body() (bin/todo-index.sh:53,86) is computed but never read. The real count comes from the separate count_markers() call in generate(). Dead variable — harmless, but worth deleting since the script otherwise reads as carefully written.

4. Minor: the "reference to a marker elsewhere" exclusion is a single hardcoded phrase. NOT_A_MARKER_RE's last branch, (optimisation|optimization) TODO, only catches the one instance in RunLengthEncoderTest.java today. Any future prose reference phrased differently (e.g. "see the TODO in X") will be indexed as a new marker rather than excluded — not wrong, just means the exclusion list will need ad hoc additions over time rather than generalizing. Fine as-is given the script is explicitly a "cheap heuristic," just flagging so it's not mistaken for a general rule.

What's solid

  • The split between generated TODO_INDEX.md (what/where) and hand-curated TODO_TRIAGE.md (theme/priority, no line numbers) is a good structural call — it genuinely avoids the invalidate-on-every-edit problem the PR describes.
  • Verified the triage's core claims against the index: the confluentinc#41: Performance: FindCompletedEligibleOffsetsAndRemove method try replacing with cache of incomplete offsets #233 cluster (OffsetMapCodecManager/PartitionStateManager/PartitionState), the 4× duplicated Apache Kafka MockConsumer workaround, and the P1 statics-vs-flake connection all check out against the actual marker text.
  • File-grouping logic (*/src/* → module root, bin/* → "bin (scripts)", .github/* → ".github (CI)", else dirname) was verified correct against every group heading in the generated file.
  • Self-exclusion of bin/todo-index.sh from list_files() works correctly (confirmed no self-indexing artifacts).

@github-actions

github-actions Bot commented Aug 1, 2026 •

Copy link
Copy Markdown

📌 Duplicate code detection tool report

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

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

Full similarity report
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.09
parallel-consumer-core/src/test/java/io/confluent/csid/utils/CollectionUtils.java 33.0
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.27
parallel-consumer-core/src/main/java/io/confluent/csid/utils/Java8StreamUtils.java 35.09
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.23 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 40.68
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 37.32
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PCRetriableException.java 37.16
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 35.6
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 35.6
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 35.48
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 34.62
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 30.19
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.34 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 54.2 ⚠️
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 40.07
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 36.58
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 32.17
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 31.13
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.34 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 50.02 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 36.27
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 32.02
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 31.12
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PCRetriableException.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 37.16
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 33.13
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.23 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 53.71 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 45.01
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 35.15
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 34.12
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 31.28
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 31.28
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalRuntimeException.java 30.58
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 30.11
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.79
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/PartitionState.java 31.0
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.2 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 50.02 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 45.17
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 33.48
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 32.79
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 30.69
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.17
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 36.58
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 36.27
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 32.29
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.68
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 33.48
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContext.java 32.68
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/RecordContextInternal.java 32.59
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 32.17
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 31.12
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 32.59
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 32.86
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.5 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 53.71 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 51.23 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 48.61
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 40.68
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalRuntimeException.java 39.01
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 37.41
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 34.18
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 34.18
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PCRetriableException.java 33.13
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.01
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 31.09
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 30.58
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.81
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.79
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.8 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 37.82
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 37.82
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 37.41
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 35.48
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 35.15
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 33.35
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.8 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 48.82
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 47.5
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 47.5
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 46.75
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 45.01
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 37.32
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalRuntimeException.java 31.09
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.61
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 46.75
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 45.48
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 38.69
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 38.69
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 30.19
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 30.11
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 51.23 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 48.82
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 45.48
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 34.62
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 34.12
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 33.35
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 32.19
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 32.19
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.91 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 47.5
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 38.69
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 37.82
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 35.6
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 34.18
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 32.19
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 31.28
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.91 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 47.5
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 38.69
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 37.82
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 35.6
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 34.18
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 32.19
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 31.28
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/PartitionState.java

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 55.36 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 46.87
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.16
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 41.04
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.78
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.78
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.71 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 46.87
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 41.04
parallel-consumer-vertx/src/test-integration/java/io/confluent/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 30.12
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.71 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 55.36 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 44.16
parallel-consumer-vertx/src/test-integration/java/io/confluent/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 39.38
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.62
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java 35.35
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.62
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 37.72
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java 32.55
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 50.82 ⚠️
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 50.82 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 35.35
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 32.55
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ProgressProbe.java 30.22
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 37.72
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ProgressProbe.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java 30.22
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.27
parallel-consumer-core/src/main/java/io/confluent/csid/utils/Java8StreamUtils.java 33.0
parallel-consumer-core/src/test/java/io/confluent/csid/utils/LoopingResumingIteratorTest.java

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/AmbientProbeExtension.java 30.31
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.36
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.58
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/QuarantineRegistryScriptTest.java 43.89
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.02 ⚠️
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyBatchTest.java 50.71 ⚠️
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/VertxBatchTest.java 44.8
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/BatchTestBase.java 30.36
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.44 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java 56.78 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerSaslAuthenticationTest.java 49.77
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.44 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java 55.75 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerSaslAuthenticationTest.java 52.98 ⚠️
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.98 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerCommitTimeoutTest.java 49.77
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java 47.42
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.78 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerEarlyCloseTest.java 55.75 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerSaslAuthenticationTest.java 47.42
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.7
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.7
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/AbstractParallelEoSStreamProcessorTestBase.java 30.24
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.58
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/QuarantineRegistryScriptTest.java 33.46
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/QuarantineRegistryScriptTest.java

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

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

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

File Similarity (%)
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/TestConventionsArchTest.java 90.38 ⚠️
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/TestConventionsArchTest.java 89.71 ⚠️
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/TestConventionsArchTest.java 89.71 ⚠️
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.12
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.12
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.81
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/TestParallelEoSStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 30.69
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.07
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.07
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.58
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.58
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.5 ⚠️
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyBatchTest.java

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorUnitTestBase.java 32.9
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.22 ⚠️
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/TestConventionsArchTest.java 90.55 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/TestConventionsArchTest.java 89.71 ⚠️
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.5 ⚠️
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorBatchTest.java

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyUnitTestBase.java 32.9
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.22 ⚠️
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/TestConventionsArchTest.java 90.55 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/TestConventionsArchTest.java 89.71 ⚠️
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.51
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 40.07
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 39.72
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelStreamProcessor.java 35.33
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 32.02
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.72
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelStreamProcessor.java 39.16
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 32.29
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 31.13
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.75
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 41.51
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.75
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 39.16
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 35.33
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.38
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 30.12
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.22 ⚠️
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/TestConventionsArchTest.java 91.22 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/TestConventionsArchTest.java 90.38 ⚠️
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.53 ⚠️
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyBatchTest.java 49.27
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CoreBatchTest.java 44.8

@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown

✅ SpotBugs Report

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

@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown

🧪🔒 Quarantine Lane Report

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

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

… list

Correcting this PR's original shape. It shipped a docs/TODO_TRIAGE.md
that duplicated docs/refactoring.md - a 295-line backlog that already
had a release-gated 'Breaking changes queued for next major version'
section, a 'Remove static state (unblocks parallel test execution)'
section, and per-file entries for #233, the encoders and WorkContainer.
My triage re-derived all of that from scratch, with worse provenance:
refactoring.md carries the upstream issue numbers (#405, #126, #143) and
design branches that I did not have.

The mistake was concluding 'no breaking-changes list exists' after
grepping only docs/inflight.md. Too narrow a search to support the
conclusion drawn from it.

So:
- delete docs/TODO_TRIAGE.md rather than maintain two taxonomies;
- fold into refactoring.md the two things it genuinely did NOT cover:
  the loop-cycle waits in ParallelEoSStreamProcessorTest (a known
  intermittent failure, where cycle-counting IS the flake mechanism),
  and the MockConsumer.groupMetadata() workaround duplicated across four
  example tests;
- point TODO_INDEX.md and docs/inflight.md at refactoring.md as the
  place triage happens, with an explicit 'do not start a parallel list'.

docs/TODO_INDEX.md still earns its place: refactoring.md's capture
convention is TODO(refactor):, of which there are 3, while the index
inventories all 91 plain markers - a population nothing was tracking.

AGENTS.md now says refactoring.md owns marker triage, and to read it
before concluding some category of deferred work is untracked, since it
is easy to miss by grepping only inflight.md. That note is the actual
fix for the mistake.

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

claude Bot commented Aug 1, 2026 •

Copy link
Copy Markdown

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


Review

  • Gather context (read diff, changed files)
  • Review bin/todo-index.sh
  • Review docs/TODO_INDEX.md (generated output)
  • Review docs/refactoring.md, docs/inflight.md, CHANGELOG.adoc, README.adoc, AGENTS.md
  • Post final review

The PR has evolved since earlier review passes: the triage now folds into the existing docs/refactoring.md backlog instead of a new docs/TODO_TRIAGE.md, and the marker-count discrepancy flagged before (101 vs 91) is fixed — CHANGELOG.adoc/README.adoc now correctly say 91, matching docs/TODO_INDEX.md (verified: grep -c '^- L' docs/TODO_INDEX.md → 91). I spot-checked the two triage entries added to docs/refactoring.md against source and both hold up: the 4 awaitForSomeLoopCycles/wait...never markers in ParallelEoSStreamProcessorTest (L474, L496, L506, L673), and the 4x duplicated mockConsumer.groupMetadata() // todo fix AK mock consumer across CoreAppTest, CoreAppMetricsIntegrationTest, ReactorAppTest, VertxAppTest. No stale references to the old TODO_TRIAGE.md filename remain anywhere in the tree.

Finding

bin/todo-index.sh's generated header contradicts itself on where triaged markers should live — and the current copy contradicts docs/inflight.md/AGENTS.md.

docs/TODO_INDEX.md:9-14 (from the heredoc in bin/todo-index.sh:115-121, the "Prioritised?" section):

Triage lives in docs/refactoring.md... Do not start a parallel priority list.

docs/TODO_INDEX.md:26-28 (same file, "How to use this" section, from bin/todo-index.sh:134-136):

The durable rule of thumb: if a marker describes work someone should actually schedule, it belongs in docs/inflight.md (with a link back to the code).

These two sections of the same generated file name two different destinations for the same kind of marker. It reads like the "Prioritised?" section was added when the design pivoted from a new TODO_TRIAGE.md/inflight.md-based scheme to reusing docs/refactoring.md, but the older "How to use this" paragraph (pre-dating that pivot) was left unedited. This isn't just internally inconsistent — it now also contradicts the PR's own new text in docs/inflight.md:20-21 ("Triage of those markers belongs in docs/refactoring.md... Not here, and not in a new list") and AGENTS.md's new sentence ("Write triage up there; do not start a parallel list" — "there" being refactoring.md). Since precision/non-duplication is the explicit point of this PR (the whole rationale for splitting generated-vs-curated docs), this stale paragraph undermines it for anyone who reads docs/TODO_INDEX.md top-to-bottom.

Fix: update bin/todo-index.sh:134-136 to point at docs/refactoring.md (or simply drop the now-redundant sentence, since the "Prioritised?" section already covers it).
Fix this →

Minor / not blocking (carried over, still present, low priority)

  • emit_body()'s local total counter (bin/todo-index.sh:53-54,86) is computed but never read — the real count comes from the separate count_markers() call. Harmless dead code.
  • list_files() scans .java .sh .xml .yml .yaml only, not .adoc/.md — a reasonable, apparently deliberate choice (markers belong in code, not prose) but still not called out in the script's scope comment.

Not verified

No shell-execution permission in this environment, so bin/todo-index.sh --check could not be run directly to confirm docs/TODO_INDEX.md regenerates byte-for-byte from the current tree. Verified the 91-count independently via grep -c '^- L' docs/TODO_INDEX.md and the specific triage claims via direct source grep instead, both of which check out.

@astubbs astubbs changed the title docs: index every TODO/FIXME/XXX marker, and triage them into priorities docs: index every TODO/FIXME/XXX marker, triage into the existing refactoring backlog Aug 1, 2026
There was no docs index at all. AGENTS.md was the de-facto map, but its
pointers were scattered across six sections - refactoring.md under
'Refactoring backlog', QUARANTINED_TESTS.md under 'Testing',
inflight.md under 'Worktree ownership' - and SELF_HOSTED_RUNNER.md was
linked from nowhere.

That layout only works if you already know which section to read, which
is circular. It is how this PR originally went wrong: grep inflight.md,
find nothing, conclude nothing exists, duplicate refactoring.md.

The guardrail added earlier had the same flaw - it lived inside the
Refactoring backlog section, so it only reached someone who had already
found the file it was warning them about. Now the warning is at the top,
where it is seen before the mistake rather than after.

One row per document: what it owns, and what it is explicitly NOT for -
the boundaries are the part that gets guessed wrong. Plus the rule of
thumb: happening now -> inflight.md; should happen later ->
refactoring.md; already happened -> CHANGELOG.adoc or docs/solutions/.

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

claude Bot commented Aug 1, 2026 •

Copy link
Copy Markdown

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


Review

  • Gather context (read diff, changed files)
  • Review bin/todo-index.sh
  • Review docs/TODO_INDEX.md (generated output)
  • Review docs/refactoring.md, docs/inflight.md, AGENTS.md, CHANGELOG.adoc, README.adoc
  • Post final review

The PR's design is sound and the pushed history shows real self-correction (the TODO_TRIAGE.md false start was removed and folded into the existing docs/refactoring.md backlog, which is the right call). The 91-marker count is now consistent everywhere I checked: docs/TODO_INDEX.md:6, CHANGELOG.adoc:29, README.adoc:1600, and grep -c '^- L' docs/TODO_INDEX.md all agree. The two triage entries folded into refactoring.md (ParallelEoSStreamProcessorTest's loop-cycle waits, and the 4x-duplicated MockConsumer.groupMetadata() workaround) check out against the source. No stale references to the deleted TODO_TRIAGE.md remain.

Finding (carried over from an earlier review pass on this PR - still unresolved)

bin/todo-index.sh's generated header still contradicts itself on where triaged markers belong.

The commit that pivoted this PR from a new TODO_TRIAGE.md to reusing docs/refactoring.md (50930c3) rewrote the "Prioritised?" section of the heredoc in generate() to correctly say:

Triage lives in docs/refactoring.md... Do not start a parallel priority list.

(bin/todo-index.sh:117-121, rendered into docs/TODO_INDEX.md:12-15)

But it left the very next section, "How to use this" (bin/todo-index.sh:134-136, rendered into docs/TODO_INDEX.md:28-30), untouched from before the pivot:

The durable rule of thumb: if a marker describes work someone should actually schedule, it belongs in docs/inflight.md (with a link back to the code).

git show 50930c3 -- bin/todo-index.sh confirms only the "Prioritised?" section was edited in that commit - the "How to use this" paragraph is the pre-pivot leftover. It now contradicts:

  • the very next heading up in the same generated file,
  • docs/inflight.md:20-23 (this PR's own new text: "Triage of those markers belongs in docs/refactoring.md... Not here, and not in a new list"), and
  • AGENTS.md's new "Where things live" table (docs/inflight.md row: "Explicitly NOT for... A backlog").

Since precision and non-duplication are the explicit point of this PR (the whole rationale for the generated/curated split, and the thing the earlier TODO_TRIAGE.md mistake was about), a reader going top-to-bottom through docs/TODO_INDEX.md hits self-contradicting guidance in the first 30 lines.

Fix: update bin/todo-index.sh:134-136 to point at docs/refactoring.md instead of docs/inflight.md (or delete the sentence - the "Prioritised?" section already says this), then regenerate docs/TODO_INDEX.md.
Fix this →

Minor / not blocking

  • emit_body()'s local total counter (bin/todo-index.sh:53-54,86) is computed but never read - the real count comes from the separate count_markers() call in generate(). Dead code, harmless.
  • list_files() (bin/todo-index.sh:31-36) scans .java .sh .xml .yml .yaml only, not .adoc/.md - a reasonable, apparently deliberate choice (markers belong in code, not prose) but not called out in the script's own scope comment.
  • The quoted-string exclusion branch of NOT_A_MARKER_RE (bin/todo-index.sh:50) matches any two quotes surrounding the marker anywhere on the line, not just a string literal containing it - a line with an unrelated quoted string before a real // TODO comment could be silently dropped. Doesn't currently manifest anywhere in the tree, but worth a comment given this PR already found and documented one silent-exclusion bug from an overly broad heuristic (the ^-anchoring bug noted at line 47-48).

Not verified

No shell-execution permission in this environment, so bin/todo-index.sh --check could not be run directly to confirm docs/TODO_INDEX.md regenerates byte-for-byte from the current tree. Cross-checked the 91-count and the specific triage claims via direct grep/git show instead, which line up.

astubbs added a commit that referenced this pull request Aug 3, 2026
Review on #103: the generated header's 'Prioritised?' section was
updated when triage moved to docs/refactoring.md, but the very next
'How to use this' paragraph still told readers that schedulable work
belongs in docs/inflight.md - so the generated index contradicted itself
two paragraphs apart, and pointed at the exact wrong file. A leftover
from the pivot, and precisely the kind of stale instruction that caused
the duplication this PR was correcting in the first place.

Both paragraphs now point at docs/refactoring.md.

Also drops emit_body()'s  counter, computed and never read - the
real count comes from count_markers().

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QqHpNSXC39ANv9kG1ZvUzn
Review on #103: the generated header's 'Prioritised?' section was
updated when triage moved to docs/refactoring.md, but the very next
'How to use this' paragraph still told readers that schedulable work
belongs in docs/inflight.md - so the generated index contradicted itself
two paragraphs apart, and pointed at the exact wrong file. A leftover
from the pivot, and precisely the kind of stale instruction that caused
the duplication this PR was correcting in the first place.

Both paragraphs now point at docs/refactoring.md.

Also drops emit_body()'s 'total' counter, computed and never read - the
real count comes from count_markers().

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

claude Bot commented Aug 3, 2026 •

Copy link
Copy Markdown

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


Review

  • Gather context (diff since last review pass)
  • Check whether the previously-flagged bin/todo-index.sh self-contradiction was fixed
  • Review the new commit for correctness and side effects
  • Post final review

Summary

The new commit (c810bb8) fixes exactly the issue flagged in the previous review pass: the generated docs/TODO_INDEX.md header had two paragraphs pointing at different files for marker triage (docs/refactoring.md vs. docs/inflight.md). Verified the fix is correct and complete:

  • bin/todo-index.sh:129-131's "How to use this" paragraph now says to write triage up in docs/refactoring.md, matching the "Prioritised?" section two paragraphs above it.
  • docs/TODO_INDEX.md was regenerated consistently with the script change (checked both files render identically apart from the doc-comment vs. heredoc syntax).
  • Cross-checked every other doc that references marker-triage ownership — AGENTS.md:17-18,246 and docs/inflight.md:21 — and all consistently point at docs/refactoring.md now. No stale references to docs/inflight.md for triage remain anywhere in the tree.
  • The marker count is still correct: grep -c '^- L' docs/TODO_INDEX.md → 91, matching the "91 marker(s)" text in the file, CHANGELOG.adoc, and README.adoc.
  • The commit also drops emit_body()'s unused total counter, which was the other minor nit carried over from the prior review pass. That's resolved too.
  • Diff scope against origin/master is unchanged and matches the PR description: 7 files, +503/-1.

No new issues found. The remaining items from earlier review passes (the quoted-string exclusion heuristic in NOT_A_MARKER_RE, and the extension scope of list_files() not covering .adoc/.md) are pre-existing, low-severity, and explicitly called out as non-blocking in prior reviews — nothing about this commit changes that assessment.

Not verified

No shell-execution permission in this environment, so bin/todo-index.sh --check could not be run directly. Verified equivalence between the script's heredoc and the committed docs/TODO_INDEX.md by direct text comparison instead, which matches line-for-line on the changed paragraphs.

@claude

claude Bot commented Aug 3, 2026 •

Copy link
Copy Markdown

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


Tasks

  • Gather context (PR diff, prior review comments, changed files)
  • Confirm the latest commit (c810bb8) fixes the previously-flagged contradiction
  • Run full code review pass on current PR state
  • Post final review

Review

This is commit c810bb8, pushed in response to the finding raised in the prior review passes on this PR (bin/todo-index.sh's "How to use this" paragraph still pointing at docs/inflight.md for triage while the section above it correctly pointed at docs/refactoring.md). I re-verified the fix directly:

  • Both paragraphs in the generated header (bin/todo-index.sh:113-131, mirrored in docs/TODO_INDEX.md:9-29) now consistently point at docs/refactoring.md. No remaining self-contradiction in the generated file.
  • The dead total counter in emit_body() (previously flagged as a minor nit) is removed in the same commit — bin/todo-index.sh no longer computes a value it never reads.
  • git diff origin/master..HEAD --stat matches the PR's declared file list exactly (AGENTS.md, CHANGELOG.adoc, README.adoc, bin/todo-index.sh, docs/TODO_INDEX.md, docs/inflight.md, docs/refactoring.md) — nothing else changed since the last review pass.
  • Marker count is consistent everywhere: docs/TODO_INDEX.md:6 says 91, grep -c '^- L' docs/TODO_INDEX.md independently counts 91, and both CHANGELOG.adoc:29 / README.adoc:1600 say 91.
  • docs/inflight.md and AGENTS.md's new "Where things live" table both correctly point triage at docs/refactoring.md, in agreement with the now-fixed generated header.
  • Re-checked the two triage entries added to docs/refactoring.md against source: the groupMetadata() workaround is present in exactly the four cited example test files (CoreAppTest, CoreAppMetricsIntegrationTest, ReactorAppTest, VertxAppTest), and the ParallelEoSStreamProcessorTest loop-cycle wait markers check out.

No new issues found. The remaining items noted in earlier passes on this PR are cosmetic/latent and non-blocking, unchanged by this commit:

  • list_files() (bin/todo-index.sh:31-36) scans .java .sh .xml .yml .yaml only, not .adoc/.md — reasonable, but not called out in the script's own scope comment.
  • The quoted-string branch of NOT_A_MARKER_RE (bin/todo-index.sh:50) matches any two quotes surrounding a marker anywhere on the line, not just a literal containing it — could in theory drop a real marker on a line with an unrelated quoted string. Doesn't manifest anywhere in the current tree.

Not verified

No shell-execution permission in this environment, so bin/todo-index.sh --check could not be run directly to confirm byte-for-byte regeneration. Cross-checked via direct grep/git diff/git show instead, all consistent.

This PR looks ready to merge from a correctness standpoint — the substantive finding from earlier passes is resolved and no new issues turned up.

@astubbs

astubbs commented Aug 3, 2026

Copy link
Copy Markdown
Owner Author

Both findings fixed in d9e9d5b-ish (latest push).

The contradiction was real and worth catching. The generated header's "Prioritised?" section was updated when triage moved to docs/refactoring.md, but the "How to use this" paragraph two paragraphs later still told readers that schedulable work belongs in docs/inflight.md. So the generated index contradicted itself on the same page, and pointed at the exact wrong file — a leftover from the pivot, and precisely the kind of stale instruction that caused the duplication this PR exists to correct. Both paragraphs now say docs/refactoring.md, and the index is regenerated.

Also dropped emit_body()'s total counter — computed, never read, with the real count coming from count_markers().

On not being able to run bin/todo-index.sh --check yourself: that is a real gap, not an oversight in your review. #102 grants the reviewer the test wrappers but not the repo's check scripts, so you could not verify the index was regenerated — you had to infer it from the diff. Being discussed on #102; the likely outcome is granting the bin/ check scripts specifically rather than blanket shell access.

🤖 Generated with Claude Code

astubbs added a commit that referenced this pull request Aug 3, 2026
A #103 reviewer could not run bin/todo-index.sh --check to confirm the
generated index was regenerated - it had the test wrappers granted but
not the repo's own verification scripts - so it had to infer freshness
from the diff. That is the exact 'author asserts vs actually verified'
gap this whole workstream is about.

Grants the fast, read-only VERIFICATION scripts: bin/check-copyright-
headers.sh, bin/test-check-copyright-headers.sh, bin/check-quarantine-
registry.sh, bin/check-quarantine-owners.sh, bin/todo-index.sh. All are
executable with shebangs, so the bare-path grant matches the existing
ci-*-test.sh convention. The system prompt now tells the reviewer they
exist and to prefer them over trusting the PR body.

NOT the quarantine/test RUNNERS (quarantined-test.sh,
quarantine-lane-report.sh): those execute suites, are slow, and test
execution is already covered by the ci-*-test.sh wrappers.

Deliberately still an allowlist, not blanket Bash(*): this job has no
fork guard beyond sender.type != Bot - fork PRs are currently protected
only by not receiving secrets, so the action fails rather than runs -
and it reads attacker-influencable text (diff, PR body, comments). An
enumerable allowlist is the margin against injection-into-execution;
blanket shell here plus the pull-requests: write added for inline
comments would be a pwn-request waiting for a trigger change. Reasoning
recorded in the workflow comment.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QqHpNSXC39ANv9kG1ZvUzn
astubbs added a commit that referenced this pull request Aug 3, 2026
Both findings were correct.

1. Bash(bin/todo-index.sh:*) referenced a script that does not exist on
   this branch. It is added by #103 (docs/todo-index), which is not
   merged, so from here the grant is inert and the prompt instruction
   and changelog line claimed a capability that does not exist. The
   reviewer was right to check with find/git log rather than take the
   commit message's word for it; it was wrong only about the script
   never existing anywhere, since it lives on the unmerged #103 branch.

   Landing an unverified claim in a PR whose whole thesis is 'do not let
   assertions go unverified' is exactly the failure this workstream
   exists to catch. Dropped from the grant list, the system prompt, and
   the changelog; the grant belongs in #103 alongside the script.

2. Bash(./mvnw --batch-mode -Pci -pl parallel-consumer-core test:*)
   contradicted the comment sitting directly above it, which says the
   reviewer runs the repo's wrappers so it runs what CI runs. That
   bespoke invocation skipped -Dexcluded.groups=performance,chaos,
   quarantined - which the wrappers hardcode because it was once a
   silent no-op for unit tests, a real P1, now pinned by
   QuarantinedAnnotationContractTest for the wrappers but NOT for a
   workflow-embedded command - was core-only, and dropped clean,
   -Dlicense.skip and rerunFailingTestsCount. Removed: if the reviewer
   runs tests, it runs what CI runs.

Adds a comment recording both rules, so the next person does not
reintroduce either: every grant must be a script that exists on THIS
branch, and there is deliberately no bespoke mvnw grant.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QqHpNSXC39ANv9kG1ZvUzn
astubbs added a commit that referenced this pull request Aug 3, 2026
#102)

The automated reviewer could never check a test claim. This workflow
fires on pull_request open/synchronize - BEFORE the CI test jobs finish
- so "just read the CI results" was never available to it, and with no
execution grants it could only restate whatever the PR description
asserted.

That is not hypothetical. On #100 the reviewer said so itself:

  I could not run the build/test suite myself in this sandbox (./mvnw
  requires interactive approval I don't have here) - the verification
  table in the PR description (622 tests passing, specific chaos seed
  reproduction) is asserted by the author but not independently re-run.

And it mattered. #100 added a regression test named
MockConsumerTestWithRebalanceInProgressException, which matches none of
surefire's default include patterns, so it was never collected. The
suite was green BECAUSE the new test never ran. A review that trusted
the author's totals would have waved through a permanent no-op.

What changed:

- Grants the repo's own wrappers (bin/ci-unit-test.sh,
  bin/ci-integration-test.sh) rather than blanket Bash(./mvnw:*), so the
  reviewer runs what CI runs, with the same profile and group
  exclusions. Plus the fast read-only verification scripts
  (bin/check-copyright-headers.sh, bin/test-check-copyright-headers.sh,
  bin/check-quarantine-{registry,owners}.sh) so it can re-run what a PR
  claims instead of inferring it from the diff.

- Adds JDK 17 + Maven cache and fetch-depth: 0. Without these the grants
  would be useless - the job had no JDK at all, and a depth-1 clone
  cannot reach the PR base to diff against.

- Tells the reviewer, via --append-system-prompt, that it MAY execute
  tests, that CI results are NOT available to it, that it must verify a
  new test was actually COLLECTED rather than trusting a green total,
  and that it should say plainly when it could not verify something
  instead of implying it did.

- Raises blocking findings as INLINE review comments. The master ruleset
  sets required_review_thread_resolution, so an unresolved thread is the
  only thing that actually gates a merge; a blocking finding written
  only in a PR-level comment can be, and would be, merged straight past.
  Non-blocking notes stay in the summary - if every nit became a
  resolvable thread, the gate would stop meaning "something is wrong"
  and get dismissed when it matters. There is an explicit tie-breaker:
  if unsure, summarise and say why, rather than block on a maybe.

- Caps the job at 30 minutes so a wedged suite cannot hold a runner, and
  moves to pull-requests: write for the inline comments.

Chaos is deliberately not granted (Docker, ~2 minutes per scenario arm,
and non-gating). Nor are the quarantine/test runners - those execute
suites and are already covered by the ci-*-test.sh wrappers. It stays an
enumerable allowlist rather than blanket Bash(*): this job has no fork
guard beyond sender.type != Bot, fork PRs are protected only by not
receiving secrets, and the reviewer reads attacker-influencable text
(diff, PR body, comments) - so the allowlist is the margin against
injection becoming execution.

Two defects the reviewer itself caught during review, both fixed here: a
grant for bin/todo-index.sh, which exists only on unmerged #103 and was
therefore inert while the changelog advertised it as shipped; and a
bespoke ./mvnw invocation that contradicted the comment above it by
skipping the group exclusions the wrappers hardcode - a past P1 that
QuarantinedAnnotationContractTest pins for the wrappers but cannot pin
for a command embedded in a workflow string.

KNOWN LIMITATION, recorded in docs/inflight.md: none of this has
executed. claude-code-action refuses to run when the workflow file
differs from the default branch's copy, and reports that skip as
SUCCESS - so this PR's own green review check verified nothing, and the
first real exercise is the next PR merged after it. Also left open
there: whether CLAUDE_CODE_OAUTH_TOKEN is reachable from a Bash
subprocess running PR-authored build code, that actionlint is not
granted (so the reviewer cannot lint the very artefact this PR
changes), and whether integration tests fit the 30-minute cap.
astubbs added a commit that referenced this pull request Aug 3, 2026
…esn't exist

Two findings from the #101 review rounds.

1. gotK1 was write-only state, left behind when the old
   while (!gotK0 && !gotK1) loop condition was replaced by the
   event-based wait. Removed.

2. docs/inflight.md claimed the remaining awaitForSomeLoopCycles/sleep
   waits in this class were 'filed under Test infrastructure -
   timing-based waits in docs/refactoring.md'. That section exists only
   on #103's unmerged branch - zero occurrences here or on master - so
   the ledger cited a reference to nothing, in the PR whose own thesis
   is 'do not let something look tracked when it is not'. The reviewer
   flagged it three rounds running.

   Reworded to say #103 adds that entry and to file them there once it
   merges, rather than claiming they already are. Same mistake as the
   bin/todo-index.sh grant on #102: cross-referencing content that lives
   on another unmerged branch.

Full reactor after both: 11 modules, 740 tests, 0 failures.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QqHpNSXC39ANv9kG1ZvUzn
astubbs and others added 2 commits August 3, 2026 14:21
# Conflicts:
#	CHANGELOG.adoc
#	README.adoc
Review on #103 noted the scan covers .java/.sh/.xml/.yml/.yaml but not
docs, and that the omission was reasonable but unexplained in the
script's own scope comment. It was the missing rationale that was the
gap, so this adds it - with evidence rather than assertion, because
'surely docs could contain a TODO too' is a reasonable first reaction.

Scanning them was tried. It added 4 hits and not one was a marker:
three were docs/refactoring.md QUOTING markers the index already lists
from their .java source, so the same work appeared twice and the count
inflated, and the fourth was prose ('seeded from a code scan
(TODO/FIXME + ...)'). That is structural, not bad luck - refactoring.md
is where marker triage lives, and AGENTS.md / inflight.md /
CHANGELOG.adoc describe this tool, so scanning docs means indexing the
index-of-work. The generated index is the reductio: on its own it
accounts for ~95 self-referential hits.

Also keeps two things the experiment surfaced, needed regardless:

- a filter for compound names (todo-index.sh as a FILENAME, not a
  marker). This is live, not theoretical: merging master brought in
  #102's workflow comment naming the script, and the scanner was
  counting it as a 92nd marker. --check caught it, which is a decent
  self-validation of the tool.
-  excluded belt-and-braces, so a future widening cannot make the
  index index itself.

Index back to 91 markers, --check clean.

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

claude Bot commented Aug 3, 2026 •

Copy link
Copy Markdown

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


Tasks

  • Gather context (PR diff, prior review comments, changed files)
  • Review the new commit (33fee32f) since the last review pass
  • Verify the "docs excluded" rationale and the new compound-name exclusion against the actual tree
  • Post final review

Review

This commit (33fee32f) closes out the last remaining non-blocking nit from earlier passes on this PR — list_files() not explaining why .adoc/.md are excluded from the scan — and along the way fixes a real, live self-indexing bug surfaced by merging in master (#102).

Verified claims:

  • bin/todo-index.sh:32-44 now documents the .adoc/.md exclusion with the specific evidence cited (three self-referential docs/refactoring.md hits quoting markers already indexed from their .java source, plus one prose hit) rather than just asserting it's fine. Reasonable and well-substantiated.
  • The new compound-name branch in NOT_A_MARKER_RE (bin/todo-index.sh:68, [Tt][Oo][Dd][Oo][-_][A-Za-z]) is real and necessary, not preemptive: .github/workflows/claude-code-review.yml:87 mentions `bin/todo-index.sh` in a comment, which the base MARKER_RE (\bTODO\b, case-insensitive) matches as a marker via "todo-index.sh". Without the fix this file would incorrectly appear in the index. I independently confirmed no .github group section exists in docs/TODO_INDEX.md and no markers are attributed to that file, so the exclusion is working as claimed.
  • grep -c '^- L' docs/TODO_INDEX.md → 91, matching the file's own "91 marker(s)" text, CHANGELOG.adoc:30, and README.adoc:1601. Consistent everywhere.
  • No merge-conflict markers left anywhere in the touched files after the origin/master merge.
  • git diff origin/master...HEAD --stat matches the PR's declared scope (7 files, +520/-1).

One latent, non-blocking observation (same class already flagged and accepted twice before on this script): the new compound-name exclusion is applied via grep -vE against the whole line, not scoped to where the marker actually occurred — same pattern as the pre-existing quoted-string branch flagged in earlier review passes. A hypothetical line containing both a genuine // TODO: ... comment and a mention of todo-index.sh/TODO_INDEX.md elsewhere on that line would have the entire line silently dropped, including the real marker. I checked: no such line currently exists in the scanned tree (the compound-name pattern only ever matches the one workflow-comment line, which contains no other marker). Given this exact failure class was already raised, accepted as non-blocking, and left as-is for the quoted-string branch, I'm not blocking on it here either — just noting it applies to the new branch too, for whenever the exclusion list gets revisited.

Not verified

No shell-execution permission in this environment (confirmed again — bash bin/todo-index.sh --check requires approval and I did not have it), so I could not directly confirm byte-for-byte regeneration. I verified equivalently via grep -c, targeted Grep searches for the compound-name pattern across all scanned extensions, and manual regex analysis of NOT_A_MARKER_RE, all of which are consistent with the commit's claims.

Nothing here blocks merge. This is a solid, well-evidenced close-out of the last open nit.

# Conflicts:
#	CHANGELOG.adoc
#	README.adoc

@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

@claude

claude Bot commented Aug 3, 2026 •

Copy link
Copy Markdown

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


Tasks

  • Gather context (diff since last review pass)
  • Check what changed since the last reviewed commit (33fee32f)
  • Review new commits for correctness and side effects
  • Post final review

Review

The only change since the last review pass is 5f82d46b, a merge of origin/master (which pulled in dc44e202, PR #101 — test-integrity fixes). This PR's own commits are unchanged. I verified the merge didn't silently break anything:

No new issues found. All findings from earlier passes on this PR are resolved (the generated-header contradiction, the dead total counter, the .adoc/.md scope-comment gap). This looks ready to merge.

Not verified

No shell-execution permission in this environment (bash bin/todo-index.sh --check requires approval I don't have), so I could not directly confirm byte-for-byte regeneration after the merge. Verified equivalently via grep -c and targeted diffs against the merge, which are consistent with a correct regeneration (only line-number churn, no marker-text or count changes).

@astubbs
astubbs merged commit 825f8d3 into master Aug 3, 2026
26 of 29 checks passed
@astubbs
astubbs deleted the docs/todo-index branch August 3, 2026 02:50
astubbs added a commit that referenced this pull request Aug 3, 2026
AGENTS.md already said changelog entries must link the PR ("a bare #NN
refers to this fork ... and link the PR/issue"). It was missed anyway,
for a structural reason rather than carelessness: the entry is written
BEFORE the PR exists, so at authoring time there is no number to cite,
and nothing afterwards prompts you to return. #100, #101, #102 and #103
each shipped an entry with no self-reference, and each was caught one at
a time by a human reading the diff. That is the profile of a rule worth
making mechanical.

The gate: when a PR ADDS a new CHANGELOG.adoc entry, at least one added
entry must reference this PR (pull/NN or #NN).

Deliberately narrow, to avoid false failures:
- only genuinely new asciidoc bullets count, so reflows and edits to
  older entries are ignored;
- word-bounded matching, so #100 does not match inside #1000;
- opt-out for a PR that touches the changelog without adding an entry of
  its own: `changelog-ref: N/A - <reason>` on its own line in the body,
  reason required, mirroring the checklist's existing N/A convention;
- bots exempt, consistent with the checklist gate;
- no changelog change at all means nothing to check - whether an entry
  was NEEDED is already the checklist item's job.

The logic lives in .github/scripts/changelog-ref-gate.js rather than
inline in the workflow, and is unit tested (28 tests, plain node, no
runner) with the tests running BEFORE the gate, so a regression fails
the job loudly instead of silently mis-judging PRs. That is not
gold-plating: this logic shipped two real misjudgements during review -
an opt-out regex a body merely QUOTING the syntax could trip, and
positional add/remove pairing that mis-read a block holding both an edit
and a new entry. Mirrors the existing copyright.yml self-test step.

Pairing is by CONTENT, not position: an added bullet reads as an edit of
a removed one when they share a (#NN) citation, or failing that when
their wording overlaps enough. Position alone turns -A,-B,+A',+NEW,+B'
into exactly the wrong answer - +NEW consumed as an edit and never
checked.

KNOWN LIMITATION, raised in review and confirmed by construction. When
NEITHER bullet carries a citation, pairing falls back to word overlap -
and this changelog is full of same-template entries ("build(deps): Bump
<lib> to <version>"). Given a removed "Bump Testcontainers to 1.20.0", a
genuinely new "Bump Kafka to 3.9.0", and a reworded edit of the
Testcontainers line, the gate pairs the NEW line as the edit: it escapes
the citation check while the real edit is falsely flagged. Wrong both
ways, and the escaping half is the false negative this gate exists to
prevent.

Not tuned blind - the threshold is a considered choice and a guessed
replacement could easily be worse. Instead it is pinned by a regression
test that states outright it records ACCEPTED rather than DESIRED
behaviour (a failure caused by the gate getting stricter is an
improvement), and documented next to EDIT_THRESHOLD with the direction
to take if it bites: FAIL CLOSED, so an uncertain pair is treated as a
new entry needing a citation. That trades a silent miss for a visible
false alarm - and the false alarm has an escape hatch, whereas the miss
has nothing.

Needs pull-requests: read to fetch the patch, and an actions/checkout
(persist-credentials: false, since nothing there consumes secrets) so
the module and its tests are on disk.

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant