Skip to content

ci: make the PR's CI comments say what they mean, and survive their own failures - #407

Merged
astubbs merged 15 commits into
masterfrom
ci/perf-comment-status-changes
Sep 2, 2026
Merged

astubbs merged 15 commits into
masterfrom
ci/perf-comment-status-changes

Conversation

@astubbs

@astubbs astubbs commented Sep 1, 2026 •

Copy link
Copy Markdown
Owner

Follow-up to #401, which began as review of the throughput comment it posts and grew into the comment-posting steps around it.

Three strands, and the third was not planned: the comments now say what they mean (a reviewer read 1.713 as "1.7x faster than master" when the real figure was 1.081), they survive their own failures (a failed write no longer fails a required job, or leaves a PR with two live markers), and the SpotBugs comment stops destroying human comments - its lookup matched any comment containing "SpotBugs Report", oldest first, so a human quoting the bot had their comment silently overwritten.

What review asked for, and what was already true

Two of the four asks were already implemented, which is worth stating rather than silently "fixing":

  • Run on every push — it already does. The check is a step in the performance job.
  • Update the comment rather than appending — it already does, deliberately: "a PR with fifteen throughput comments is a PR where nobody reads the throughput comment."

The real gaps

The comment could not show a delta, because it kept no readings. Each report now ends with one machine-readable line — status, rate, ratio, share — and the workflow reads it back off its own previous comment to render "since the previous push: ratio X → Y, share X → Y, rate X → Y (+n%)". Reading our own last comment is the only store available: no series is kept anywhere, by an explicit earlier decision, and updating in place otherwise destroys the only record of what the last push measured.

It is labelled a delta and not a verdict. This test's run-to-run spread on one unchanged commit is wide enough that a single push of difference is noise far more often than it is a change.

A status change edited a comment nobody was looking at. Editing something thirty scrolls up produces no notification and no visible change to a reader going top to bottom, so a run that went green→red announced itself silently. Now a fresh comment is posted at the bottom and the old one is retired — marker renamed so later pushes stop targeting it, and a link forward so a reader who lands on the stale one is not stranded. Number-only movement still updates in place; only the verdict earns a new comment.

The retire happens BEFORE the create, and the order is the safety property. There is no transaction across two API calls, so one can fail after the other succeeded. Creating first and failing to retire leaves two comments carrying the live marker — and since the lookup paginates oldest-first and takes the first match, every later run latches onto the stale one forever while the new report sits orphaned. Retiring first fails the other way: no live marker at all, so the next run simply posts a fresh one. The forward link costs a third write and is therefore best-effort and last, since by then the marker state is already correct.

An in-place update looked dead. The body could be identical to last week's with nothing to say a run had happened. Every report now carries a stamp: the head SHA as a link to that commit in this PR, a link to the run, and the time. The SHA link is the part that matters — a static comment body cannot render the reader's local time (GitHub's sanitiser strips <time>, <time-ago> and <local-time>, and the REST API exposes no user timezone), but the commit page it links to carries GitHub's own localised relative timestamp. Nobody has to do arithmetic on a UTC string; they click. It is abbreviated to seven characters to match GitHub's own abbreviation everywhere else on the page.

"No comparable reference" read as "no baseline exists". Baselines usually do exist; they just ran a different set of tests, most often because the PR itself enabled or disabled some. The message now says how many were found and that a matrix change is usually the PR's own doing — and the readings are shown, with "different test set - not a control" in its own column on every borrowed row, so a number cannot be lifted out of the table without its warning.

The report must not contradict itself

Three fixes from the @claude review round, all about the report misleading a reader who does exactly the right thing with it.

The headline stated a difference flatly against an undisclosed noise floor. "This branch is about 8% faster than master" sat two paragraphs above the same comment's own statement that this test moves 13-17% run to run — so the report contradicted itself and the headline won, because the headline is what gets read. It now discloses the floor in the same sentence, and the verb changed with it: "measured about 8% faster" is a fact about this run; "is about 8% faster" was a claim about the branch.

The printed ratio could contradict its own icon. toFixed(3) rounds, and at a bound the rounding crosses it: 0.4996 printed as 0.500 beside a 🔴 whose bound the very same comment prints as "< 0.50". The displayed value now widens its precision until it lands in the same verdict band as the raw one. Away from a bound nothing changes.

A subject test that did not run was reported as a regression. verdictFor's no-subject sentinel had no guard: the destructure left ratio undefined, the template threw on ratio.toFixed(3), and Node exits 1 for an uncaught throw — which is this script's own code for VIOLATION. It failed loudly for the wrong reason and wrote no report at all, breaking the file's own "every exit writes a report" rule by the single exit that never reached writeReport. Pre-existing, taken here because the fix is a ten-line guard mirroring the two beside it.

The posting step could fail the required check

It makes one or two GitHub API writes inside the REQUIRED Performance Tests job and, unlike its sibling, had no continue-on-error — so a rate limit, a 500 or a script exception failed the check for a reason unrelated to the lane or the verdict. The comment is the nice-to-have; the job's own result is not.

One more comment step, same defect class

Riding in rather than taking its own branch, because it is the same file and the same reasoning. All of it is pre-existing on master; none is introduced here.

The SpotBugs summary step called listComments unpaginated. That is latent rather than live, and the reason is worth stating: the API returns 30 per page oldest first, so a sticky comment born early stays on page one forever and keeps working. It only breaks when the comment is born late — created once a PR already has 30+ comments, it lands on page two, find never sees it again, and every later push takes the create branch. So it would not miss once and recover; it would duplicate on every push. Measured exposure, so as not to overstate it: the busiest PRs in this repo today are 13, 11, 11, 10 and 9 comments, all comfortably above the fold.

It also matched any comment containing "SpotBugs Report" — including a human quoting it — and took the oldest match, so somebody who asked a question about the report before the bot first posted would have had their comment silently overwritten. It now requires a Bot author, the same way the throughput lookup does.

And it posted with no continue-on-error, the same omission fixed above.

This was the only remaining unpaginated listComments in the tree; bin/quarantine-lane-report.sh already passes --paginate.

A mistake worth reading, because the test missed it

The status began as a second argument to writeReport. Inserting it meant locating each call's closing paren, and the report bodies are template literals containing escaped backticks — so all six insertions landed inside the prose, producing control classes (`...`, 'no-control') produced a time and an empty payload.

The self-test written to prevent exactly that passed on all six, because it grepped for the literal rather than checking where it was.

So the status is now set into a variable on the line before each call, which cannot fail that way, and the test runs the reporter and reads the payload back as the workflow does. Verified in both directions: reintroducing the corruption fails it with expected no-control, got unset; the previous test stayed green.

Coverage, stated rather than implied

The reporter has eight writeReport exits, and the split that matters is not covered-versus-uncovered but local versus networked. Exactly three are decided from local files before any network call — no-rate, no-control, no-subject — and the runtime test now drives all three, each reached by shaping only the files on disk so the case stays hermetic. Exit code and report are asserted every time, because either alone would pass against some version of the bug the guard exists for.

The other five — bootstrapping, check-failed, no-reference, incomparable, and the main verdict path — sit behind gh run list and an artifact download. Reaching them offline means putting a test seam into production code, and that is a design call left open rather than made here. What has changed is its scope: it is a question about those five specifically, not about "the rest of them", and no free coverage is being left on the table while it is pending.

The two pure helpers the verdict path depends on (the headline sentence and the ratio display) are unit-tested directly — including displayRatio's ladder-exhausted fallback, the one branch of it no other case reaches — so the findings from both review rounds are covered even though the path that renders them is not. The incomparable path is still verified by parse and by reading, not by execution. That is weaker, and it is why this section exists.

The second review round asked for one thing

It did not ask for the design to change. continue-on-error swallowing a failed create after the
old comment has been retired is the right trade, and the reviewer explicitly declined to reverse it.
The wording written into the retired comment was the defect: it named a PLACE - "Superseded by a
newer report further down this conversation" - and that write happens before the create that may
never succeed.

The false pointer is permanent, not transient, which is what made it worth fixing rather than
noting. The retired marker <!-- pc-throughput-report (superseded) --> is not a substring of the
live marker the lookup searches for, so no later run ever finds that comment again to correct it.
The next push heals the live comment - existing comes back falsy, so it takes the create-fresh
branch - and leaves the orphan untouched forever.

retiredBody now takes the whole trailing note rather than a noun slotted into a fixed
"Superseded by X" sentence, because the two writes cannot honestly promise the same thing. The
pre-create note claims only what is already true when it is written - this reading is superseded, a
fresh report should follow for this push - and names no place. The post-create note, written once
the new comment demonstrably exists, still links straight at it.

The round's other two questions came back as no-change, which is the useful outcome for both.
displayRatio's boundary behaviour was traced by hand and found correct - including the adversarial
case that exhausts the entire [3, 4, 5, 6, 9] ladder and falls through to String(ratio), which
holds because that is the shortest representation round-tripping the double exactly. That fallback
was the one branch of the function no test reached, so it is now pinned, verified in both
directions
: replacing it with a final toFixed(9) fails exactly the two new assertions and
nothing else. The SpotBugs author guard was judged better bundled than split, and stays bundled.

One sighting, riding along

The Chaos Pain Suite went red on one head of this branch carrying the confluentinc#857 revoke-path
discriminator - the poll thread found BLOCKED on a monitor held by its own control thread, inside
onPartitionsRevoked -> commitOffsetsThatAreReady. Not this PR's defect and not fixed here:
the diff has no Java in it at all, and the lane passed again on the next head that completed.

It is the sixth capture of a signature already documented five times, so it is recorded for its
seed, which dies with the log, and for the two things it does add. The frame line numbers moved
again - :1780 / :580 against the fifth capture's :1589 / :552 - which turns that capture's
"match by method and monitor, not by line" advice from precautionary into load-bearing. And because
this branch carries no compiled change the chaos suite could reach, it is the cheapest
not-PR-introduced control arm in that file: every earlier capture had to argue the branch was
innocent, this one does not.

Checklist

  • Docs updated — the reasoning lives in the reporter and workflow headers, where the next editor meets it
  • User-facing feature documentation data added under docs/features/ — N/A - CI reporting, not a library feature
  • Tests added/updated — the self-test runs the reporter rather than grepping its source, and now covers a second path plus the two new pure helpers
  • docs/inflight/ working note started at the PR's first commit — N/A - a scoped follow-up to ci(perf): a throughput check derived by conservation, against recent master runs #401, fully described here and in the commit bodies
  • Title & body reflect the final content of this PR
  • Ran ce-simplify and ce-code-review locally — N/A - asking for @claude review this on the PR instead

astubbs and others added 2 commits September 2, 2026 09:04
…when the verdict does

Review asked for four things. Two were already true, and saying so is the useful half of the answer:
the check already runs on every push, because it is a step in the performance job; and it already
updates its comment in place rather than appending, deliberately, because a PR with fifteen
throughput comments is a PR where nobody reads the throughput comment.

The other two were real gaps.

THE COMMENT NOW CARRIES ITS OWN READINGS, SO THE NEXT PUSH CAN SHOW A DELTA

Each report ends with one line of machine-readable state - status, rate, ratio, share. The workflow
reads it back off its own previous comment and renders "since the previous push: rate X -> Y (+n%)".
Reading our own last comment is the only store available: no series is kept anywhere, by an explicit
earlier decision, and updating in place otherwise destroys the only record of what the last push
measured.

It is labelled a delta and not a verdict. This test's run-to-run spread on one unchanged commit is
wide enough that a single push of difference is noise far more often than it is a change.

A STATUS CHANGE NOW POSTS A NEW COMMENT INSTEAD OF SILENTLY EDITING AN OLD ONE

Editing a comment thirty scrolls up produces no notification and no visible change to anyone reading
the PR top to bottom, so a run that went green to red announced itself by rewriting something nobody
was looking at. On a status change the old comment is retired - its marker renamed so later pushes
stop targeting it, its heading marked superseded - and a fresh one posted at the bottom. Number-only
movement still updates in place; only the VERDICT earns a new comment.

AND THE "NO COMPARABLE REFERENCE" MESSAGE SAID LESS THAN IT KNEW

It reads as "no baseline exists" and has been read that way. Baselines usually do exist - they just
ran a different set of tests, most often because the PR itself enabled or disabled some. The message
now says how many were found and that a matrix change is usually the PR's own doing.

THE TEST FOR THIS IS A RUNTIME TEST, AFTER THE FIRST ONE PASSED ON SIX CORRUPTED MESSAGES

The status started as a second argument to writeReport. Inserting it meant finding each call's
closing paren, and the report bodies are template literals containing escaped backticks - so all six
insertions landed INSIDE the prose, producing "control classes (`...`, 'no-control') produced a time"
and an empty payload. The self-test written to prevent exactly that passed anyway, because it grepped
for the literal rather than checking where it was.

So the status is now set into a variable on the line before each call, which cannot go wrong that
way, and the test RUNS the reporter and reads the payload back the way the workflow does. Verified by
reintroducing the corruption: the old test stayed green, this one fails with "expected no-control,
got unset".

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UH2q829FDKQcqQseE8Cp7q
… and show incomparable readings

Two follow-ups from review, both about the comment being less useful than the data behind it.

AN IN-PLACE UPDATE LOOKS DEAD

The body could be identical to last week's and nothing on it said a run had happened - no timestamp,
no commit, no link. A reader cannot tell a fresh verdict from a stale one, and the honest reaction to
that is to stop trusting the comment. Every report now carries the head sha it ran from, a link to
the run, and the time, which is what makes "updated in place" legible as "updated".

And when a status change retires a comment, the retired one now links FORWARD to its replacement.
Renaming its marker stops later pushes targeting it, but a reader who lands on the stale one from a
notification or a scroll was left with no way on.

SHOW THE INCOMPARABLE READINGS, FLAGGED PER ROW

Refusing to compute a verdict from a run with a different workload is right. Refusing to SHOW the
numbers is a separate decision nobody asked for, and it sends the reader to the job logs to find out
roughly where they stand.

The candidates' rates are now listed beside this run's, and every borrowed row carries "different
test set - not a control" in its own column rather than in a footnote - so a number cannot be lifted
out of the table without its warning attached. A sentence under it says a difference against those
rows measures nothing.

NOT COVERED BY A TEST, AND SAYING SO

The runtime self-test exercises the no-control path, which is the cheapest one to reach with a
fixture. The incomparable path needs baseline artifacts from several runs to reach, so the new table
is verified by parse and by reading, not by execution. That is weaker and it is the reason this note
is here rather than a claim that it is tested.

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

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown

Dependency Review

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

Scanned Files

None

@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown

✅ Duplicate Code Report

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

✅ PMD CPD

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

No new clones introduced by this PR.

✅ jscpd (language-agnostic)

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

No new clones introduced by this PR.

Powered by astubbs/duplicate-code-cross-check

@github-actions

github-actions Bot commented Sep 1, 2026 •

Copy link
Copy Markdown

📌 Duplicate code detection tool report

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

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

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

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

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

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

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

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

File Similarity (%)
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/SeenSucceededOrderingProbes.java 54.89 ⚠️
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/BootstrapResetTripleWriteProbes.java 40.26
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CalibrationProbes.java 36.83
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/SeenSucceededOrderingProbes.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 55.99 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 38.24
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 34.16
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 33.0
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 32.43
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 32.31
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 31.63
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 65.03 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 58.97 ⚠️
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 43.04
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 42.27
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 33.47
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 31.96
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/RecordContextInternal.java 30.15
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 65.03 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 54.89 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 41.82
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 35.6
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 32.81
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 30.76
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PCRetriableException.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/PCRetriableExceptionTest.java 33.92
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/ThrowableUtils.java 32.27
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 55.99 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 48.03
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 38.76
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 30.82
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 30.48
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 58.97 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 54.89 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 50.13 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 36.19
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 35.05
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 32.91
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 50.13 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 42.27
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 41.82
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 37.12
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContext.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 36.19
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/RecordContextInternal.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContext.java 43.83
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 30.15
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/SubmitWorkToPoolShutdownRaceTest.java 43.13
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ExternalEngine.java 41.34
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 37.61
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/BrokerPollSystem.java 34.83
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ConsumerManager.java 32.15
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ProducerManager.java 31.31
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 30.98
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java 30.77
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/BrokerPollSystem.java

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ExternalEnginePipelineBufferTest.java 43.35
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 41.34
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 36.3
parallel-consumer-reactor/src/main/java/bz/stub/parallelconsumer/reactor/ReactorProcessor.java 30.66
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 55.7 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 50.17 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 48.39
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 48.03
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 38.24
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCInternalRuntimeException.java 37.08
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 32.27
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 30.07
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCInternalRuntimeException.java

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/AmbientProbeExtension.java 31.19
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ProducerManager.java

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/CollectionUtils.java 37.08
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/Java8StreamUtils.java 32.0
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/ThrowableUtils.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/metrics/PCMetrics859Test.java 42.54
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/MetricsTeardownCannotBreakCloseTest.java 32.11
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 47.8
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 34.15
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 33.31
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 32.31
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 32.27
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 30.82
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 55.7 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 47.8
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 46.76
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 46.03
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 45.06
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 44.89
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 38.76
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 34.16
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 48.39
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 46.56
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 45.06
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 34.99
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 34.12
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 50.17 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 46.76
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 46.56
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 33.0
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 30.48
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 60.3 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 46.03
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 34.99
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 34.15
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 32.43
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 30.07
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 60.3 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 44.89
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 34.12
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 33.31
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 31.63
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 34.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionStateManager.java 32.74
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 30.77
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionStateManager.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java 39.55
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java 38.17
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 37.71
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardAvailableCountOwnershipTest.java 37.29
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkContainer.java 37.07
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 30.98
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 38.17
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 36.56
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java 33.67
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkContainer.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionStateManager.java 43.47
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 37.71
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 37.61
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java 36.56
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java 34.1
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/AmbientProbeExtension.java

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 40.35
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 39.64
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 36.43
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/RebalanceEoSDeadlockTest.java

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 53.95 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 43.67
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 39.64
parallel-consumer-vertx/src/test-integration/java/bz/stub/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 30.87
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 57.54 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 53.95 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 40.35
parallel-consumer-vertx/src/test-integration/java/bz/stub/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 35.65
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 43.52
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkKeyOrderIT.java 42.18
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 38.76
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 34.39
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java 33.63
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ProgressProbe.java 30.9
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 43.67
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 43.52
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 39.47
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkKeyOrderIT.java 52.35 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 43.67
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 38.76
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 35.56
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ProgressProbe.java 30.04
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkCooperativeDrainIT.java

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkCooperativeIT.java 41.73
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 33.63
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkKeyOrderIT.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 39.47
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 35.56
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 34.39
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ProgressProbe.java 31.37
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/DiagnosticQuietCap.java

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 31.37
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 30.9
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 30.04
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AbstractParallelEoSStreamProcessorConfigurationTest.java

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

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

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerTestBase.java 35.22
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CommitRejectionTestBase.java 31.64
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ConsumerOffsetCommitter.java 30.23
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java

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

File Similarity (%)
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorBatchTest.java 52.02 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java 50.71 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java 44.56
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/BatchTestBase.java 30.42
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MdcBoundaryProbe.java

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

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

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PCRetriableException.java 33.92
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/ParallelEoSSStreamProcessorRebalancedTest.java

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 87.58 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 87.2 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 86.77 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 83.84 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 83.84 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 83.84 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 82.36 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 82.36 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TransactionalBatchProduceTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProduceLockReleaseTest.java 32.04
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ConsumerManagerCloseOwnershipTest.java

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

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

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProducerManagerTest.java 36.56
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TransactionalBatchProduceTest.java 32.04
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProducerManagerTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProduceLockReleaseTest.java 36.56
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/SubmitWorkToPoolShutdownRaceTest.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 35.05
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 31.96
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 30.76
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ThreadConfinedConsumerTest.java

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

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

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/KafkaSanityTests.java 32.75
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/ThrowableUtilsTest.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/metrics/PCMetrics.java 42.54
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/MetricsTeardownCannotBreakCloseTest.java 37.34
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/OffsetEncodingBackPressureTest.java

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerLincheckTest.java 31.75
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckHarness.java 30.99
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/OffsetEncoderWidenedRangeRaceTest.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/OffsetEncoderWidenedRangeRaceTest.java 46.42
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateCommitShiftCompounding894Test.java 42.35
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateLincheckTest.java 33.6
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateCommitShiftCompounding894Test.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateCommitEncodeShift894Test.java 42.35
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateLincheckTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerLincheckTest.java 35.82
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateCommitEncodeShift894Test.java 33.6
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueLincheckTest.java 31.15
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerLincheckTest.java 30.57
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ProcessingShardStaleReplacement909Test.java

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerLincheckTest.java 42.69
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateLincheckTest.java 31.15
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerLincheckTest.java 30.27
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardAvailableCountOwnershipTest.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueLincheckTest.java 42.69
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateLincheckTest.java 35.82
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerLincheckTest.java 34.33
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckToolchainProbeTest.java 31.75
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerRevokeSweepNpeTest.java

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 39.55
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java 33.67
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardAvailableCountOwnershipTest.java 33.41
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkClaimStateMachineTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerTest.java 54.36 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkContainer.java 49.43
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerLincheckTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerLincheckTest.java 34.33
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateLincheckTest.java 30.57
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueLincheckTest.java 30.27
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerStaleCheckDoubleLookupTest.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkClaimStateMachineTest.java 54.36 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/truth/CommitHistorySubject.java

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 83.84 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 83.38 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 83.02 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 82.61 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 79.82 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 79.82 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 78.4 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 78.4 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 82.36 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 81.9 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 81.55 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 81.14 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 78.4 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 78.4 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 78.4 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 77.01 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/integrationTests/CoreAppMetricsIntegrationTest.java

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 83.84 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 83.38 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 83.02 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 82.61 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 79.82 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 79.82 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 78.4 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 78.4 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 82.36 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 81.9 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 81.55 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 81.14 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 78.4 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 78.4 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 78.4 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 77.01 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/main/java/bz/stub/parallelconsumer/examples/vertx/VertxApp.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 83.84 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 83.38 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 83.02 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 82.61 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 79.82 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 79.82 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 78.4 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 78.4 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/VertxAppTest.java

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

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

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

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

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

File Similarity (%)
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorBatchTest.java 80.77 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 50.71 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java 48.73
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyMdcPropagationTest.java

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

File Similarity (%)
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorMdcPropagationTest.java 47.91
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyPCTest.java

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 87.2 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 86.72 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 85.92 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 83.02 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 83.02 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 83.02 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 81.55 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 81.55 ⚠️
parallel-consumer-reactor/src/main/java/bz/stub/parallelconsumer/reactor/ReactorProcessor.java

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

File Similarity (%)
parallel-consumer-mutiny/src/main/java/bz/stub/parallelconsumer/mutiny/MutinyProcessor.java 44.69
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ExternalEngine.java 30.66
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorBatchTest.java

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

File Similarity (%)
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java 80.77 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 52.02 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java 49.96
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorMdcPropagationTest.java

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

File Similarity (%)
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyMdcPropagationTest.java 47.91
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorPCTest.java

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 86.77 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 86.29 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 85.92 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 82.61 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 82.61 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 82.61 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 81.14 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 81.14 ⚠️
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 43.04
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 41.41
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java 37.74
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 37.48
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 35.6
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 32.91
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java

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

File Similarity (%)
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java 42.53
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 41.41
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 37.12
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 33.47
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 32.81
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java

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

File Similarity (%)
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java 40.77
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 37.48
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ExternalEngine.java 36.3
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 87.58 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 86.72 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 86.29 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 83.38 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 83.38 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 83.38 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 81.9 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 81.9 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java

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

File Similarity (%)
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorBatchTest.java 49.96
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java 48.73
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 44.56

@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown

🧪🔒 Quarantine Lane Report

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

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

@github-actions

github-actions Bot commented Sep 1, 2026 •

Copy link
Copy Markdown

⚠️ SpotBugs Report

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

@github-actions

github-actions Bot commented Sep 1, 2026 •

Copy link
Copy Markdown

🟢 Throughput — OK

This branch measured about 6% slower than master, on the one test this measures. That is INSIDE this test's own run-to-run spread of about 17%, so read it as a reading and not as a result - re-running the same commit moves it by about as much.

What Value Meaning
Compared with master 0.939 above 1.00 is faster, below is slower
Subject test took 65.1s the test under measurement
Control tests took 33.0s the other tests in this same run
Subject ÷ controls, here 1.973 not a speed - a shape that cancels machine speed
Subject ÷ controls, master 1.852 median of recent master runs
Reported rate 59231 rec/s this machine only; not comparable across runners

Allowable range 🟢 ≥ 0.70 · 🟡 0.50–0.70 (about a 30% loss) · 🔴 < 0.50 (about a 50% loss)

What the numbers mean, and what they cannot tell you

The one that gets misread. Subject ÷ controls is a shape, not a speed. 1.7 means the subject took 1.7 times as long as the control tests in the same run - it says nothing about master on its own, and a reviewer has already read it as "1.7x faster than master". Only Compared with master answers that question.

Why a shape and not a rate. A rate depends on which runner you drew. A shape does not: every test here processes a fixed number of records, so a runner twice as slow doubles the subject and the controls together and leaves their ratio alone. That is the whole trick, and it is why the reported rate is shown last and labelled as this machine only.

Reading the comparison. master ÷ this run. Above 1.00 the subject is proportionally quicker here than on master; below 1.00 it is slower. 0.50 means it takes twice as long relative to its controls - that is the failing bound, not a small one.

By conservation, not by correction. Every test in this lane processes a fixed number of records, so within one run the ratio of one test's time to another's is invariant under machine speed — a runner twice as slow doubles both terms and leaves the ratio alone. There is no machine-index correction to be wrong, because nothing needed correcting. share = subjectSeconds / controlSeconds, both from this same run.

Per-method times, not class times. A class time is work + setup, and container startup and @BeforeAll do not scale with work — they are the non-conserved term, and leaving them in breaks the invariant.

Reference is the median of 4 recent perf baseline (master) run(s), read from their artifacts. There is no committed baseline to go stale, and a share is dimensionless, so an old entry stays comparable to a new one without re-baselining. Shares observed: 1.667 – 2.026.

What this still cannot do. It removes machine-to-machine variance. It does not remove this test's own run-to-run variance, measured at about 30% on a single unchanged commit while its controls stayed within 5%. That is a property of the test, not of the comparison, and no arithmetic here can touch it — which is why the reference is a median and the bounds are deliberately coarse. 🟡 means look at this; only 🔴 is outside the measured spread.

Runs used: 000de5d, b36ad94, 625a8c1, 54301eb

Since the previous push: ratio 0.998 -> 0.939, share 1.856 -> 1.973, rate 67546 -> 59231 (-12.3%). One push of difference sits inside this test's measured spread - read it as movement, not as a result.

Updated for f8b2e07 · run 33576960458 · 2026-09-02 00:56 UTC

…ing the opposite

A reviewer read "Subject share, this run: 1.713" as "this build is 1.7x faster than master". That is a
fair reading of those words and it is wrong by a factor of twenty: 1.713 is the subject's time divided
by the CONTROL tests' time in the SAME run, and the actual comparison with master was 1.081 - about
8% faster. A report whose headline number is routinely read as twenty times its true value is not a
labelling problem, it is a broken report.

THE ANSWER NOW COMES FIRST, IN A SENTENCE

"This branch is about 8% faster than master, on the one test this measures." Nobody should have to
divide two ratios to learn whether their branch got slower.

EVERY ROW IS NAMED IN WORDS, AND SAYS WHAT IT IS FOR

"Subject share" and "Reference share" were the method's vocabulary, not the reader's. The table now
has a Meaning column: the comparison says which direction is better, the share row says outright that
it is NOT a speed, and the reported rate says it is this machine only. The comparison is first
because it is the only row that mentions master.

THE EMPTY FIRST ROW WAS A REAL BUG, IN FIVE PLACES

Every table opened with `| | |` - a header row of two empty cells, which GitHub renders as a blank
band above the data. It looked like a rendering fault because it was one. All five now carry column
names.

THE EXPLANATION LEADS WITH THE MISREADING

The collapsed section explained the derivation before saying what the numbers mean. It now opens with
the one that gets misread, states why a shape rather than a rate (a rate depends on which runner you
drew; a shape does not), and how to read the comparison - including that the 0.50 failing bound means
taking twice as long relative to its controls, which is not a small regression.

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

@astubbs astubbs left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

lgtm

astubbs and others added 2 commits September 2, 2026 10:50
…ritten for

Review of this branch, cross-checked against an independent model, found the replacement self-test
carrying four versions of the same mistake it was written to remove. Running the reporter is not the
same as checking the run.

THE ASSERTION FOR THE ORIGINAL BUG COULD NOT FAIL

`text.includes('control classes (`')` was true whether or not the status literal had been injected
into the prose, because the corruption landed at the CLOSING paren and left that opening text intact.
Both arms of a control experiment - the clean report, and the report carrying the exact string the
last commit quotes - pass it. So the assertion written to catch that bug agreed with the bug.

It now splits the payload off and asserts the status literal appears NOWHERE in the prose a human
reads. Same experiment: clean passes, corrupted fails.

THE SPAWN RESULT WAS THROWN AWAY

A reporter that wrote the right report and then returned the wrong exit code passed everything. The
workflow branches on that code, and the four-value contract (0 pass, 1 violation, 2 cannot run,
3 nothing in scope) was asserted nowhere at all. Exit 2 is now pinned for the no-control path.

A STALE REPORT SCORED AS A FRESH ONE

Nothing removed `target/throughput-report.md` before the spawn, so a reporter that wrote nothing
passed against whatever was already on disk. Verified: sabotaging the write while leaving a passing
report in place was green before, red now.

THE FIXTURE WAS ONLY HALF THE INPUT

The reporter also globs `**/target/failsafe-reports/`. A developer holding real failsafe XML gives it
a control class, which takes it off the no-control path and out to `gh run list` - a networked,
credentialed run wearing this test's name. The precondition is asserted and fails loudly rather than
passing through a different path, because a skip is not a pass.

AND `finally` DOES NOT RUN ON Ctrl-C

Node terminates on SIGINT with no listener installed, so interrupting the test left the developer's
real files replaced by the fixture - the exact loss the save/restore exists to prevent. Handlers now
restore and re-raise with the default disposition.

Each of the four was red-proofed by reintroducing its defect: all four go red, and the control arm
with the reporter unmutated stays green and byte-identical.

Also records why the `pc-throughput-data` marker is hand-written in three places rather than shared -
the workflow reader cannot import a module, and the test's parser is independent on purpose, since a
test parsing with the producer's own code would agree with it by construction. `grep -rn
pc-throughput-data` is named as the list to change, because nothing enforces that the three agree.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UH2q829FDKQcqQseE8Cp7q
…t as no change

Review found the new logic defeats itself on the one run where it matters, and the case is live on
three open PRs today.

`statusChanged = prev && cur && prev.status !== cur.status` is falsy whenever `prev` is null - which
is every throughput comment posted before the payload existed. #405,
#400 and #29 each carry a marker-bearing comment
with no payload right now. So the first green-to-red on any of them would have been applied by
silently editing a comment far up the page: precisely the failure this change was written to remove,
on the first run after it merges.

Now `cur && (!prev || prev.status !== cur.status)`. Unknown is not the same as unchanged. The cost is
one extra comment per PR carrying a legacy one, once, which is the right way round.

TWO HARDENING FIXES FOUND ALONGSIDE IT

The comment lookup is paginated. listComments returns 30 per page, so on a busy PR the report scrolls
off page one, every push posts a fresh comment instead of updating, and the delta disappears - the
fifteen-comments problem returning by a different route.

And it is restricted to comments this workflow could have written. The found comment stopped being
decoration when its payload began steering the update-versus-post decision: it is an input now, so
anyone able to comment could otherwise plant a marker. The status is also stripped to letters before
it reaches a comment body, where `rate` and `ratio` were already type-checked and it was not.

Found by ce-code-review, verified here before acting rather than taken on the report's word: the
legacy-comment case was confirmed by querying the three PRs for marker comments lacking a payload.

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

astubbs commented Sep 1, 2026

Copy link
Copy Markdown
Owner Author

@claude review this

Two passes have already run on this branch (ce-simplify, then ce-code-review with a cross-model adversarial arm), and their findings are either applied or listed below. Please focus on what those could not settle rather than re-deriving them.

The workflow behaviour is the part nothing local can verify. Known and unfixed, in the order I would weigh them:

  • create-then-retire has no compensation: if the retire call fails after the create succeeds, two live markers exist and every later run latches onto the stale one. Retiring first would fail safe.
  • the post step lacks continue-on-error while its sibling has it, and it now makes two API writes inside a REQUIRED job.
  • the delta renders rate and ratio but not share, which is the one machine-independent number and is already in the payload.
  • the headline asserts "about 8% faster" flatly against a measured 13-17% noise floor that the same comment prints lower down.
  • a rounded ratio can contradict its icon at the boundary (0.4996).
  • pre-existing, not from this PR: verdictFors no-subject sentinel is unhandled - it throws, exits 1, and reads as a regression while writing no report, against that file own rule that every exit writes one.

Coverage is narrower than the body first claimed and the body has been corrected: the runtime self-test reaches the no-control path only, so 6 of 7 writeReport paths are unexercised - including the main verdict path, the only one whose payload carries the rate/ratio/share keys the delta reads.

Five decisions are deliberate and defended in the code comments: the status is set by variable assignment rather than passed as an argument (passing it corrupted all six messages); the self-test runs the reporter rather than grepping it (the grep version passed on those six); update-in-place with a new comment only on status change; the verdict is advisory, not blocking; and incomparable readings are shown with a per-row caveat rather than hidden.

@claude

claude Bot commented Sep 1, 2026 •

Copy link
Copy Markdown

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


Review — the workflow-behaviour findings

  • Read branch commits, PR body/comments
  • Read all three changed files in full (maven.yml, check-throughput-regression.mjs, test-check-throughput-regression.mjs, plus bin/lib/throughput-verdict.mjs)
  • Checked each of the six known-and-unfixed items against the actual code
  • Looked for anything the two prior passes might have missed
  • Findings posted

As asked, I focused on the workflow behaviour list rather than re-deriving what ce-simplify/ce-code-review already settled. All six check out against the code as it stands on this branch.

Confirmed, in the order you weighed them:

  1. Create-then-retire has no compensation (.github/workflows/maven.yml:287-298). On a status change, createComment runs first; only then is the old comment's marker rewritten to (superseded). If that second updateComment throws after the create succeeds, both comments still carry the live `` marker. listComments/`paginate` returns oldest-first, and `all.find(...)` (line 245) takes the first match — so the next run latches onto the stale comment while the newer one sits orphaned with no forward link. Retiring first would indeed fail safe: if create then fails, there's no live marker at all, and the next run just creates a fresh one — degraded but unambiguous.

  2. Missing continue-on-error on "Post the throughput report" (.github/workflows/maven.yml:214-219). Confirmed absent, unlike its sibling "Throughput regression check" (line 197). This step now does one or two GitHub API writes via github-script inside the matrix entry the PR's own comment (line 216-218) says is the REQUIRED job. Any transient failure there (rate limit, 500, a script exception) fails the required check for a reason unrelated to the lane or the verdict.

  3. Delta omits share (.github/workflows/maven.yml:252-262). The bits array pushes status, rate, ratio — never share, even though writeReport's payload (bin/check-throughput-regression.mjs:357-358) already carries it. share is the one number in the payload that's dimensionless/machine-independent per throughput-verdict.mjs's whole argument; ratio is a comparison-to-master and rate is explicitly "not comparable across runners", so this is the delta line most worth having and it's the one left out.

  4. Headline states a flat percentage against an undisclosed noise floor (bin/check-throughput-regression.mjs:316-320). headline renders "This branch is about N% faster/slower than master" from a single run's ratio, unconditionally — there's no caveat at the headline itself. The report's own <details> block (line 351) says the test's run-to-run variance is "about 30%... a property of the test," and the file's header comment separately measures 13-17%. Both live in the same comment as the flat headline sentence, so a reader can see "about 8% slower" stated as fact two lines above a section explaining that a single-push difference this size is mostly noise.

  5. Rounded ratio can contradict its icon at the boundary. Confirmed by reading throughput-verdict.mjs:89-90: icon/word/failed are computed from the raw ratio, but the report only ever displays ratio.toFixed(3) (check-throughput-regression.mjs:328). 0.4996 renders as 0.500 while triggering 🔴 FAIL (since 0.4996 < FAIL_BELOW); 0.6996 renders as 0.700 while still triggering 🟡 FLAG. Either way the displayed number sits exactly on a boundary stated in the same report's "Allowable range" line while the icon says the other side. Narrow window, but real, and a reader who eyeballs the number against the stated ranges will get it wrong.

  6. no-subject sentinel is unhandled — pre-existing, confirmed. There is no observedSubject > 0 guard anywhere between where it's computed (check-throughput-regression.mjs:133) and the verdictFor call (:302), unlike the parallel no-rate/no-control guards a few lines above it. When verdictFor (throughput-verdict.mjs:79) returns {kind: 'no-subject'}, the destructure at check-throughput-regression.mjs:303 leaves ratio/icon/word all undefined, and building the report template hits ${ratio.toFixed(3)} (:328) — undefined.toFixed throws before writeReport is ever reached. Node's default uncaught-exception exit is 1, which is this script's own contract for VIOLATION, so it does read as a regression while writing nothing — exactly as you described, and worth a tracking note somewhere since it's out of this PR's scope but now independently confirmed rather than asserted.

Nothing additional found. I checked for a concurrent-run variant of #1 (two workflow runs racing on the same comment list) — maven.yml:31-33 already has concurrency: { group: ..., cancel-in-progress: true } on head_ref, which closes that off, so #1 is really only the single-run partial-failure case you named.

The five deliberate decisions you listed (status-by-assignment, reporter-run self-test, update-in-place with new-comment-on-status-change, advisory verdict, incomparable-but-shown readings) all read as correctly implemented and match their code comments — no objection to any of them.

Four fixes to the step that POSTS the report, all about the step misbehaving
rather than about what it measures. Raised on this PR's review and each
confirmed against the code before being taken.

RETIRE BEFORE CREATING. On a status change the step created the new comment and
only then rewrote the old one's marker to `(superseded)`. There is no
transaction across two API calls, so a failure between them left TWO comments
carrying the live marker - and because the lookup paginates oldest-first and
takes the first match, every later run would latch onto the STALE one and update
it forever while the new report sat orphaned. Silent, self-perpetuating, and
worst on exactly the status change the mechanism exists to announce. Reversed,
the failure mode becomes zero live markers and the next run simply posts a fresh
one: degraded, obvious, self-healing. Verified by running the step's script
against a stubbed API with `createComment` throwing - zero live markers remain,
where the old order left two.

The forward link to the new comment costs a third write, so it is now
best-effort and last. By the time it runs the marker state is already correct
either way, so losing it costs the reader a direct link, never correctness.

CONTINUE-ON-ERROR, which the sibling step already had and this one did not. It
makes one or two GitHub API writes inside the REQUIRED Performance Tests job, so
a rate limit, a 500 or a script exception failed the required check for a reason
unrelated to the lane or the verdict. The comment is the nice-to-have; the job's
own result is not.

THE DELTA NOW RENDERS `share`. It was already in the payload and was the one
number left out - the raw dimensionless shape the whole method rests on, where
`ratio` is derived from it and `rate` is explicitly not comparable across
runners. The parts are also reordered to match the report's own table: most
machine-independent first, the machine-only rate last.

THE FRESHNESS STAMP LINKS THE SHA, at seven characters rather than nine. GitHub
abbreviates to seven everywhere else on the same page, so the old form showed a
second, different-looking abbreviation of the same commit and made a reader stop
to check it was even the same one. The link points at `/pull/N/commits/<sha>`,
checked to resolve and to keep the PR framing, and that is the real answer to
"is this comment current?" - the commit page carries GitHub's own localised,
relative timestamp, so nobody has to do arithmetic on a UTC string.

A static comment body cannot produce local time itself, and that was measured
rather than assumed: rendering candidates through the /markdown API in this
repo's comment context, GitHub's sanitiser strips `<time>`, `<time-ago>` and
`<local-time>` to their text, and the REST API exposes no user timezone. The UTC
timestamp therefore stays, and stays plain, because it is the one thing the
links cannot do - show at a glance that a run happened without navigating
anywhere.

One finding worth leaving behind for whoever revisits this: `<relative-time
datetime=...>` DOES survive that sanitiser with its attribute intact, and being
a custom element GitHub registers page-wide it would upgrade inside user content
and render reader-local, with the UTC text as a graceful fallback. It was built,
then dropped: the link already answers the question, and this line's whole job
is to be short.
Three report-correctness fixes and the tests for them, all raised on this PR's
review and confirmed against the code.

THE `no-subject` SENTINEL WAS UNHANDLED, and it was the only one of the three
that was. `verdictFor` returns it when this run produced no per-method time for
the subject class, and nothing between that call and the report template guarded
it: the destructure left `ratio` undefined, building the template threw on
`ratio.toFixed(3)`, and Node exits 1 for an uncaught throw - which is this
script's own code for VIOLATION. So a subject test that never ran was reported
as a REGRESSION, and did it while writing no report at all, breaking the file's
own "EVERY EXIT WRITES A REPORT" rule by the single exit that never reached
`writeReport`. Now guarded beside its two neighbours, and deliberately AFTER the
control guard: when both are missing, the broader fact is the useful one, and
naming the subject alone would send the reader to look at one test.

THE HEADLINE STATED A DIFFERENCE FLATLY AGAINST AN UNDISCLOSED NOISE FLOOR.
"This branch is about 8% faster than master" sat two paragraphs above the same
comment's own statement that this test moves 13-17% run to run, so the report
contradicted itself and the headline won, because the headline is what gets
read. It now says which of the two it is. The verb changed with it: "measured
about 8% faster" is a fact about this run, "is about 8% faster" is a claim about
the branch, and only the first one is true. `NOISE_FLOOR` is the measured share
spread from the table already in the library, rounded up rather than down.

THE PRINTED RATIO COULD CONTRADICT ITS OWN ICON. `toFixed(3)` rounds, and at a
bound the rounding crosses it: 0.4996 printed as `0.500` beside a red icon whose
bound the very same comment prints as "< 0.50". A reader doing the honest thing,
checking the number against the stated range, got the opposite answer from the
icon. The displayed value now widens its precision until it lands in the same
band as the raw one, so the two cannot disagree. Away from a bound nothing
changes and three places stays the normal case.

The headline and the display helper both live in lib/throughput-verdict.mjs,
beside the bounds and the measurement table they depend on, so a bound cannot
move without its caveat - and so both can be asserted without a run.

COVERAGE. The runtime self-test reached exactly one of the reporter's
`writeReport` paths. It now reaches two: `no-subject` is driven end to end by
giving the reporter a control time and no subject time, which clears the earlier
guards and stops before the networked reference lookup, so the case stays
hermetic and needs no credentials. Its exit code AND its report are both
asserted, because either alone would have passed against some version of the bug
the guard exists for, and its fixture is registered with the restore list so an
interrupted run cannot leave a stray failsafe report behind.

Still not covered, and stated rather than glossed: the main verdict path. It
needs `gh run list` and downloaded artifacts, so reaching it offline means
putting a seam into production code - a design call left open rather than made
here.
…the solved one

Seen on this branch's Integration Tests. The branch carries one workflow and two
Node scripts and no Java at all, so nothing in it is reachable from the code
under test: this is master state, not the branch's. Recorded rather than
diagnosed, per the ledger's own rule - the evidence expires with the logs, and a
sighting has to be written down before the branch that saw it merges.

IT WEARS A SOLVED BUG'S SIGNATURE FROM THE WRONG SIDE, which is the part worth
writing down. The assertion is the one solved on 2026-08-05 as a nudge race -
`checkHowManyRecordsWithKeyPresent` expected 2, got 1 - and that diagnosis was
the reader stopping early and missing the compaction records past its window.
Here the scan is holding the compactor and it is the ORIGINAL that is absent,
which a short window cannot produce. Left as a hypothesis, not a diagnosis: one
sighting is not a rate, and it has not been reproduced.

Kept as its own row and section rather than folded into the `[2] earliest` entry
that carries the same assertion text on a different parameter, because whether
the two share a cause is precisely what is open.
@astubbs

astubbs commented Sep 1, 2026

Copy link
Copy Markdown
Owner Author

All six check out against the code as it stands on this branch.

All six are now fixed, in 848766b41, c198ec838. Taking them in the order they were weighed:

1. Create-then-retire has no compensation — fixed by reversing the order. The retire happens first, so a failure between the two writes leaves zero live markers and the next run posts a fresh comment, instead of two live markers with the stale one winning forever. Verified rather than reasoned about: the step's script was run against a stubbed API with createComment throwing, and the world it leaves behind has no live marker. The forward link to the new comment is now a third, best-effort write, wrapped so its failure costs a link and not correctness.

2. Missing continue-on-error — added, with the sibling step's reasoning restated for this one: it is a reporting step making API writes inside a REQUIRED job, so a rate limit or a 500 must not fail the check.

3. Delta omits share — added, and the parts reordered to match the report's own table: status, ratio, share, then rate last because it is the one number the report itself labels "this machine only".

4. Headline asserts a flat percentage against an undisclosed noise floor — the headline now discloses the floor in the same sentence as the number, and the verb changed with it. "measured about 8% faster" is a fact about this run; "is about 8% faster" was a claim about the branch, and only the first is true. NOISE_FLOOR is the measured share spread already tabulated in bin/lib/throughput-verdict.mjs, rounded up rather than down.

5. Rounded ratio can contradict its icon — the printed value now widens its precision until it lands in the same verdict band as the raw ratio, so 0.4996 prints as 0.4996 beside its red icon rather than as 0.500. Away from a bound nothing changes. Both boundaries are pinned in the self-test, in both directions.

6. no-subject sentinel unhandled — taken despite being pre-existing, because it turned out to be a ten-line guard mirroring the two beside it. Worth restating what it was doing: an uncaught throw exits 1, which is this script's code for VIOLATION, so a subject test that never ran was reported as a regression while writing no report at all.

On the coverage gap. The runtime self-test now reaches two writeReport paths rather than one — no-subject is driven end to end by giving the reporter a control time and no subject time, which clears the earlier guards and stops before the networked reference lookup, so it stays hermetic. The main verdict path is still unreached: it needs gh run list and downloaded artifacts, and putting a seam into production code to reach it offline is a design call I have left open rather than made. The two new pure helpers (the headline and the ratio display) are unit-tested directly, so findings 4 and 5 are covered even though the path that renders them is not.

Also on this push, and not from the review: the freshness stamp now links the sha — seven characters, matching GitHub's own abbreviation everywhere else on the page — at /pull/N/commits/<sha>, which keeps the PR framing and lands the reader on GitHub's localised relative timestamp. Worth recording that a static comment body cannot do that itself, measured rather than assumed: rendered through the /markdown API in this repo's comment context, GitHub's sanitiser strips <time>, <time-ago> and <local-time> to their text, and the REST API exposes no user timezone. <relative-time datetime=...> does survive it intact and would upgrade to a reader-local rendering — built, then dropped, because the link already answers the question.

Unrelated to this PR: Integration Tests was red on the previous head with PartitionStateCommittedOffsetIT.committedOffsetRemoved[1]. This branch carries no Java, so that is master state; the sighting is recorded in docs/inflight/test-load-tightness-flakes.md in a10d3c3c6, including why it is not the 2026-08-05 nudge race despite wearing its assertion signature — the record that survived here is the compactor, not the original, which a short scan window cannot produce.

None of the five deliberate decisions were touched.

Comment only - no behaviour change. The stamp still links
`/pull/N/commits/<sha>`, and this records the measurement that says it should,
so the next person does not spend the afternoon rediscovering it.

THE WISH. The reader is already on the PR conversation, so the sha should scroll
them to the commit's row there rather than navigate to the commits tab.
`#commits-pushed-<7char>` looks exactly like the anchor for that job.

IT NEVER RESOLVES FOR THE SHA THIS STAMP PRINTS, and the reason is two separate
facts, either of which alone would sink it. Read off the rendered PR page by
parsing its timeline items in DOM order and listing which commits each contains:

  * The anchor keys on the push group's OLDEST commit. This stamp prints
    `head.sha`, the newest. On a group of more than one they are never the same.
  * A single-commit group - the one case where oldest and newest coincide - has
    no anchor at all. It renders as a lone row badged `octicon-git-commit` with
    no `id`, where a multi-commit group renders as `octicon-repo-push` and
    carries one.

So the case that would have worked is precisely the case GitHub does not
anchor. On this branch: two `repo-push` groups of two commits, one of three, and
one commit sitting alone and anchorless between them. Eight commits, three
anchors, and the head sha among them ZERO times.

There is also no per-commit anchor to fall back on. The only fragment targets a
PR conversation emits are `#commits-pushed-<7char>`, `#issuecomment-<id>`,
`#pullrequestreview-<id>`, `#ref-pullrequest-<id>` and the issue itself; the
commit rows inside a push group carry no `id`, so the row the stamp names is not
addressable.

DERIVING THE OLDEST COMMIT INSTEAD was rejected on three counts. The issues
timeline API returns `committed` events with no push grouping, so it is not
recoverable at stamp time; `github.event.before` exists on `synchronize` but not
on `opened`; and grouping is GitHub's rendering choice rather than a record of
pushes - consecutive pushes can be coalesced - so the key is not stable for a
push after the fact. It would also make the link target a different commit from
the sha printed beside it, reintroducing in a worse form the
two-abbreviations-of-one-commit confusion the seven-character change exists to
remove.

WHY NOT SHIP IT ANYWAY on the grounds that an unknown fragment is harmless. It
is harmless, and it is also unconditional: the link would land the reader at the
top of a long PR every single time while claiming to point at a commit. A link
that always leaves the page but always arrives beats one that never leaves and
never arrives.
…g a human's

All three faults are PRE-EXISTING ON MASTER and none is introduced by this PR.
They are fixed here rather than on their own branch because it is the same
defect class, in the same file, as the throughput step's lookup a few hundred
lines above - and a separate branch would buy a second review cycle and a second
CI run to change two lines.

UNPAGINATED `listComments`, WHICH IS LATENT RATHER THAN VISIBLE - and the reason
why is the part worth keeping. The issue-comments API returns 30 per page,
OLDEST FIRST, so a sticky comment born EARLY sits on page one forever and keeps
being found. It only breaks when the comment is born LATE: created once the PR
already has 30+ comments it lands on page two, `find` never sees it again, and
every later push takes the create branch. So it does not miss once and recover -
it duplicates on EVERY push, and each duplicate is itself on page two. Measured
exposure, so as not to overstate it: the busiest PRs in this repo today are 13,
11, 11, 10 and 9 comments, all comfortably above the fold. Nobody has met this,
and on current traffic nobody would.

THE LOOKUP COULD OVERWRITE A HUMAN'S COMMENT, which is the worse of the two and
was not on the list. `includes('SpotBugs Report')` matches ANY comment carrying
that string - including a person quoting the report - and `find` takes the
OLDEST match. So somebody who wrote "the SpotBugs Report shows 318, is that
right?" before the bot first posted would have their comment silently replaced
by the next push. Restricting to a Bot author is what makes the lookup mean "the
comment this workflow wrote" rather than "any comment on the subject". Fixed
here because it is one clause in a line already being edited for the pagination,
and leaving a known comment-destroying bug in code being touched anyway is not a
defensible place to draw a scope line - but it is the one change here nobody
asked for, so it is easy to drop if that call goes the other way.

Both halves verified by running the step's script against a stubbed API: a
human-only mention now CREATEs instead of overwriting; a human followed by the
bot updates the BOT's comment; bot-only updates; empty creates. All four
paginate at 100 per page.

MISSING `continue-on-error`, the same omission the throughput step had. This step
summarises analysis that has already run and already posted its annotations, so
a rate limit or a 500 while commenting would fail the lane for something that is
not the lane's business.

This was the only remaining unpaginated `listComments` in the tree; swept and
confirmed, including `bin/quarantine-lane-report.sh`, whose own sticky-comment
upsert already passes `--paginate`.
@astubbs astubbs changed the title ci(perf): show what changed in the throughput comment, and speak up when the verdict does ci(perf): make the PR's CI comments say what they mean, and survive their own failures Sep 1, 2026
@astubbs

astubbs commented Sep 2, 2026

Copy link
Copy Markdown
Owner Author

@claude review this

Second round. The first was against 7517bd983 and was deliberately narrow; roughly 240 lines have landed since, plus a workstream that did not exist then. Please weigh the new material rather than re-deriving the earlier findings, which are applied.

The three I would most like argued with:

  1. continue-on-error now silently swallows a failed create after the old comment has been retired. That is fail-safe by design - better than a failed required job - but it can leave a PR with no live throughput comment until the next push. Is that the right trade, and is "no comment" distinguishable from "no run" to a reader?
  2. displayRatio's precision ladder: the display widens precision until the printed value lands in the same band as the raw one, so a rounded number cannot contradict its own icon. Worth checking the boundary behaviour independently.
  3. The SpotBugs author guard (c.user?.type === 'Bot') was unrequested scope on a line already being edited for pagination. It fixes a comment-destroying bug - the lookup matched any comment containing "SpotBugs Report", oldest-first, so a human quoting the bot was silently overwritten - but reasonable people could want it separated. Say if you would.

Deliberate, defended in code comments, please do not recommend reversing without engaging the reason: the status is set by variable assignment rather than passed as an argument (passing it corrupted all six messages); the self-test runs the reporter rather than grepping it (the grep version passed on those six corrupted messages); update-in-place with a new comment only on a status change; the verdict is advisory rather than blocking; incomparable readings are shown with a per-row caveat rather than hidden; and the stamp links the commits tab rather than a PR-timeline anchor, because #commits-pushed- keys on the oldest commit of a push group and single-commit groups get no anchor at all, so the head sha resolved 0 of 4 groups when measured.

Known coverage gap: the runtime self-test reaches 2 of the reporter's 7 write paths. The main verdict path needs the network, and adding a test seam to production code was left as a design call.

@claude

claude Bot commented Sep 2, 2026 •

Copy link
Copy Markdown

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


Review — second round, weighing only the new material

  • Diff the five commits since 7517bd983 (848766b41, c198ec838, a10d3c3c6, b2532ca8a, ee173c87d)
  • Argue the three named questions independently against the code
  • Confirm the five deliberate decisions aren't being second-guessed
  • Sanity-check the two non-workflow commits (docs/inflight note, comment-only stamp rationale)
  • Findings posted

1. continue-on-error after retire — the risk is sharper than "no comment"

Traced the actual failure path rather than reasoning about it abstractly (.github/workflows/maven.yml:364-399). On a status change:

  1. existing (the old comment) is rewritten first: body becomes ...Superseded by a newer report further down this conversation. (line 390).
  2. createComment runs (line 392) — uncaught, no try/catch around it.
  3. Only after that succeeds does the forward-link rewrite run, itself wrapped in try/catch (lines 393-399).

If step 2 throws, continue-on-error: true (line 226) swallows it at the job level — so this isn't "no comment," it's a comment that has already promised a follow-up that doesn't exist. A reader landing on it scrolls down looking for "a newer report further down this conversation" and finds nothing.

That state is also permanent, not just until-the-next-push: the lookup at line 252 is c.body.includes(marker) && c.user?.type === 'Bot', and marker () is not a substring of the retired marker ( — they diverge right after report , one continues -->, the other (s...). So the next push's lookup won't find this comment at all; it correctly falls into the create-fresh branch (existing is falsy → the retire block at 388-390 is skipped). The PR does self-heal a live comment on the next push — but the orphaned, now-false "further down this conversation" comment is never touched again by any future run, because it's permanently invisible to the marker search that would let a run revisit it.

So: the trade itself (fail-safe over fail-required) is right — I would not reverse it. But the specific wording written into the retired comment is what turns a transient gap into a permanent, actively misleading artifact. Two cheap options, in order of preference: (a) reword the pre-create retirement text to not promise a specific location — "a fresh report should follow this push" rather than "further down this conversation" — which is honest under both outcomes and costs nothing; or (b) wrap createComment in try/catch and, on failure, rewrite the retirement text to something like "a fresh report could not be posted for this push; the next push will create one." (a) is strictly simpler and fixes the false claim in both the failure case and the sub-second success-case race, so I'd take that over (b).

This is a real, narrow-window, low-severity finding — worth a one-line wording fix, not worth blocking on.

2. displayRatio's precision ladder — checked independently, no bug found

Traced bandOf/displayRatio (bin/lib/throughput-verdict.mjs:100-116) by hand against several boundary values rather than trusting the paired tests:

  • 0.4996 → dp=3 gives "0.500" → bandOf(0.5) = 'flag' ≠ bandOf(0.4996) = 'fail', so it advances to dp=4 → "0.4996" → 'fail' ✓. Matches the added test.
  • 0.6996 → same shape, resolves at dp=4. Matches.
  • Exact boundary 0.5 → dp=3 ("0.500") already agrees with itself, returns immediately. No spurious widening at the boundary itself.
  • Adversarial case I constructed: a ratio a few 1e-10 below 0.5 (still 'fail') can round to "0.500000000" even at dp=9 (still 'flag'), exhausting the whole [3,4,5,6,9] ladder. The fallback return String(ratio) then kicks in — Number.prototype.toString() in JS is the shortest round-tripping representation, not a rounded one, so it reproduces the exact double and trivially satisfies bandOf(displayed) === bandOf(raw). So the function's invariant holds even in a case its own test suite doesn't probe (nothing beyond the pinned 0.4996/0.6996 cases exercises the dp=9-exhausted path). Worth a note, not a fix — the fallback already covers it correctly, I just couldn't find a counterexample.

No boundary-behaviour bug. The one gap is coverage (the exhausted-ladder path is untested), not correctness — consistent with the PR's own stated coverage gaps elsewhere.

3. SpotBugs author guard — I'd keep it bundled

Confirmed c.user?.type === 'Bot' (.github/workflows/maven.yml:903, ee173c8) is a one-clause addition on a line already being rewritten for pagination in the same commit, and it closes a real comment-destroying bug independent of the pagination one: c.body.includes('SpotBugs Report') with no author filter matches a human comment quoting that phrase, oldest-match-first, so that human's comment gets silently overwritten on the next bot run. This is the identical defect class (unpaginated + unauthenticated lookup) the throughput step's own review round just fixed a few hundred lines above, in the same file, this same PR. AGENTS.md's own merge-checklist rule — "before merging a fix, look for other instances of the same defect" — is exactly the check that surfaces this, and it's already been done and tested (commit message states both halves were verified against a stubbed API). Splitting it into its own PR buys a second review/CI cycle for a one-line, already-tested fix on code already open in the diff. I'd leave it bundled; if there's a reason to want it separately git-blamable (e.g. for the changelog generator's granularity), that's a style call, not a risk one — the fix itself is sound and well-scoped.

The five deliberate decisions

Not re-litigated: status-by-assignment, reporter-run self-test, update-in-place-with-new-comment-on-status-change, advisory verdict, incomparable-but-shown readings all read as correctly implemented in the current diff and none of the new commits touch their reasoning.

Other new material

a10d3c3c6 (docs/inflight sighting note) and b2532ca8a (comment-only — explains why the stamp can't link into the PR timeline, no behaviour change) both check out as scoped correctly: the former is a sighting record with an explicit "not the solved one" distinction, the latter is pure commentary with a git diff confirming zero code lines changed.

Known coverage gap (2 of 7 writeReport paths reached by the runtime self-test) is unchanged by this round and I'm not raising it again beyond noting the displayRatio fallback-path gap above, which is new and narrower.

astubbs and others added 2 commits September 2, 2026 12:13
…exist

The status-change path retires the old comment BEFORE creating the new one, and that
order is the safety property: a failure between the two writes leaves ZERO live markers
and the next push posts a fresh comment, rather than two live markers with the stale one
winning forever.

The retirement text, though, named a PLACE - "Superseded by a newer report further down
this conversation" - and that write happens before the create. This step carries
`continue-on-error: true` by design, so a failed `createComment` is swallowed and the
promise is simply never kept. A reader then scrolls down looking for a report that is
not there.

WHAT MAKES IT WORTH FIXING is that the state is permanent, not transient. The retired
marker `<!-- pc-throughput-report (superseded) -->` is not a substring of the live marker
the lookup searches for, so no later run ever finds this comment again to correct it. The
next push does self-heal a LIVE comment - `existing` is falsy, so it takes the
create-fresh branch - but the orphaned false pointer is never touched by anything, ever.

`retiredBody` now takes the whole trailing note rather than a noun slotted into a fixed
"Superseded by X" sentence, because the two writes cannot honestly promise the same
thing. The pre-create note claims only what is already true at that moment: this reading
is superseded, and a fresh report should follow for this push. The post-create note,
written once `created` demonstrably exists, still links straight at it.

THE `continue-on-error` TRADE IS UNCHANGED AND DELIBERATE. This is a REPORTING step
inside the REQUIRED Performance Tests job, so a rate limit, a 500 or a script exception
must not take the required check down for a reason unrelated to the lane or the verdict.
Reversing that to make the create loud would trade a misleading comment for a red
required check, which is the worse failure. The wording was the defect, not the ordering
and not the swallow.

Found by the second `@claude review` round on this PR, which traced the failure path
through the code rather than reasoning about it abstractly.

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

`displayRatio` widens precision until the printed value lands in the same verdict band as
the raw one, so a rounded number can never contradict the icon beside it. Every case the
suite already pins - 0.4996, 0.6996, 0.98042, exactly 0.50 - resolves on the
[3, 4, 5, 6, 9] ladder. None of them reaches the fallback underneath it.

THE FALLBACK IS REACHABLE, AND IT IS LOAD-BEARING. A ratio a hair under a bound, here
0.5 - 1e-12, rounds to "0.500000000" at EVERY rung: each one reads `flag` against a raw
`fail`, the loop finds no agreeing rung and returns nothing. `String(ratio)` then carries
the invariant on its own, and does so correctly, because it yields the shortest
representation that round-trips the double exactly - so the printed text always parses
back into its own band, at any distance from the bound.

VERIFIED IN BOTH DIRECTIONS RATHER THAN ASSERTED. Replacing the fallback with a final
`ratio.toFixed(9)` - the plausible tidy-up, since the ladder already ends at 9 - fails
exactly the two new assertions and nothing else: "expected 0.499999999999, got
0.500000000" and "expected fail, got flag". Restoring it returns the suite to green.
Without that control arm a new test here would be indistinguishable from one that cannot
fail, which is precisely the trap this PR already fell into once, when a grep-based
self-test passed on all six corrupted messages.

The test also pins the intermediate fact - that all five rungs disagree with the raw band
- so a future reader can see WHY the fallback is entered, not just that it is.

`displayRatio`'s logic is unchanged. The second `@claude review` round traced these
boundaries by hand, found no correctness bug, and identified the untested
ladder-exhausted path as the one remaining gap; this closes it.

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

astubbs commented Sep 2, 2026

Copy link
Copy Markdown
Owner Author

Round 2 handled. One finding fixed, one gap closed, one recommendation accepted as-is. Replying here rather than in-thread because this round opened no inline review threads - the findings live in a top-level comment body, so there is nothing to reply into or resolve.


1. continue-on-error after retire - fixed in 2da11c8fb

the specific wording written into the retired comment is what turns a transient gap into a permanent, actively misleading artifact

Agreed, and the permanence argument is the part that made it worth fixing rather than noting. Traced it back through the code: the retired marker <!-- pc-throughput-report (superseded) --> is not a substring of the live marker the lookup searches for, so no later run ever finds that comment again to correct it. The next push does self-heal a live comment - existing comes back falsy and it takes the create-fresh branch - but the orphaned false pointer is untouched by anything, forever. That is exactly as described.

Took option (a), as recommended. retiredBody now takes the whole trailing note instead of a noun slotted into a fixed Superseded by X sentence, because the two writes cannot honestly promise the same thing:

  • pre-create (may never be followed by anything): Superseded - a fresh report should follow for this push. States only what is already true at that moment, and names no place.
  • post-create (written once created demonstrably exists): Superseded by [a newer report](url). Unchanged in effect - it still links straight at it.

The reasoning is in the code comment above retiredBody, where the next editor meets it.

The continue-on-error trade itself is unchanged, per your "I would not reverse it" - and for the reason already in the step header: this is a reporting step inside the required Performance Tests job, so a rate limit or a 500 must not take the required check down for something unrelated to the lane or the verdict.

2. displayRatio boundary behaviour - no logic change; the gap you found is now covered, in 09f0df652

the fallback already covers it correctly, I just couldn't find a counterexample

Confirmed independently, and displayRatio is untouched. Reproduced your adversarial case concretely: at 0.5 - 1e-12 every rung of [3, 4, 5, 6, 9] prints 0.500... and reads flag against a raw fail, so the loop returns nothing and String(ratio) carries the invariant alone - correctly, because it is the shortest round-tripping representation and therefore always parses back into its own band.

That is the one path in the function no other test reaches, so it is now pinned - including the intermediate fact that all five rungs disagree, so a reader can see why the fallback is entered rather than only that it is.

Verified in both directions, not asserted. Replacing the fallback with a final ratio.toFixed(9) - the plausible tidy-up, since the ladder already ends at 9 - fails exactly the two new assertions and nothing else (expected 0.499999999999, got 0.500000000, expected fail, got flag); restoring it returns the suite to green. Without that control arm the test would be indistinguishable from one that cannot fail, which is the trap this PR already fell into once when a grep-based self-test passed on all six corrupted messages.

3. SpotBugs author guard - keeping it bundled

I'd leave it bundled; if there's a reason to want it separately git-blamable ... that's a style call, not a risk one

Taking that. No change. Recording the reasoning so the question is not reopened later: it is a one-clause addition on a line already being rewritten for pagination in the same commit, it fixes a real comment-destroying bug in the same defect class as the throughput lookup a few hundred lines above, and splitting it would buy a second review and CI cycle for a one-line already-tested fix.


The six deliberate decisions

None challenged - recorded here so the next reader does not have to re-derive it. You read status-by-assignment, the reporter-running self-test, update-in-place-with-a-new-comment-on-status-change, the advisory verdict and the shown-with-a-caveat incomparable readings as correctly implemented, and cleared the commits-tab stamp link (b2532ca8a) as scoped commentary. The two changes above touch none of them.

Still open, unchanged

The coverage gap stands as stated in the PR body: the runtime self-test reaches 2 of the reporter's 7 write paths, the main verdict path needs the network, and putting a test seam into production code is a design call, not something to decide inside a review round.

astubbs and others added 3 commits September 2, 2026 12:18
The Chaos Pain Suite went red on this branch's CI with the confluentinc#857 revoke-path
discriminator: `ChaosRevokeUnderWorkDrainIT.revokeUnderDrainingStopsStaysProtocolHonest`
killed by the `unclassified failure cause` SLO, with the poll thread found BLOCKED on an
`AtomicBoolean` monitor held by its own control thread, inside
`onPartitionsRevoked` -> `commitOffsetsThatAreReady`. Same arm, same SLO, same monitor
and holder pair as the fifth capture.

RECORDED FOR THE SEED, NOT FOR THE SIGNATURE. The signature is already documented five
times over and the entry says so outright: a seventh capture is worth less than one
replay of any of the six, and the file's standing ask is a replay with #29's
`tryLock()` applied, which nobody has run. This exists because the seed
(`1075685698131288762`) dies with the log, and the ledger's own rule is that a sighting
is written down before the branch that saw it merges.

TWO THINGS IT DOES ADD. The line numbers moved again - `:1780` / `:580` against the fifth
capture's `:1589` / `:552` and the first four's `:1585` / `:548` - so that capture's
advice to match by method and monitor rather than by line is now load-bearing rather than
precautionary; a filer going by line number would have missed this one. And it is the
cheapest not-PR-introduced control arm in the file: this branch's diff is one workflow
file, three Node scripts and one markdown note, with no Java at all, so there is no
compiled change the chaos suite could reach. Every earlier capture had to argue the
branch was not the cause by resolving frames or naming subsystems; here the category of
change excludes it.

Also noted as a small addition to the rate question, and explicitly not as a rate: the
same lane passed on four earlier heads of this branch and failed on the fifth, within
about three hours, none of them carrying Java.

Not this PR's defect, and not fixed here.

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

The reporter has EIGHT `writeReport` exits, and the split that matters is not
covered-versus-uncovered but local-versus-networked. Exactly three are decided from local
files before any network call - `no-rate`, `no-control`, `no-subject` - and the other five
(`bootstrapping`, `check-failed`, `no-reference`, `incomparable`, and the verdict itself)
sit behind `gh run list` and an artifact download.

The self-test already drove two of the three local ones. This adds the third, which costs
nothing: a summary file that exists and is non-blank but carries no usable
`recordsPerSecond`. That is deliberately not the same as a missing or blank summary, which
exits NOTHING_IN_SCOPE several lines earlier under a different contract - conflating the
two would assert the wrong exit code and pass for the wrong reason.

WHAT THIS CHANGES ABOUT THE OPEN QUESTION. The coverage gap was recorded as needing a
design call about putting a test seam into production code. That is still true, but it is
now scoped to five specific networked paths rather than to "the rest of them", and no
free coverage is being left on the table while that call is pending.

Verified in both directions rather than asserted, in the way this file's own history
demands: deleting the `reportStatus = 'no-rate'` assignment - the exact bug class that
motivated running the reporter instead of grepping it - fails the new assertion with
`expected no-rate, got unset`, and nothing else moves. Restoring it returns the suite to
green with the reporter byte-identical.

Also wraps the one assertion line added by the previous commit that ran to 149 characters,
against `.editorconfig`'s 120. Naming the intermediate reads better than the one-liner did,
and the file's longest line is back to what it was before this branch.

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

The entry was written while the failing head was the newest one, so it could only say the
lane had failed. The next head that completed passed the same lane, which is the half that
makes "intermittent" mean anything: the failure did not reproduce on a re-run of nearly the
same tree, neither of which carried any Java.

Also sharpens the disclaimer rather than just updating the tally. The previous wording
called it "one branch's run of five", which invites the reader to treat it as a
denominator. It is a handful of runs gathered while doing something else, not an experiment
anybody designed, and the file's standing ask is unchanged and unaffected: replay one of
the six seeds with #29's `tryLock()` applied.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UH2q829FDKQcqQseE8Cp7q
@astubbs astubbs changed the title ci(perf): make the PR's CI comments say what they mean, and survive their own failures ci: make the PR's CI comments say what they mean, and survive their own failures Sep 2, 2026
@astubbs
astubbs merged commit 1001c69 into master Sep 2, 2026
33 checks passed
@astubbs
astubbs deleted the ci/perf-comment-status-changes branch September 2, 2026 01:18
astubbs added a commit that referenced this pull request Sep 2, 2026
Four commits, none touching this branch's files. Read before merging, per AGENTS.md:

  1001c69  ci: PR CI comments say what they mean, and survive their own failures (#407)
  000de5d  ci(lincheck): run the lane that has never run, and flip the arm it found dark (#404)
  b36ad94  fix(core): stop transactional batches failing and reprocessing records that succeeded (#257)
  625a8c1  docs(solutions) #183: a defect matches a report on direction and on the reporter's build

The package-rename rule is still live on master, and does not bite here: this branch
touches no Java and no package paths, and the sweep grep finds io.confluent only in the
rename, copyright and mutation scripts that carry the pattern as data.

Worth recording rather than passing over: #404 lands the 2026-09-01 sightings into
docs/inflight/test-load-tightness-flakes.md, so the committedOffsetRemoved flake this
PR's CI hit is now tracked on master rather than only on sixteen unmerged branches.
That was the worked example in docs/inflight-tool.md - the example stands as the record
of what the tool found on the day, and the ledger has since caught up.

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

Master gained one commit since this branch last merged it - #407, the CI
comment work - and the only files touched on both sides are the two sighting registers.

BOTH SIDES' SIGHTINGS SURVIVED, WHICH IS THE ONLY THING THAT MATTERED HERE

These are append-style registers, so a resolution that picked a side would have silently dropped
somebody's evidence. Checked rather than assumed after the merge: #407's
sixth 857 capture and its seed are present, its committedOffsetRemoved sighting is present, and this
branch's own fifth open item and its withdrawal of the "never a product defect" claim are both still
there.

ONE INHERITED LINE NEEDED AN ATTESTATION

#407's capture entry proposes replaying a seed with this branch's tryLock()
applied - a sentence that reads correctly after the merge, but which the self-reference gate cannot
know is safe. Marked, and the reference fully qualified while there.

The marker had to move: it sat above the paragraph's first line, and the gate's single-line form
covers only the line immediately after it, which was not the one carrying the reference. The
paragraph is rewrapped so the reference sits directly under its marker.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UH2q829FDKQcqQseE8Cp7q
astubbs added a commit that referenced this pull request Sep 2, 2026
Two commits: #29's confluentinc#857 revoke-path deadlock fix, and
#407's CI comment repairs. No Java overlap again - #29 works on
the commit lock and the revoke path, this branch on offset decoding - but one
inherited argument lands squarely on a note this PR ships, and that is the part
worth reading.

#29 GIVES A MECHANISM TO A NOTE THAT ONLY HAD A SYMPTOM

docs/inflight/core-fail-policy-escapes-the-rebalance-callback.md recorded that
FAIL stops the consumer by throwing out of onPartitionsAssigned, and framed the
problem as SURFACING: an opaque "User rebalance callback throws an error"
instead of PC's own fatal path.

#29 puts a never-throws contract on the revoke side of exactly that
hazard - PartitionStateManager#deregisterPartitionCounters, grep it for
`never-throws contract`. Its reasoning is that the callback runs on the
broker-poll thread inside poll(), so an escape kills that thread, which is the
only producer of commit responses, so every later commit blocks until it times
out. It names that as the confluentinc#857 family's worst failure shape.

onPartitionsAssigned is the same thread and the same wrapper. So the open
question is no longer "is the message clear?" but "is a FAIL stop a stop at all,
or a hang wearing one?" - and this branch's own test does not answer it:
failPolicyStopsRatherThanDiscardingForeignMetadata calls
wm.onPartitionsAssigned directly and asserts the throw, never reaching a real
poll loop. The note now says so and names the experiment that would settle it.
Not settled here: FAIL is opt-in since the default moved to IGNORE, and a clean
fatal exit reaches beyond the offsets package into the engine's error handling.

THE CONFLICT, AND A CLAIM OF MINE IT KILLED

One conflict: both sides added a committedOffsetRemoved[1] latest sighting on
the same day, #407's and this branch's. Merged into one row with both
jobs cited, because they are the same test and the same parameter.

#407's captured WHICH record survived - the compactor, not the original -
and the 2026-08-05 nudge-race mechanism cannot leave that behind. This branch's
note had called its own sighting a RECURRENCE of that solved mechanism, on the
strength of a matching signature: same test, same parameter, same expected 2 got
1, same clean probe. That reading is withdrawn, and the withdrawal is written
where the row is read rather than quietly dropped, because matching a signature
is not classifying a failure and this is the worked example.

The #207 sighting is now unclassifiable: which record survived was never
captured, and its log has since expired - GitHub returned zero bytes for it. The
ledger's own rule about evidence expiring with the logs, paid in full. What
survives is the branch clearance on mechanism, which never depended on the
signature: this test removes the committed offset entirely, so there is no
metadata for an offset-decoding change to reach.
astubbs added a commit that referenced this pull request Sep 2, 2026
…ticky-comment machinery (#409)

WHAT WAS WRONG

A quarantined test that starts PASSING is the most consequential thing the lane
report can say: it means the fix landed, and its `@Quarantined` annotation plus
its `docs/quarantined-tests.md` entry must both be deleted. That transition was
announced by silently editing a comment far up the page - no notification, no
visible change to anyone reading the PR top to bottom. The most important message
was the one least likely to be seen.

THE FIX

The report now embeds a machine-readable payload, reads its own previous comment
back to render a DELTA naming which test moved, and posts a FRESH comment when
any row's outcome changes - retiring the old one first and linking it forward.
Every comment is stamped with the head sha, a commit link, the run and the time,
so an in-place update is visibly fresh rather than looking dead.

It has since fired in production on a real transition, retiring two comments and
chaining the forward links correctly.

SHARED, NOT COPIED

The five mechanics behind that are domain-free, and all five already existed for
the throughput comment. They now live in one module with two thin consumers,
replacing ~198 lines of inline `github-script` JS in a workflow and a ~25-line
`gh api` upsert in shell. That shell copy carried two of the three defects
#407 had already fixed for throughput - including a
`gh api` failure under `set -e` that could red a job whose lane had run fine.

Measured like-for-like the modules are more CODE than they replace, and the
reason is that it was never a like-for-like extraction: two unlike
implementations became one core plus two vocabularies, and the quarantine side
GAINED the delta, the retirement and the stamping it never had.

CODECOV AS A QUERYABLE TEST HISTORY

`bin/inflight.mjs codecov` exposes per-test outcome and wall-clock per commit -
`codecov test <name>` for "which commit did this start failing at", `codecov
flaky` for the sighting evidence a quarantine entry needs, `codecov slow` for
what owns the CI wall-clock. Unauthenticated, because the repo is public, so it
works from a fresh sandbox with no setup step to forget.

It answered its first real question during this branch's own CI: an integration
test went red, and `prior-art` plus `codecov test` established a known tracked
flake with a rate - one failure in seven runs, on a commit that deletes a file -
without re-running a single build. That sighting is recorded, and it is the
first entry in that ledger carrying a rate rather than a single job log.

WHAT REVIEW FOUND, AND WHY IT MATTERS MORE THAN THE FEATURE

Seven local reviewer lenses, an independent cross-model pass on Codex, and a
Claude review. The local lenses share this model and found nothing of the class
Codex found: seven ways the new flake tool could exit 0 with an apparently
complete "no flakes" - in the exact situation a reader uses it to justify
REMOVING a quarantine. A truncated walk printing a clean negative; an empty
corpus reported as an absence of flakes rather than a failure to read it; a
skipped test rendered as a failure; branch identity omitted so a PR-only failure
read as master-state, which is the distinction the quarantine rule turns on.

All fixed, each with a test that was red-proofed by reverting its guard.

Two of this branch's own defects were the same shape and are worth naming: a
flag's VALUE was read as the search term, and the fix for that dropped the query
whenever the flag was absent. Both silent, both plausible, both caught by review
rather than by use.

KNOWN AND DELIBERATELY NOT FIXED HERE

The two `codecov/project/*` gates fail on branches that change no Java. Proven
from the upload logs: the CLI does not expand `**`, so `files:` matches nothing
and a tree-wide fallback uploads everything - on master that gives BOTH flags the
whole tree, while a PR's suite job has only its own half. The delta measures that.
It is the same inert-`files:` defect this change fixes for the test-results
upload; four instances remain. Not fixed here because it alters what a required
merge gate measures, and that should be the only thing in its diff.

Also filed rather than fixed: emptying the lane leaves its last report live
saying ACTION REQUIRED, because every step after the empty check is gated on the
lane being non-empty.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Sep 2, 2026
Two commits - #400's in-flight tooling front door and #409's
quarantine status-change report. One Java file between them, a script test, so
nothing here reaches this branch's code.

THE CONFLICT: THREE SIGHTINGS, NOT TWO, AND BOTH SIDES HAD IT WRONG

test-load-tightness-flakes.md again, and again because both sides appended a
committedOffsetRemoved[1] latest sighting to the same row. This branch's row
said two sightings and named #407 and #207; master's said two and
named #407 and #409. Neither is right on its own: there are three,
and dropping either side's would lose the evidence the ledger exists to keep.

Resolved to one row citing all three with what each contributed, which is the
part that matters: #407 captured WHICH record survived - the compactor,
not the original - and that rules out the 2026-08-05 nudge-race mechanism;
#409 attached a RATE; #207 captured neither. Both prose sections
are kept because they say different things - one withdraws a claim, the other
adds the rate - and neither restates the other.

A RECOVERY ATTEMPTED, AND RECORDED AS FAILED

#400 landed `node bin/inflight.mjs codecov test <name>`, which reads
per-commit outcomes from history that outlives a CI log - exactly the gap this
branch recorded when the #207 sighting's log returned zero bytes. Ran
against this test it covers only the branch #409 ran on, so that sighting
stays unclassifiable. Written into the note as an attempt that does not reach it,
so the next reader does not run the same query hoping for a different answer.

INHERITED, AND IT INDICTS HOW THIS SESSION SEARCHED

#400 adds a rule worth acting on rather than filing: grep and find read
the WORKING TREE, and roughly two thirds of this repo's docs exist only on
branches that have not merged - so a working-tree search returns a false negative
carrying the authority of a completed check, and `bin/inflight.mjs prior-art` is
what searches every ref. The prior-art checks in this session used `grep -rln`
over docs/, which is precisely the shape that rule names.

Unit lane green across all modules; bin/check-all.sh 15/15.
astubbs added a commit that referenced this pull request Sep 2, 2026
Four commits, no Java touching this branch's paths. Three conflicts, all the same
shape as before - two writers appending sightings to the same ledgers - and this
time both writers were recording the SAME two flakes, so neither side's count was
right and taking either whole would have lost real observations.

MdcContextPropagationTest: master had three sightings (one local on #262,
two on #416's CI across consecutive heads); this branch had a fourth, its
own local suite, and a fifth that matters more than the rest - MASTER'S OWN
`full build` at ebd8bcb. Unioned to five, with the master one called out,
because it is the one that stops being a test problem: `build` is master's only
coverage uploader, so its failure is why #414's merged glob fix has not
taken effect and why every open PR still sees red per-flag gates.

committedOffsetRemoved[1] latest: master had #407, #409 and
#416; this branch had #407, #207 and #409. Union is
four, and the row now says which of them captured what - #407 the
surviving record, #409 a rate, the other two neither.

Master also re-added a processInKeyOrder row at two sightings where this branch
already carries the six-sighting version from an earlier merge; its copy is
dropped rather than landing a duplicate row under one test name.

bin/check-all.sh 15/15, core compiles.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01228AtRiHyTzeH7SjcXzgNj
astubbs added a commit that referenced this pull request Sep 3, 2026
…before re-running it

The sharded lane's first pull_request run went red on two tests this branch
does not touch, and both already have ledgers. Recording them before the
re-run, per the rule that a seed dies with its log.

ChaosChurnStormIT, INSTANCE_STALL/NO_WORK_COMPLETED, seed 4788502970202706178,
on shard 4/4 - one fork on its own VM, the gate's configuration exactly. That
is the fifth gating firing of this detector on this class since 2026-08-25
and the fourth in two days, on three seeds; the ledger now says the rate,
not any seed, is the property worth measuring.

PartitionStateCommittedOffsetIT.committedOffsetRemoved[1] latest, expected 2
got 1 at forkCount=4, the fifth sighting; the survivor's value length says
it was the compactor again, the shape #407 captured, so it is the
unsolved mechanism rather than the solved 2026-08-05 one.

Co-Authored-By: Claude Fable 5.1 <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