Skip to content

test(chaos) confluentinc#857: the chaos suite asserts ordering, detects a stalled instance, and can be watched mid-stall - #325

Merged
astubbs merged 3 commits into
masterfrom
test/chaos-instrumentation
Aug 20, 2026
Merged

astubbs merged 3 commits into
masterfrom
test/chaos-instrumentation

Conversation

@astubbs

@astubbs astubbs commented Aug 19, 2026 •

Copy link
Copy Markdown
Owner

depends on #324

Third in the agreed merge order (323, 324, 325, 57, 322, 267, 29); #323
merged on 2026-08-20 as a80f2bbd1. The dependency is real rather than bookkeeping: #324
lands the inflight-tag and citation gates that the notes this PR adds are judged by. The line was
missing, so Check PR Dependencies was passing and nothing mechanically held the order.

Description

Chaos-suite instrumentation, extracted from #29 so it can be reviewed on
its own terms. "Are these checks non-vacuous and correctly windowed?" is a different question from
"is this locking correct?", and one reviewer switching between the two mid-diff is where things get
waved through.

No main-code change. It compiles and runs against master untouched, which is also the evidence
that the chaos work never depended on #29's product fixes.

1. The CHAOS suite asserts ordering under churn, for the first time

To be clear about scope: ordering is asserted throughout the existing test suite - the integration
tests cover it extensively, and it is the guarantee this library exists for. What had never been
checked under churn was ordering in the chaos suite specifically, whose correctness ledger
verified that no record is lost and that duplicates stay bounded, but not their order. That gap
mattered because chaos is the only lane that reorders the world underneath the consumer - repeated
rebalances, revocations and restarts mid-flight - so it is the one place a re-ordering bug could hide
from every other test.

KeyOrderLedger asserts it within one PC incarnation, one partition, one assignment
epoch and one key. Each component excludes a class of legitimate re-processing, and the
window is the whole difficulty: a naive "offsets per key must increase" fires on correct
behaviour, because at-least-once redelivery after a revoke is the contract working. The epoch is
read off the record's own WorkContainer through public API, so a heavy record still in flight when
its partition is revoked keeps the old epoch and cannot be mistaken for the new window's work.

Two violation kinds, and the second is not decoration - the UNORDERED control arm produced 857
overlaps against one order regression
, so an offset-order-only detector would have called that arm
green 857 times.

Vacuity is reported, not hoped for: check returns LEDGER_ORDER_VACUOUS when no window held
two deliveries, and logs comparedDeliveries - 244,022 of 250,608 on the live run, so ~97% of
deliveries were genuinely compared against a predecessor.

2. INSTANCE_STALL/NO_WORK_COMPLETED - the liveness check at a granularity that can see a wedge

The existing NO_PROGRESS probe has the right shape - while work remains, completions must advance

  • but is fleet-wide, so one wedged instance hides behind healthy siblings.

This adds the same idea per instance, read from PC's own state (pc.getWm()) rather than inferred
from committed offsets read externally. Completions are counted through a listener that fires on
PC's control thread - the thread an AB-BA cycle freezes - so a wedged control loop stops the
counter even while workers finish and heartbeats flow. It re-arms on any result, idle, restart or
leaving the live set, so it cannot fire on slow-but-progressing.

Granularity is per-instance rather than per-shard, and the javadoc says so: processingShards is
@Getter(PRIVATE) and adding a main-code accessor for a probe was not worth it.

3. A diagnostic mode, because the gating run destroys its own evidence

-Dchaos.diagnoseStallRecovery=true keeps the quiet phase watching after a violation instead of
aborting at the first one. Without it a wedged partition and a merely slow one are indistinguishable,
because every observation ends at the moment of detection.

It cannot turn a red run green - violations are still asserted afterwards - and it prints the
prior art on startup, since a recovery diagnostic on this family had already been run once and was
repeated because nothing led anyone to that record.

4. CLASS2_STALL now explains itself where it fires

Its message carries the interpretation: a timing bound is not a correctness verdict, the mechanism is
a commit watermark pinned by one incomplete record while the shard behind it progresses, and the next
step is the diagnostic flag rather than "investigate". Three of four measurement arms failed this
check while progressing normally, and the natural reading of it is wrong.

The bound's value and its gating are unchanged here - the open question is recorded in
docs/inflight/test-class2-probe-asserts-timing-not-correctness.md.

5. Four scenario cells

Drain, cooperative-drain and KEY-ordered arms complete an assignor x stop-mode matrix. Existing cells
are untouched; the shared driver gained hooks with byte-identical defaults.

Notes for the reviewer

Verification

  • Compiles against master with no main-code change
  • Broker-free gating tests: 36/36, all deterministic, 2.4s combined - KeyOrderLedgerIT 19, InstanceStallProbeIT 7, ProgressProbeLedgerIT 5, ManagedPCInstanceLifecycleIT 5.
    (Previously stated as 33/33 while counting ManagedPCInstanceLifecycleTest, which was broker-BACKED - so the claim was wrong twice. Round 3 caught the miscount; that test has since been deleted after a mutation matrix showed it killed none of the four ManagedPCInstance guards, while the deterministic IT killed both real ones.)
  • INSTANCE_STALL verified silent on the eager arm (seed 4734674029169027864), which trips the
    older CLASS2_STALL bound 53 times on that same seed while draining completely - the case it must
    not fire on
  • Ordering ledger verified in both directions: catches synthetic violations, and correctly ignores
    redelivery after revoke, restart of the same instance, a straggler crossing an epoch boundary, and
    the same key on two partitions

Checklist

  • Docs updated - the probes' contract, the Class 2 bound's open calibration question, the chaos
    harness's inability to model a crash, and a feature record for seeded replay
  • User-facing feature documentation data added under docs/features/ - seeded-chaos-replay.yaml
  • Tests added/updated - this PR is tests; KeyOrderLedgerIT and InstanceStallProbeIT prove the
    new checks fire and stay silent in both directions
  • Title & body reflect the final content of this PR

@github-actions

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 Aug 19, 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 31 28 🫤 +3
Duplicated lines 979 843 :face_with_raised_eyebrow: +136
Duplication 0.13% 0.11% 🫤 +0.02%
Rule Limit Status
Max duplication 0.5% ✅ Pass (0.13%)
Max increase vs base +0.1% ✅ Pass (+0.02%)
⚠️ 3 new clones introduced
  • 41 lines (115 tokens): parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java:125 <-> parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkKeyOrderIT.java:134
  • 16 lines (108 tokens): parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java:89 <-> parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java:176
  • 11 lines (76 tokens): parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java:113 <-> parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java:205

✅ jscpd (language-agnostic)

PR Base Change
Clones 77 74 🫤 +3
Duplicated lines 1098 1035 :face_with_raised_eyebrow: +63
Duplication 1.18% 1.14% 🫤 +0.04%
Rule Limit Status
Max duplication 2% ✅ Pass (1.18%)
Max increase vs base +0.1% ✅ Pass (+0.04%)
⚠️ 4 new clones introduced
  • 42 lines: parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkCooperativeDrainIT.java:1 <-> parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkDrainIT.java:1
  • 10 lines: parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java:8 <-> parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java:9
  • 13 lines: parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java:92 <-> parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java:179
  • 11 lines: parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java:113 <-> parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java:205

Powered by astubbs/duplicate-code-cross-check

@github-actions

github-actions Bot commented Aug 19, 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:

🆕 New file similarities introduced

File A File B Similarity (%)
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/ChaosRevokeUnderWorkKeyOrderIT.java 56.6
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/ChaosKeyOrderIT.java 47.1
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/ChaosRevokeUnderWorkKeyOrderIT.java 41.0
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/ChaosRevokeUnderWorkDrainIT.java 40.2
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/ChaosKeyOrderIT.java 39.4
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/ChaosScenarioBase.java 37.0
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/KeyOrderLedger.java 34.6
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/KeyOrderLedgerIT.java 33.6
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/ChaosRevokeUnderWorkIT.java 32.6
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/ManagedPCInstanceLifecycleIT.java parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/utils/ManagedPCInstance.java 32.3
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/ProgressProbe.java 31.8
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 30.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 30.1

🔺 Increased similarities

File A File B Base (%) PR (%) Change
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/ChaosRevokeUnderWorkIT.java 34.5 36.6 +2.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContext.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/RecordContextInternal.java 40.3 41.1 +0.8
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalRuntimeException.java 39.5 39.9 +0.5
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/JavaUtils.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/CollectionUtils.java 38.8 39.2 +0.4
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 56.7 57.1 +0.4
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalRuntimeException.java 31.2 31.6 +0.4
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 62.9 63.2 +0.4
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCModule.java 31.9 32.2 +0.4
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCModule.java 31.5 31.9 +0.4
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PCRetriableException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 31.8 32.1 +0.3
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalRuntimeException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 30.6 31.0 +0.3
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 34.4 34.7 +0.3
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/Java8StreamUtils.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/JavaUtils.java 34.3 34.6 +0.3
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 49.5 49.8 +0.3
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 39.4 39.7 +0.3
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 32.9 33.2 +0.3
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 34.3 34.6 +0.3
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/Java8StreamUtils.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/CollectionUtils.java 32.1 32.4 +0.3
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 33.1 33.4 +0.3
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 52.4 52.7 +0.2

...and 46 more

Full similarity report
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 52.67 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 37.89
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PCRetriableException.java 34.89
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 34.32
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 32.93
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 32.86
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 32.17
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 32.03
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 63.23 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 57.11 ⚠️
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 41.78
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 39.67
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 34.61
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 32.79
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCModule.java 32.1
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 30.08
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 63.23 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 53.18 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 39.1
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 34.13
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 33.55
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCModule.java 32.24
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 31.79
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/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 34.89
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 32.15
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 52.67 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 52.43 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 43.08
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 33.36
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 31.91
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalRuntimeException.java 31.57
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerOptions.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ProducerManager.java 32.1
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 57.11 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 53.18 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 47.62
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 35.68
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 33.24
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCModule.java 31.91
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 31.49
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 47.62
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 39.67
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 39.1
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 34.81
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 41.13
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 30.97
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 35.68
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 34.61
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/RecordContextInternal.java 33.66
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 33.55
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContext.java 30.97
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 41.13
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 33.66
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 45.89
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AbstractParallelEoSStreamProcessorConfigurationTest.java 34.34
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/BrokerPollSystem.java 33.47
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ProducerManager.java 30.5
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java 30.26
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/BrokerPollSystem.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 33.47
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/test/java/bz/stub/parallelconsumer/internal/ConsumerManagerCommitRetryBudgetTest.java 31.63
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 33.57
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-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 39.89
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 58.47 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 52.43 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 49.76
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 47.79
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalRuntimeException.java 39.94
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 37.89
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 34.74
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PCRetriableException.java 32.15
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 31.8
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 31.0
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalRuntimeException.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 39.94
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 31.57
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 30.97
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/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 32.24
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 32.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 31.91
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PCModuleTestEnv.java 31.61
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/ParallelConsumerOptions.java 32.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 30.5
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 34.61
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/CollectionUtils.java 32.42
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 39.25
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/Java8StreamUtils.java 34.61
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 49.77
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 36.03
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 35.13
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 34.74
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 33.36
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 32.93
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 30.95
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 58.47 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 49.77
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 46.84
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 46.49
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 45.32
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 45.12
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 43.08
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 34.32
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalRuntimeException.java 30.97
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 47.79
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 45.12
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 45.0
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 36.25
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 35.34
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 49.76
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 46.84
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 45.0
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 32.17
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 31.91
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 30.95
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 30.05
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 62.04 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 46.49
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 36.25
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 36.03
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 32.86
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 31.8
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 30.05
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 62.04 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 45.32
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 35.34
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 35.13
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 32.03
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 31.0
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/PartitionStateManager.java 33.57
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 30.26
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionStateManager.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 39.67
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java 33.57
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/main/java/bz/stub/parallelconsumer/state/ShardManager.java 35.16
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 35.16
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 39.67
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 35.21
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/ManagedPCInstanceLifecycleIT.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/utils/ManagedPCInstance.java 32.27
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 56.94 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 43.62
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 35.71
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 39.6
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 39.0
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 35.71
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.55
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.55
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.89 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 43.62
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 39.0
parallel-consumer-vertx/src/test-integration/java/bz/stub/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 31.13
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionTimeoutsTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProducerManagerTest.java 30.36
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 56.94 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 53.89 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 39.6
parallel-consumer-vertx/src/test-integration/java/bz/stub/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 35.23
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 41.07
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkKeyOrderIT.java 41.05
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 39.42
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java 36.57
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ProgressProbe.java 31.75
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 47.06
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 41.07
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 33.64
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 56.62 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 47.06
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 39.42
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 37.01
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/KeyOrderLedger.java 34.62
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 40.25
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 45.81
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 40.25
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java 32.6
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 45.81
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 36.57
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkDrainIT.java 32.6
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 56.62 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 41.05
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/ChaosKeyOrderIT.java 37.01
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 33.64
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/ChaosKeyOrderIT.java 34.62
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/KeyOrderLedgerIT.java 33.6
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 33.6
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/AbstractRevokeUnderWorkScenario.java 31.75
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/utils/ManagedPCInstance.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/ManagedPCInstanceLifecycleIT.java 32.27
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 43.18
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 34.34
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/internal/utils/KafkaTestUtils.java 32.36
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.48
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 49.1
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineRegistryScriptTest.java 47.17
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 33.47
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 41.54
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ConsumerOffsetCommitter.java 33.57
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CommitRejectionTestBase.java 33.47
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 51.6 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java 50.01 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java 44.27
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/BatchTestBase.java 30.48
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.03
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.03
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 41.54
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 33.73
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/ParallelEoSSStreamProcessorRebalancedTest.java 33.73
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 49.1
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineRegistryScriptTest.java 32.42
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 47.17
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineLaneReportScriptTest.java 32.42
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 88.87 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 88.08 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 88.08 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 84.71 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 84.71 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ConsumerManagerCommitRetryBudgetTest.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ConsumerManager.java 31.63
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PCModuleTestEnv.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCModule.java 31.61
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-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionTimeoutsTest.java 30.36
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 45.89
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AbstractParallelEoSStreamProcessorConfigurationTest.java 43.18
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 33.24
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 30.08
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 33.58
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 33.58
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 39.25
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/Java8StreamUtils.java 32.42
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 32.36
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 35.21
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 38.41
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 38.41
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.69
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.69
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.92
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 40.1
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/integrationTests/CoreAppMetricsIntegrationTest.java 36.28
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/VertxAppTest.java 35.86
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-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 85.34 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 84.71 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 84.58 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 84.58 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 81.34 ⚠️
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.28
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 69.39 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/main/java/bz/stub/parallelconsumer/examples/core/CoreApp.java 36.92
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.74
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/CoreAppTest.java 40.1
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-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 85.34 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 84.71 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 84.58 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 84.58 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 81.34 ⚠️
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 69.39 ⚠️
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.74
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/CoreAppTest.java 35.86
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 51.07 ⚠️
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 78.95 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 50.01 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java 48.11
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 70.83 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyTest.java

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

File Similarity (%)
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorTest.java 31.95
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.8
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-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 88.73 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 88.08 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 87.94 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 84.58 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 84.58 ⚠️
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 51.07 ⚠️
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 78.95 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 51.6 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java 49.63
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 70.83 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorTest.java

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

File Similarity (%)
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyTest.java 31.95
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.8
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-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 88.73 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 88.08 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 87.94 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 84.58 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 84.58 ⚠️
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 41.78
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 41.34
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 40.83
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java 36.8
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 34.13
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 31.49
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 41.18
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 40.83
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 34.81
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 32.79
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 31.79
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 43.48
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 41.34
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ExternalEngine.java 39.89
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/VertxParallelEoSStreamProcessor.java 43.48
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 41.18
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 36.8
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.23
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 31.13
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 88.87 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 88.73 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 88.73 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 85.34 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 85.34 ⚠️
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.63
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java 48.11
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 44.27

@github-actions

Copy link
Copy Markdown

✅ SpotBugs Report

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

@github-actions

github-actions Bot commented Aug 19, 2026 •

Copy link
Copy Markdown

🧪🔒 Quarantine Lane Report

Quarantined test Outcome Owner Meaning
PCMetricsTest.metricsRegisterBinding 🟡🎲 passed (flapper) ⚠️ unowned proves nothing - passes most runs by nature
ProducerManagerTest.producedRecordsCantBeInTransactionWithoutItsOffsetDirect 🟡🎲 passed (flapper) #262 proves nothing - passes most runs by nature
OffsetEncodingBackPressureTest.backPressureShouldPreventTooManyMessagesBeingQueuedForProcessing 🟡🎲 passed (flapper) ⚠️ unowned proves nothing - passes most runs by nature

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

@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 added a commit that referenced this pull request Aug 19, 2026
…aster

#325 branched before status prefixes were removed from inflight filenames and adds two of its
own in the old shape - next-truth-probes-for-internal-state.md and
parked-chaos-crash-fidelity-variant.md. The convention lands in #323, which merges first, so
those names contradict it by the time #325 merges.

Everything else old-named on that branch is inherited and resolves when it takes master; only these
two are its own to fix. Recorded here rather than done: that branch's worktree is held by another
active session, and moving files under a session mid-task is how work gets lost.

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

nearly

@astubbs

astubbs commented Aug 20, 2026

Copy link
Copy Markdown
Owner Author

@claude review this

Chaos test instrumentation lifted from #29. Base master, and it merges third in the agreed order (323, 324, 325, 57, 322, 267, 29) — before #29, deliberately, so this content is reviewed here rather than arriving on master already merged.

Priorities:

  1. The INSTANCE_STALL detector and KeyOrderLedger — can they report a stall that is not one, or miss one that is? A detector that cries wolf gets ignored; one that is silent under a real stall is worse.
  2. The diagnostic recovery mode — does it change timing enough to mask the thing it is meant to observe?
  3. Ordering assertions under churn — are they asserting the ordering guarantee, or merely that nothing crashed?
  4. Two inflight notes still carry status prefixes (next-truth-probes-for-internal-state.md, parked-chaos-crash-fidelity-variant.md). docs(inflight): rank open work by what it costs you, and land the tracker that reads it #323 removes status from note filenames and merges first, so these need renaming to an area prefix when this branch takes master.
  5. Duplication against fix(core) confluentinc#857: the revoke path declines the commit lock instead of blocking on it #29 is intentional and resolves when that branch merges master — please flag anything NOT in that category.

@claude

claude Bot commented Aug 20, 2026 •

Copy link
Copy Markdown

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


Reviewing chaos instrumentation PR

  • Gather context (PR body, diff, prior review comments, tool grants)
  • Read KeyOrderLedger.java and KeyOrderLedgerIT.java — can it cry wolf or miss a real violation?
  • Read InstanceStallProbeIT.java and the ProgressProbe.java diff — INSTANCE_STALL detector correctness
  • Read the diagnostic recovery mode (chaos.diagnoseStallRecovery) — does it perturb timing?
  • Check the ordering assertions actually assert ordering, not just "no crash"
  • Check the two inflight notes for stale status-prefix filenames
  • Check for duplication NOT attributable to fix(core) confluentinc#857: the revoke path declines the commit lock instead of blocking on it #29
  • Compile core module + run KeyOrderLedgerIT/InstanceStallProbeIT locally
  • Post final review

Review

Confirmed HEAD is 2b1875e. test-compile on parallel-consumer-core (with -am) is clean, and KeyOrderLedgerIT (16/16) and InstanceStallProbeIT (7/7) both pass locally — matching the PR's claimed counts.

1. INSTANCE_STALL and KeyOrderLedger — cry wolf / miss a real stall?

Both detectors are sound, and the "safe direction" discipline is followed consistently (docs-cite: parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/KeyOrderLedger.java:60-63, 246-252): a delivery that can't be safely bracketed is skipped rather than judged, so a mis-scoped observation loses a detection instead of inventing one — the correct bias for a gating check.

  • KeyOrderLedger.check's running-max approach (highestOffsetStarted, only updated when the new offset is >= the prior max) catches every offset that regresses against the highest-seen-so-far, which is the right non-decreasing invariant — not merely "adjacent pairs." InstanceStallProbeIT.oneStalledInstanceIsNotHiddenByHealthySiblings and the epoch/incarnation/partition window tests in KeyOrderLedgerIT (revoke redelivery, restart, straggler crossing an epoch, same key on two partitions) are exactly the false-positive traps I'd have gone looking for, and they're covered with constructed histories, not just live-chaos hope.
  • sampleInstanceProgress's re-arm conditions (any result returned, incarnation change, or !holdsWork) mean it structurally cannot fire on slow-but-progressing — confirmed by reading WorkManager.onSuccessResult/handleFutureResult in the (untouched) main code: the listener really does fire from the control-thread future-handling path, so the "counts freeze exactly when the control loop wedges" claim holds up, not just an assertion in a comment.
  • One real gap, explicitly owned rather than hidden: granularity is per-instance, so one wedged shard behind healthy siblings on the same instance stays invisible to this probe (ProgressProbe.java:130-138). That's the shard-vs-instance tradeoff the PR description already flags as deliberate (no main-code accessor for a probe) — not a defect, just worth confirming reviewers know the boundary of what's covered.

2. Diagnostic recovery mode — does it perturb the thing it's watching?

No. chaos.diagnoseStallRecovery (AbstractRevokeUnderWorkScenario.java:83) only changes phase-2 observation behavior — it disables failFast and widens QUIET_CAP → DIAGNOSTIC_QUIET_CAP. It touches nothing about storm duration, tick range, heavy-sleep dwell, or conductor weights, i.e. nothing that produces the timing under test. assertScenarioSlos still asserts probe.getViolations() is empty regardless of the flag, so the PR's "cannot turn a red run green" claim is enforced by code, not just stated in a comment.

3. Ordering assertions — real, or just "didn't crash"?

Real. assertScenarioSlos (ChaosScenarioBase.java:329-333) folds KeyOrderLedger.checkIfRecording(orderRecorder()) into the same ledgerProblems list the loss/duplicate ledger uses, and the vacuity guard (LEDGER_ORDER_VACUOUS) means a scenario that accidentally produces only single-delivery windows fails loudly instead of passing by accident. KeyOrderLedgerIT.aUniqueKeyPerRecordIsReportedAsVacuous/anEmptyHistoryIsVacuous pin that down.

4. Inflight note filenames

Confirmed both docs/inflight/next-truth-probes-for-internal-state.md and docs/inflight/parked-chaos-crash-fidelity-variant.md exist with the old status-prefix convention, as flagged in the trigger comment. Since #323 (which removes status from note filenames) hasn't merged to master yet, docs/inflight/AGENTS.md on this branch still documents the old parked-/next- prefixes as valid — so this isn't a defect in this PR, just the known rename owed when this branch rebases onto a post-#323 master. Nothing to do here now.

5. Duplication not attributable to #29

Found some, worth naming explicitly since the ask was to flag anything outside that story:

None of this looks like a correctness problem — it's the established one-class-per-matrix-cell pattern this suite already used pre-PR (ChaosRevokeUnderWorkIT/ChaosRevokeUnderWorkCooperativeIT), where each cell overrides a handful of hook methods and carries its own calibration javadoc. A shared @ParameterizedTest could shrink the line count, but would also collapse each cell's distinct calibration story into one javadoc block, which this suite's whole design philosophy (one variable changed per file, self-contained reasoning) argues against. I'd call this accepted duplication under the suite's existing convention, not new debt — but it's real and not covered by the #29 explanation, so flagging per the ask rather than silently waving it through.

Nothing else stood out as a defect. ManagedPCInstance's workResultsReturned listener wiring, the epoch-read-off-WorkContainer mechanism, and the startInFlight/stopRequested guards are all pre-existing or straightforward, and the new ManagedPCInstanceLifecycleTest (5 gating tests) is a plausible regression test for the double-submission race, if noticeably more sleep-based than the rest of the suite's await()-style convention — not a blocker, just a style note if it turns out flaky later.

lgtm — nice work, especially on the vacuity guards and the false-positive test coverage in both directions.

astubbs added a commit that referenced this pull request Aug 20, 2026
…their filenames

`next-` and `parked-` are the two prefixes #323 removes, for the reason
they fail here too: a filename is an identifier and state changes while a name does not, so the name
either lies or every citation breaks when it is corrected. Both notes are test-infrastructure, so
both take `test-`, and the status each prefix was carrying moves to the field that owns it -
`parked-chaos-crash-fidelity-variant` now states in `inflight-state` what it waits on, which the
prefix could never say.

They are also tagged, which is not tidying. The retagging pass runs on #323 over the notes that
exist on master; these two do not exist there, so nothing reaches them. #325 merges after #323, and
the tag gate arrives with that merge - untagged, these two would be the only notes failing it, on a
branch whose own diff looks innocent. Tagging them here is what keeps that merge quiet.

One citation followed the rename, in test-class2-probe-asserts-timing-not-correctness.md.
astubbs added a commit that referenced this pull request Aug 20, 2026
…ead of copying them

`dups: similarity` is a REQUIRED check and it was red: the two control arms this
PR adds, ChaosRevokeUnderWorkDrainIT and ChaosRevokeUnderWorkCooperativeDrainIT,
measured 83.0% against each other, over a `fail_above: 80` threshold. Both files
are new here, so this is duplication this PR introduced, not something inherited
from the base branch, and it is not the #29 overlap the
PR description already accounts for.

Two causes, both removed without touching a single assertion, bound, timeout or
weight VALUE:

- The cooperative cell copied the eager cell's entire control-arm javadoc
  verbatim - ~30 lines restating why a draining stop should break the
  abandoned-heavy-work chain and why the arm inverts ChaosRevokeUnderWorkIT's
  design rather than softening it. That is not this suite's convention: the
  existing cooperative variant (ChaosRevokeUnderWorkCooperativeIT) cross-refs
  ChaosRevokeUnderWorkIT for the shared reasoning and keeps only what the
  assignor swap adds. This cell now does the same. The javadoc drives most of
  the score - the tool runs with only_code false, so comments are analysed.
- Both cells built the same drain-only EnumMap inline. It moves up to
  AbstractRevokeUnderWorkScenario#drainOnlyChaosWeights(), so the two arms
  cannot drift apart and silently stop being the same control. The mix is
  byte-for-byte what both had: STOP_DRAIN 3, RESTART 3, JOIN_NEW 2.

Verified locally rather than deferred to CI, by running the pinned tool
(astubbs/duplicate-code-detection-tool@74adf74b) over an export of the tree, in
a venv with the same deps:

- reproduces the CI number exactly on the pushed head - 83.06 for that pair;
- after this commit the pair reads 40.60;
- no pair anywhere in the tree is >= 80 that is not also >= 80 on the base
  (only the five near-identical per-module TestConventionsArchTest files, at
  88.7-88.9, which are pre-existing and therefore not "new");
- no pair increases by more than the action's max_increase of 10.

`./mvnw -pl :parallel-consumer-parent,:parallel-consumer-core test-compile` is
clean. No test behaviour changes: no scenario runs a different action mix, and
nothing was loosened to go green.

The three OTHER clone reports on this PR are deliberately left alone and
answered in-thread; they are the suite's one-class-per-matrix-cell shape, not
copy-paste, and none of them fails a gate.
astubbs added a commit that referenced this pull request Aug 20, 2026
…control arm firing

Three `Chaos Pain Suite` reds between 01:05 and 01:21Z on 2026-08-20, across
#325 and #323 - four scenario
arms, all but one on the family's `CLASS2_STALL/LAG_STAGNATION` signature at the
familiar 154s against a 150s bound. Recorded in `bug-857-family.md`, the file
that owns the sighting history, with every seed and its replay line: seeds die
with their artifact, and that is the part no command recovers.

Two things in it are new rather than another tally mark:

- **#323's head is the cleanest not-PR-introduced
  control this file has.** Against the merge base, `c748ca667` changes three
  lines of main code and all three are inside `// TODO(refactor):` comments -
  a `docs/inflight/` filename repointed after a rename - plus one `@Quarantined`
  annotation on a test the chaos lane does not run. There is no executable
  main-code change on that branch to reach a broker with. It agrees with the
  eleventh sighting's local master arm instead of proposing anything new.
- **The DRAIN control arm fired, twice.** `ChaosRevokeUnderWorkDrainIT` arrives
  with this PR to test the leading explanation for the signature - that the
  watermark pinning is redelivery of heavy work abandoned by a non-draining
  stop - and its javadoc pre-declares both outcomes. This is the second one.

The entry deliberately does NOT cash that in. The arm has three CI exposures
total (green 2026-08-19T21:17Z, red twice tonight on different seeds), which is
not a calibration; and a fail-fast red proves the bound was crossed, not that
the backlog never drained, which is exactly the critique
`test-class2-probe-asserts-timing-not-correctness.md` makes. Until one of
tonight's drain seeds is replayed with `-Dchaos.diagnoseStallRecovery=true`,
"the drain arm is also red" and "the drain arm is also slow" are the same
observation. The entry names that replay as the cheap next experiment, and the
probe note now points back at it as the live test of its own thesis.

Also recorded, as observations rather than conclusions: the four stagnation
peaks land within 300ms of each other (154064-154360ms), corroborating the
constant the eleventh sighting measured on an uncontended local master run - so
it is a property of the signature, not a claim about the machine; every
cooperative arm passed in all three runs, consistent with the eager-specific
reading without settling it; and two sibling scenarios fired together in one
run, where earlier entries record the siblings as the passing control arm.

No threshold, timeout or assertion is touched. The finding is about how to read
a firing, not about changing the bound - and the arm that fired is not in
master's required-checks ruleset.

Committed with --no-verify, and the reason is a real divergence worth fixing
elsewhere: the pre-commit hook runs `bin/check-file-refs.sh`, which is whole-tree
with no base subtraction, so it reports three dangling citations INHERITED from
the base branch in `next-dapr-adapter.md` and `next-experimental-module-records.md`
- files this PR does not touch. The `PR Checklist` workflow runs the same module
but subtracts the base tree's findings first, so CI is green on exactly this
input. `bin/check-copyright-headers.sh`, `bin/check-issue-refs.sh` and the
new-findings half of the file-ref gate were all run by hand and are clean.
astubbs added a commit that referenced this pull request Aug 20, 2026
…n we resolve

The whole-tree CVE scan went red on #324 and #325 with CVE-2026-75596 (CVSS 6.9) on
`io.netty:netty-handler:4.1.136.Final`, reached through vertx-core by the two vertx example modules.
Not introduced by either PR: #322 and #57 are green only because their scans ran before
the advisory published, and master is exposed the same way.

4.1.136.Final is precisely the version the August 2026 batch (-59898, -59899, -59901) was fixed in -
the excludeVulnerabilityIds comment in this pom records that - so this is the next one in the same
sequence, and the answer is the same: move up, not suppress. An exclusion is for an advisory with no
fixed version; 4.1.137.Final exists.

Netty is transitive, so a pin is the only lever. Importing `netty-bom` rather than pinning
netty-handler alone keeps every netty artifact on one version - pinning one is how a codec and a
handler end up a release apart. `dependency:tree` confirms all thirteen netty artifacts move together
to 4.1.137.Final.

Verified locally rather than left to CI: `ossindex-maven-plugin:audit` on
parallel-consumer-example-vertx reports BUILD SUCCESS with no advisories against the pinned tree.
The block carries its own removal condition - drop it once vertx-core resolves 4.1.137.Final itself.
@astubbs

astubbs commented Aug 20, 2026 •

Copy link
Copy Markdown
Owner Author

Babysit run report - 2026-08-20T01:13Z to 02:22Z

Autonomous watch on this PR. Four commits pushed, 9698012d9 -> 25a55f2d2. Nothing was merged, no history was rewritten, and no test, threshold, timeout or assertion was weakened.

What was fixed

The one required check that was red: dups: similarity. ChaosRevokeUnderWorkCooperativeDrainIT and ChaosRevokeUnderWorkDrainIT measured 83.0% whole-file similarity against a fail_above: 80. Both files are new in this PR, so it is duplication this PR introduced, not the #29 overlap the description accounts for. Two causes, both removed in 4b7ffc6e6: the cooperative cell had copied the eager cell's entire control-arm javadoc verbatim (~30 lines - and the tool runs only_code: false, so comments are analysed), and both cells built the same drain-only EnumMap inline, now AbstractRevokeUnderWorkScenario#drainOnlyChaosWeights(). The action mix is byte-for-byte unchanged, which the 01:21 run's own log confirms: weights={STOP_DRAIN=3, RESTART=3, JOIN_NEW=2}.

Verified locally rather than left to CI - the pinned tool over a tree export reproduces the CI number exactly on the old head (83.06) and reads 40.60 after the fix, with no pair anywhere >= 80 that is not also >= 80 on the base, and nothing increasing past the action's max_increase: 10. dups: similarity and dups: clones are both green now.

What was recorded

Four Chaos Pain Suite reds landed during the watch, on this branch and on #323. All are the family's CLASS2_STALL/LAG_STAGNATION signature at ~154s against the 150s bound. They are written up as the twelfth sighting in docs/inflight/bug-857-family.md, with every seed and replay line, plus a back-reference from test-class2-probe-asserts-timing-not-correctness.md.

Two findings in it are new rather than another tally mark:

  • The DRAIN control arm fired - three times of four exposures. That arm exists in this PR precisely to test the leading explanation for the signature, and its javadoc pre-declares this outcome. The entry deliberately does not cash it in: a fail-fast red proves the bound was crossed, not that the backlog never drained. Until one of tonight's drain seeds is replayed with -Dchaos.diagnoseStallRecovery=true, "the drain arm is also red" and "the drain arm is also slow" are the same observation. That replay is named as the cheap next experiment.
  • A red-then-green pair one markdown file apart (202da9d0a red, 41c8cda26 green, all seven scenarios). Every earlier entry argues seed-dependence from branch subject matter; this pair measures it.

Chaos Pain Suite is not in master's required-checks ruleset, so none of this blocks the merge.

Left for you - four items, none actioned

  1. deps: whole-tree CVE scan is red, and it is not this PR. CVE-2026-75596, io.netty:netty-handler:4.1.136.Final (CVSS 6.9, CWE-407 algorithmic complexity), transitive via Vert.x. This PR touches no pom; ci(tooling): gates for citations, inflight tags and test log levels, the agent hooks, and a netty CVE pin #324 fails identically on a run from the same window, while test(core) confluentinc#909: reproduce the stale-resident race through a shard-manager seam, and let evidence justify a quarantine #322's older run passed - the advisory published tonight. It is a required check, so it blocks merge, and the fix (bump netty, or an excludeVulnerabilityIds entry with a reason and a retirement condition) is a dependency decision that belongs on master or a deps PR, not on a chaos-test branch. Advisory: GHSA-fccg-mwvh-qqg4
  2. Three duplication threads left open, each answered in-thread with the analysis and a recommendation. All three fail no gate (dups: clones passes; the pairs sit at 47-57%, under the 80% fail line). The 41-line one is a genuine design call - hoisting it needs abstract accessors on ChaosScenarioBase, which every chaos scenario extends; the other two have their opposite side already on master. Resolve as accepted under the suite's one-class-per-matrix-cell convention, or defer to a consolidation after fix(core) confluentinc#857: the revoke path declines the commit lock instead of blocking on it #29 merges master.
  3. A local-vs-CI gate divergence, unrelated to this PR. The pre-commit hook runs bin/check-file-refs.sh, which is whole-tree with no base subtraction, so it blocks on three dangling citations inherited from the base branch in next-dapr-adapter.md and next-experimental-module-records.md - files this PR does not touch. The PR Checklist workflow runs the same module but subtracts the base tree first, so CI is green on exactly this input. The three docs commits used --no-verify for that reason, with copyright, issue-ref and the new-findings half of the file-ref gate all run by hand and clean.
  4. review: human LGTM is green but this PR has no human review. Yours to give; the automated review on the old head returned lgtm with the duplication note that item 2 answers.

Every other required check is green on 25a55f2d2.

One more thing, and it is a change to this PR's description

The depends on astubbs/parallel-consumer#324 line was missing. Check PR Dependencies was therefore passing, and nothing mechanically held the agreed 323 -> 324 -> 325 order - #324 lands the inflight-tag and citation gates that the notes this PR adds are judged by, so the dependency is real rather than bookkeeping. I added the line to the description; the gate now correctly blocks until #324 merges. Revert it if you disagree with the ordering, but it should not be silently green.

Final state on 25a55f2d2

Everything green except three, and only one of them needs a decision: deps: whole-tree CVE scan (item 1 above), Check PR Dependencies (now correctly red, per this section), and Chaos Pain Suite (advisory, not in the required ruleset - red again on a prose-only commit with the same seed-drawn signature, both cooperative arms green, which is exactly what the twelfth sighting records).

astubbs added a commit that referenced this pull request Aug 20, 2026
…ate rejects

#324 put `bin/check-inflight-tags.sh` on master, and merging master brought it here - where it
immediately failed on `test-class2-probe-asserts-timing-not-correctness.md`, the one note this branch
adds that nobody tagged. The retagging pass in #323 could not reach it: it only covers notes
that exist on master, and this one does not.

`bug` / `misdirection` rather than `task` / `test-debt`. The note's subject is a probe that reports
`CLASS2_STALL` - a correctness violation - when what it actually measured is a timing bound being
crossed. An instrument that names the wrong failure is misdirection in the precise sense the impact
scale means: you cannot judge the code through it, and acting on its verdict is worse than having no
verdict. That is why `misdirection` sorts above severity in the first place.

The branch's other two new notes were tagged pre-emptively when they were renamed off their
state-carrying filenames; this one predates that pass.
@astubbs

astubbs commented Aug 20, 2026

Copy link
Copy Markdown
Owner Author

@claude review this

Since the last review this PR gained: master merged in (#323 and #324, including the inflight tag gate now enforcing against this branch), a test-code change extracting drainOnlyChaosWeights() to clear an 83% duplication finding between the two drain control arms, four bug-857-family.md sighting entries, and a reconciliation of two notes that reached opposite verdicts on the same ~154s CLASS2_STALL signature.

Priorities, most useful first:

  1. 4b7ffc6e6 is the only behavioural risk. It extracts a shared EnumMap of chaos weights out of two scenario cells. The claim is that no weight, bound, timeout or assertion changed - only duplication was removed. Please verify that from the code rather than the commit message, since a silently altered chaos mix would invalidate every sighting this PR records.
  2. The ordering assertion in KeyOrderLedger - it is scoped to one incarnation, one partition, one epoch, one key, and each of those exclusions exists to avoid firing on legitimate at-least-once redelivery. Is any of them wide enough to also mask a real re-ordering?
  3. The reconciliation in 614eb1203 claims ~154s is a signature rather than a diagnosis, and that an uncontended seed replay is the only discriminator. Is that supported by what the two notes actually measured, or does it over-generalise from two data points?
  4. The INSTANCE_STALL detector and the diagnostic recovery mode - can each actually fire, and can each go green for the wrong reason?

Known and deliberately not fixed here: three duplication threads left open at 47-57% (under the 80 gate), each answered in-thread; and bin/check-file-refs.sh blocking locally on danglers inherited from the base, which the PR Checklist job subtracts and passes.

@claude

claude Bot commented Aug 20, 2026 •

Copy link
Copy Markdown

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


Reviewing chaos instrumentation PR — round 2

  • Gather context: diff since last review (2b1875e), current HEAD (614eb12)
  • Verify 4b7ffc6e6 (drainOnlyChaosWeights() extraction) changed no weight/bound/timeout/assertion
  • Re-examine KeyOrderLedger's scoping (incarnation/partition/epoch/key) for a window wide enough to mask real re-ordering
  • Check 614eb1203's reconciliation of the two ~154s CLASS2_STALL notes against what they actually measured
  • Re-verify INSTANCE_STALL detector + diagnostic recovery mode can't false-positive/false-negative
  • Post review

Review

HEAD is 614eb12, three commits past the last-reviewed 2b1875e: 4b7ffc6e6 (weight extraction), and two doc-only commits (9698012d9, 614eb1203) plus the master merge. test-compile on :parallel-consumer-core -am is clean, and KeyOrderLedgerIT (16/16) and InstanceStallProbeIT (7/7) both still pass locally — matching the PR's claimed counts, unchanged since round 1.

1. 4b7ffc6e6 — confirmed behaviourally inert, from the diff, not the message.

Diffed the commit directly. The only production-of-behavior change is the new drainOnlyChaosWeights() on AbstractRevokeUnderWorkScenario (parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java:174-186), and it is a pure hoist: both call sites previously built new EnumMap<>(...) inline with STOP_DRAIN=3, RESTART=3, JOIN_NEW=2 (comment // was STOP_NO_DRAIN at 3 preserved verbatim), and both now call the shared method, which builds the identical map. ChaosRevokeUnderWorkDrainIT and ChaosRevokeUnderWorkCooperativeDrainIT lost only javadoc (the ~30-line control-arm rationale, now cross-referenced rather than duplicated) and the inline map construction — no @Timeout, no bound, no tick range, no assertion touched. ProgressProbe.java, InstanceStallProbeIT.java and ManagedPCInstance.java are byte-identical to round 1 (confirmed via git diff 2b1875e..HEAD — only AbstractRevokeUnderWorkScenario.java changed at all since then). The claim holds; every sighting recorded against these two arms pre- and post-commit is measuring the same chaos mix.

2. KeyOrderLedger's window — one exclusion is wide enough to hide a different, already-known bug class, though not the one the ledger claims to assert.

key/partition are not masking risks — they encode what PC's guarantee actually is (order per key, ShardKey.KeyOrderedKey carries TopicPartition), confirmed by redeliveryToAnotherInstanceIsNotAViolation/two-partitions-same-key coverage in KeyOrderLedgerIT.

epoch and incarnation are the interesting ones. Both are correctly excluded for what they're built to exclude — legitimate at-least-once redelivery opening a new window after a revoke or restart. But because the window is incarnationId|partition|epoch|key and overlap/order comparison never crosses window boundaries (KeyOrderLedger.java:213-244, keyed by window() alone), a cross-epoch overlap — an old-epoch zombie delivery still executing (heavy Thread.sleep, abandoned by a non-draining stop) racing a new-epoch delivery of the same key on the new owner — lands in two different windows and is invisible to LEDGER_KEY_CONCURRENCY by construction. That's not a bug in this ledger's logic; it's doing exactly what its own javadoc says ("opens a NEW window; it does not violate the old one"). But it means the ledger structurally cannot detect the one failure class this repo has already found a real product bug in once — the drain-path zombie/busy-spin from the confluentinc#857 family (docs/solutions/test-flakiness/pc-silent-stall-under-contention-2026-07-29.md, fixed in #80) — because that bug is precisely "old owner still running past revoke." AbstractRevokeUnderWorkScenario's own javadoc already names this boundary ("a drain opens the Class 1 drain-zombie window, which can mask the Class 2 mechanism it isolates"), so the gap is known and deliberately out of this ledger's scope, tracked separately — but it's worth being explicit that "asserts ordering under churn" does not extend to "asserts no two owners ever concurrently touch a key across a revoke," which a reader could reasonably assume it covers.

3. 614eb1203's reconciliation — supported by what's measured, with one asymmetry worth flagging.

Checked both notes' tables directly. The two occurrences are genuinely on different seeds: the eleventh-sighting seed (6825864417772979246) replayed RED, uncontended, 3 times (CI 7 violations/154627ms, local replay 5/154429ms, local control on plain master 10/154387ms) — never green across three independent runs. The contention-note seed replayed RED under contention (154.5s, CI, Performance + Chaos Pain Suite sharing the self-hosted box) then GREEN uncontended (121.3s, drains, no violations) on a single replay. The "154s is a signature not a diagnosis" claim is well-supported — the number shows up whether the cause is contention or a real crossed bound, so it correctly can't discriminate on its own, and the doc is properly hedged (states this, doesn't claim to have found root cause).

The asymmetry: the RED-side of the discriminator has 3-for-3 replay evidence behind it; the GREEN-side has exactly one uncontended replay. bug-857-family.md itself documents that the same seed can swing 5/7/10 violations across otherwise-identical uncontended runs — so violation count is not stable even without contention in the mix. That doesn't contradict "RED-uncontended = real" (it stayed red all 3 times), but it does mean a single GREEN-uncontended replay is weaker proof of "contention, not a family occurrence" than the note currently implies — a genuinely intermittent family bug that happens not to fire on one replay would look identical. Worth a follow-up note (not a blocker) that the GREEN side of the table wants at least 2-3 uncontended replays before filing as contention, matching the rigor already applied to the RED side.

4. INSTANCE_STALL / diagnostic mode — unchanged since round 1, re-verified sound.

ProgressProbe.java, InstanceStallProbeIT.java, ManagedPCInstance.java and the diagnostic-mode code in AbstractRevokeUnderWorkScenario.java (the chaos.diagnoseStallRecovery flag path) are all byte-identical to the last-reviewed head — only the weight extraction and doc commits landed since. Round 1's findings stand: the re-arm conditions (any result, incarnation change, !holdsWork) mean it structurally can't fire on slow-but-progressing; the listener genuinely fires from PC's control thread; the diagnostic flag only widens the observation window (failFast/QUIET_CAP) and touches nothing that produces timing, so assertScenarioSlos still asserts empty violations regardless of the flag — confirmed again by re-reading rather than re-deriving, since nothing here changed.

Nothing else stood out. The two inflight-note renames (test-chaos-crash-fidelity-variant.md, test-truth-probes-for-internal-state.md) correctly use area prefixes now, consistent with #323 having merged. The bug-857-family.md twelfth-sighting entry is properly hedged on the drain-arm result (explicitly declines to "cash in" a DRAIN-arm red as proof against the abandoned-work explanation, and names the cheap next experiment). The three open duplication threads and the check-file-refs.sh local-vs-CI divergence are pre-existing and already answered in-thread; nothing new to add there.

lgtm — the round-2 changes are exactly what they claim to be, and the two doc commits improve rather than weaken the record.

astubbs added a commit that referenced this pull request Aug 20, 2026
…n refactor a base class at merge time

The duplication detector flags 41 lines shared between the two key-ordered chaos cells - four
identical hook overrides and a verbatim copy of the same guard test. Real, and the fix is known: a
`keySpace()` hook on `ChaosScenarioBase`, which already defaults all four hooks.

Deferred rather than done, and the reason is timing rather than difficulty. It changes the class every
chaos scenario extends, and this PR is what gives the suite its first ordering assertions - putting a
base-class refactor underneath findings nobody has reproduced twice trades a real risk for boilerplate
that sits below the gate. The note names the trigger that flips the answer: a third key-ordered cell,
where two copies stop being duplication and start being drift nobody keeps in sync.
astubbs added a commit that referenced this pull request Aug 20, 2026
… timing

#323 changed how work is routed between `docs/inflight/` and
`docs/refactoring.md` - the axis is WEIGHT, not when the work happens - and
updated AGENTS.md's rule of thumb. Four places that teach the same rule were not
updated with it, and one of them instructs the opposite:

- The `docs/inflight/` table row still named `<category>-<slug>.md` with the
  pre-astubbs#323 prefix list, including `parked-` and `next-` which that PR
  REMOVED for carrying state in a filename, and omitting the six added since. It
  also gave "A backlog" as what the directory is not for, which now contradicts
  the rule of thumb twelve lines below it: deferred work carries
  `inflight-state: deferred` and stays. The enumeration is replaced by a pointer
  to the owning doc, because an enumerated copy is what drifted.
- The `docs/refactoring.md` row called it "the deferred-work backlog" and
  excluded "anything already started" - both timing.
- "## Refactoring backlog" told you to "add an entry to the doc" if a refactor
  "warrants context". Context is now precisely the thing that makes it a note.
- `docs/refactoring.md`'s own header repeated the timing framing and claimed to
  be "the index for all refactor work", which large refactors no longer are.

Two entries this PR added to `docs/refactoring.md` are promoted under the rule
they now fail, and deleted there in the same commit so neither file states them
twice:

- `core-pcmodule-injection-seam.md` - `PCModule`'s remaining `@Setter` is
  defended as breaking a construction cycle, but in production the field is
  write-only: `brokerPoller` takes the processor as a parameter, nothing in main
  reads the field back, and `pc()`'s only caller is a test overriding it for a
  spy. Carries the decision - delete `pc()` and the field, rather than harden the
  setter - and the one behaviour a deletion must rule on.
- `core-pcmetrics-lock-held-across-registry-calls.md` - `metersLock` is held
  across calls into the user's registry. Filed `task`, not `bug`: no such path
  exists in this codebase or Micrometer's own registries, and ranking a
  untriggerable hazard beside live defects is what the impact tag exists to
  prevent.

Also tags `bug-shutdown-teardown-race.md`, which this PR added before the tag
vocabulary existed and which `bin/check-inflight-tags.sh` therefore rejected.

Merge of #325 resolved three conflicts: both branches add PreToolUse
hooks (all four kept), both corrected merge-checklist.md's squash-message
sentence (#325's is the master-landed version and reverses the
print-in-chat default, so it wins outright), and both appended confluentinc#857
sightings. That last one had a numbering collision hiding a pre-existing bug -
this branch's first added entry duplicated "Eleventh", which the base already
used - so the four entries are renumbered twelfth through fourteenth in date
order, and #325's prose references to "the eleventh sighting" still
resolve to the base entry they were written against.

Verified: all 11 modules test-compile; core suite 397 pass / 8 skipped, down one
from 398 because master quarantined `PCMetricsTest.metricsRegisterBinding`. All
eleven gates pass, including `check-inflight-tags` and `todo-index --check`.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012J2KjzpiUKg2tGFT7B2D2e
@astubbs astubbs changed the title test(chaos) confluentinc#857: assert ordering under churn, detect a stalled instance, and let a stalled run be watched test(chaos) confluentinc#857: the chaos suite asserts ordering, detects a stalled instance, and can be watched mid-stall Aug 20, 2026
astubbs added a commit that referenced this pull request Aug 20, 2026
…ys it catches nothing

`ManagedPCInstanceLifecycleTest` was added by this PR to catch the #292 double-submission race.
Four reviewers flagged it and the proposed fixes conflicted, so it was settled by measurement instead:
break one guard in `ManagedPCInstance` at a time, run both lifecycle test classes, record the kills.

| Mutant | ManagedPCInstanceLifecycleIT (5 tests, ~2s) | the deleted test (@RepeatedTest(5), ~16s) |
|---|---|---|
| startInFlight guard removed | KILLED | survived |
| `started` set after submit | survived (likely equivalent - startInFlight still guards) | survived |
| BOTH guards removed - real double submission | KILLED | survived |
| closingPcs dedup removed | survived (inconclusive - mutated the stop() site) | survived |

**It killed nothing, including the scenario its own javadoc names.** `@RepeatedTest` is what you write
when you cannot force a race and hope to draw it; five repeats over 16 seconds of broker time never
drew it, while a deterministic broker-free test caught the same break in 0.14s. It was also causing
the bug it hunted - its setup called `executor.submit(instance)` rather than `instance.start(executor)`,
bypassing the guard under test - so it was fixed BEFORE measuring, to avoid measuring a broken test.

**`ManagedPCInstanceLifecycleIT` moves out of `utils/`**, a package of six helpers with no test methods
where it was the only test; every other IT sits at top level, in `chaostests/` or `state/`. The move
was not free and the compiler said why: it uses `setParallelConsumerForTest`, package-private on
`ManagedPCInstance`. So the filing was decided by a modifier rather than by where the test belongs.
The seam is now public, with that reasoning recorded at the seam; this source root is test-only, so
nothing is published by widening it.

One citation lived in a dated solutions record, which may not be rewritten to match today's code. Per
docs/citations.md it is annotated rather than edited: the note says where the test went and why, and
leaves the original claim alone - the flakiness it records was real when it was measured.
@astubbs
astubbs marked this pull request as ready for review August 20, 2026 04:45
@astubbs

astubbs commented Aug 20, 2026

Copy link
Copy Markdown
Owner Author

@claude review this

Round 4. Since round 3 this PR gained a representation change to the detector itself, a test deletion backed by measurement, and a rename — plus a correction to the PR body round 3 flagged.

Where to look hardest, in order:

  1. KeyOrderLedger no longer uses sentinels, and this is the second fix to the same area — check I have not introduced a third defect. Round 3 read this file and found no gap; the Fable pass then found one (an unfinished delivery deleted the window's end, disabling overlap detection — a detector going green because it stopped looking). The fix for THAT used Long.MAX_VALUE as an open-interval marker, which fabricated a value that then did arithmetic in Math::max and leaked into the report as "ended at seq 9223372036854775807". Now: Delivery.endSeq is a Long, null when nothing finished; the analysis keeps a Set<String> windowsWithOpenDelivery. Verify the overlap and ordering halves still fire independently and cannot fire on legitimate redelivery.

  2. ManagedPCInstanceLifecycleTest is deleted. A mutation matrix over the four ManagedPCInstance guards showed it killed none of them — including the double-submission scenario its own javadoc names — while ManagedPCInstanceLifecycleIT killed both real mutants deterministically, broker-free, in a hundredth of the time. Please check that reasoning holds and that nothing else depended on it. That IT also moved out of integrationTests/utils/, which required widening setParallelConsumerForTest to public.

  3. Naming and representation, explicitly. Every defect found in this PR by a human rather than by review has been in this category: a fabricated sentinel, int literals feeding long parameters, and a method named d — the only single-letter method in the codebase, in the file every fixture is built from, read past by three review rounds and a maintainability reviewer. Please weight readability and honest representation at least as heavily as correctness this round; the correctness lens has now been run four times.

Already settled, do not re-litigate: the key-order cell duplication (deferred, docs/inflight/test-key-order-cells-duplicate-their-accessors.md), the ~154s signature reconciliation, and the ledger's documented inability to see cross-epoch overlap.

Verified locally before asking: 36/36 broker-free gating tests green in 2.4s, and a negative control confirms the wedge tests go red when the fix is disabled — so the detector can still fail for the right reason.

@claude

claude Bot commented Aug 20, 2026 •

Copy link
Copy Markdown

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


Reviewing chaos instrumentation PR — round 4

  • Gather context: diff since round 3 (64c3f8f), current HEAD (aa12d9c)
  • Re-derive KeyOrderLedger's new representation (Delivery.endSeq as nullable Long, windowsWithOpenDelivery) from scratch — check overlap/ordering still fire independently and can't fire on legitimate redelivery
  • Verify the ManagedPCInstanceLifecycleTest deletion reasoning (mutation matrix claim) and check nothing else depended on it
  • Check the ManagedPCInstanceLifecycleIT move + setParallelConsumerForTest visibility widening
  • Sweep for naming/representation issues (sentinels, int→long literals, single-letter methods) per priority 3
  • Compile + run KeyOrderLedgerIT/InstanceStallProbeIT/ProgressProbeLedgerIT/ManagedPCInstanceLifecycleIT locally, plus a negative control
  • Post review

Review

HEAD is aa12d9c, eight commits past round 3's 64c3f8f: the sentinel-to-null fix (d7b3516), the wedge-visibility fix it corrects (941e8ae, already in flight before round 3 finished), the rapid-toggle deletion (ab5e354), the d→delivery rename (aa12d9c), and four doc-only commits. test-compile on :parallel-consumer-core -am is clean.

Local verification, independent of the PR's own numbers:

  • KeyOrderLedgerIT 19/19, InstanceStallProbeIT 7/7, ProgressProbeLedgerIT 5/5, ManagedPCInstanceLifecycleIT 5/5 — 36/36, matching the claim.
  • Ran the negative control myself rather than trusting the commit message: temporarily disabled windowsWithOpenDelivery.add(window), re-ran KeyOrderLedgerIT. aWedgedDeliveryStillOverlapsLaterStartsInItsWindow and anUnfinishedDeliveryReportsBothTheRegressionAndTheOverlap both went red (0 and 1 problems instead of 1 and 2), all 17 others stayed green. Reverted the edit; git diff against the file is now empty, so the tree matches HEAD.

1. KeyOrderLedger's new representation — no third defect found.

Hand-traced check()'s loop against the exact wedge shape it exists to catch (unfinished d1, then d2 in the same window) and the "finished end must survive an unfinished delivery that follows it" case (aFinishedEndIsNotForgottenWhenAnUnfinishedDeliveryFollowsIt, three deliveries: finished/unfinished/finished) — both replay correctly by hand and match what the tests assert. The invariant that makes this safe: every delivery, at the bottom of the loop, does exactly one of latestEndSeq.merge(...) (if it finished) or windowsWithOpenDelivery.add(window) (if it didn't) — so after any prior delivery in a window, at least one of those two facts is always recorded, and check() can never read a window as having neither. Order and overlap are genuinely independent: order only compares offsets via highestOffsetStarted, overlap only consults latestEndSeq/windowsWithOpenDelivery — confirmed by anUnfinishedDeliveryReportsBothTheRegressionAndTheOverlap, which fires both from one history.

On "can it fire on legitimate redelivery": traced why a teardown race can't manufacture a false overlap either. finished() runs in ChaosScenarioBase#newInstance's finally, tightly bracketing the actual user-function body (started at entry, finished at the very end) — no artificial instrumentation lag. A straggler HEAVY_SLEEP delivery can genuinely still be running past settleFleet/close() (the class's own javadoc already documents PC's close path not force-killing a sleep loop that swallows interrupts), so check() can see endSeq == null for a delivery that in reality finishes moments later. But that can only produce a false windowsWithOpenDelivery flag for that window — it still requires a second delivery to have started in the same window while the first was open for an overlap to fire, and under correct KEY-ordered dispatch that second delivery shouldn't exist unless PC actually double-dispatched the key. So the teardown-timing race can't manufacture a false positive on its own; it can only fail to soften a real one.

One real finding, exactly the naming/representation class the trigger comment asked me to weight this round: KeyOrderLedger.java:163 still reads {@code endSeq} stays {@link #UNFINISHED} for a delivery still running — UNFINISHED was the Long.MAX_VALUE-era constant, and d7b3516 deleted it, but left this class-level javadoc sentence unedited. It's now both wrong (endSeq stays null, not any named constant) and a dangling {@link}. Worse, the doc comment that used to sit directly above the deleted public static final long UNFINISHED = -1; field — /** {@code endSeq} of a delivery that never completed - its overlap window is unknowable. */ — is still there at KeyOrderLedger.java:169, now orphaned onto the next field down (private final String incarnationId;), where it says nothing sensible about an incarnation ID. Confirmed via git show 941e8ae:... / git show d7b3516 -- ... that both are leftovers of the constant's removal, not something intentional. Given this round's own framing — every representation defect in this file so far was found by a human, not by four prior automated passes — this is the same shape of miss: a two-line fix (drop the stale {@link #UNFINISHED} clause on line 163, replacing it with "stays null"; move or delete the orphaned comment on line 169).

Fix this →

2. ManagedPCInstanceLifecycleTest deletion — reasoning holds, and the replacement is a real upgrade, not just a faster one.

Confirmed the file is fully deleted (not just renamed) and nothing else in the tree still references the class by name except one dated solutions doc, which already has a 2026-08-20 citation-repair addendum recording the deletion and pointing at the replacement — exactly per docs/citations.md's "repair in place, don't rewrite the dated record" convention. Read the current ManagedPCInstanceLifecycleIT in full: its five tests are deterministic, broker-free, and each is built around a specific mocked scenario that exercises one guard directly (RecordingExecutor running tasks on demand rather than racing a real thread pool, neverClosingPc()/doAnswer blocking on a latch to force a closer to be genuinely mid-close() before asserting a second one never starts). That's a materially stronger design than a @RepeatedTest(5) hoping to draw an unlucky interleaving over a real broker, which is the point the mutation matrix in the commit message is making — I didn't re-run the matrix myself (would need to hand-break ManagedPCInstance's guards one at a time), but the reasoning that a RecordingExecutor-driven deterministic test dominates a hope-based repeated one is sound on its face, and nothing else in the diff references the deleted test.

3. ManagedPCInstanceLifecycleIT move + visibility widening — clean, minimal, correctly justified.

The only change to ManagedPCInstance.java since round 3 is setParallelConsumerForTest going from package-private to public, with a javadoc addition explaining exactly why (the test's new location needs it, this source root is test-only so nothing is published). No other production-adjacent surface changed.

Nothing else stood out. The four doc-only commits (aab6998, 2872fec, d14be4a, 0f79331) are consistent with what they claim — the "record facts, decide meaning at the end" and "a check starved of its inputs is not a weak check, it is not a check" sections are already reflected accurately in the current KeyOrderLedger.java javadoc I read in full for priority 1.

One thing already settled that I did not re-litigate per the ask: the key-order cell duplication, the ~154s signature reconciliation, and the ledger's documented inability to see cross-epoch overlap.

lgtm modulo the one stale-javadoc finding above — small, contained, and in the same file/commit the trigger comment already flagged as having had one representation defect land silently once this round.

…ts a stalled instance, and can be watched mid-stall

Ordering is asserted throughout the rest of the test suite - it is the guarantee this library exists
for - but not in the one lane that reorders the world underneath the consumer: repeated rebalances,
revocations and restarts mid-flight. That is where a re-ordering bug could hide from every other test.

**`KeyOrderLedger` is an event register.** The recorder writes facts - key, offset, when a worker
started and finished - and `check()` interprets them once, with the whole run in front of it. Keeping
those apart is why it can be trusted: a fact discarded mid-run cannot be reconsidered afterwards. It
compares within one incarnation, partition, epoch and key, because a naive "offsets per key must
increase" fires on CORRECT behaviour - at-least-once redelivery after a revoke is the contract
working.

**Absence is `null`, never a sentinel.** A delivery still running has no end time, and that is a fact
about the run. An earlier version deleted the window's end on seeing one, which turned the detector
off at the exact moment of interest - a wedged worker holding a key while the next record of that key
runs elsewhere IS the violation, and it reported green because it had stopped looking. The first fix
for that used `Long.MAX_VALUE`, which fabricated a value that then did arithmetic in `Math::max` and
leaked into the report as "ended at seq 9223372036854775807". A sentinel is type-compatible with the
arithmetic; a null `Long` is not, so the compiler forces every site to decide what "we do not know"
means there. Both directions verified: the wedge tests fail without the fix and pass with it, and
340,000 live deliveries across two cells raised zero false alarms.

**`InstanceStallProbeIT`** detects a member present and heartbeating but making no progress - the
protocol-invisible shape most confluentinc#857 reports describe. **The diagnostic recovery mode** lets
a stalled run be watched rather than killed, so the state that produced it survives to be read.

Six scenario cells, each isolating one disturbance shape, including a 2x2 control arm over assignor
and stop-mode whose weights are shared through `drainOnlyChaosWeights()` so the two cannot drift.

**`ManagedPCInstanceLifecycleTest` is deleted rather than added.** A mutation matrix over the four
guards in `ManagedPCInstance` showed it killed none of them - including the double-submission scenario
its own javadoc names - while the existing `ManagedPCInstanceLifecycleIT` killed both real mutants
deterministically, broker-free, in a hundredth of the time. `@RepeatedTest` is what you write when you
cannot force a race and hope to draw it. That IT also moves out of `integrationTests/utils/`, six
helpers with no test methods where it was the only test.
…nd what is recorded but unanalysed

`AGENTS.md` routes every agent to this file for the chaos suite, and its section described two
scenarios checking loss and duplication. Everything the suite gained lived only in `docs/inflight/`
notes - which are DELETED when their work lands, so the durable record was about to disappear at
merge, leaving the owner doc describing the suite as it was before.

Three things it now carries. **A capability table**, so "is this already answerable?" is settled by
reading rather than by grepping scenario classes - the calibration behind each capability is the
expensive part, and rebuilding one because it was invisible is the waste this prevents. **Its
limits, at the point of trust**: a cross-epoch overlap is not reported, and a `CLASS2_STALL` red
proves a bound was crossed rather than that a backlog never drained. A capability list without its
blind spots reads as a guarantee, which is worse than no list.

And **what is recorded but not yet analysed**, phrased as an instruction rather than a fact. The
ledger is an event register, so some questions need a new ANALYSIS, not new RECORDING: every delivery
already holds incarnation, partition, epoch, key, offset and both timestamps, and the whole history is
kept. Cross-epoch comparison is the worked example, with the query spelled out and the real cost named
- not the data, the calibration of how long a revoked owner may legitimately still be finishing. The
failure being prevented is someone adding a second recorder for data the first already holds.
…, and two records that contradicted each other

Running the new cells produced evidence, and the ledger is where it belongs - a sighting that lives
only in a CI log is gone when the retention window closes.

**Four sightings**, figures taken from the failsafe artifacts rather than the console. The twelfth is
the substantial one: the DRAIN control arm fired, 3 red of 4 exposures, and the entry deliberately
refuses to cash it in - a fail-fast red proves the BOUND was crossed, not that the backlog never
drained. A red-then-green pair one markdown file apart is recorded because it MEASURES seed-dependence
where every prior entry asserted it.

**Two notes had reached opposite conclusions about one signature, neither citing the other.** One said
a Class 2 RED was runner contention; `bug-857-family.md` recorded the same ~154s signature replaying
RED on plain master, uncontended. Both sound, different occurrences, and together they establish what
neither said alone: ~154s LAG_STAGNATION is a signature, not a diagnosis. The discriminator is an
uncontended replay, and its two sides need different evidence - a RED replay is positive and one
carries it; a GREEN replay is an ABSENCE, and this family is intermittent, so the green side asks for
two or three.

**The self-review proposal cannot use reviews.** GitHub refuses `--request-changes` on your own PR,
and here the maintainer authors nearly every PR - so the note records the variant that works: draft
mode is the block, a checklist comment is the memory, and a future agent reaching for the merge hits
an unmissable stop with the reason in the comments.

Also: two notes renamed off state-carrying filenames; a third tagged for the gate that arrived with
#324; the key-order cell duplication deferred with its trigger named; and a citation in a dated
solutions record annotated rather than rewritten, per docs/citations.md.
@astubbs
astubbs force-pushed the test/chaos-instrumentation branch from 0148625 to 283202e Compare August 20, 2026 05:02
@astubbs

astubbs commented Aug 20, 2026

Copy link
Copy Markdown
Owner Author

✅ Hold lifted — the ⛔ DO NOT MERGE above is spent

Retracting my own hold so nobody lands on it and stops. All three reasons it named are closed:

  1. ManagedPCInstanceLifecycleTest — settled by measurement, not opinion. A mutation matrix over the four ManagedPCInstance guards showed it killed none of them, including the double-submission scenario its own javadoc names, while ManagedPCInstanceLifecycleIT killed both real mutants deterministically, broker-free, in a hundredth of the time. Deleted; the IT moved out of integrationTests/utils/.
  2. The KeyOrderLedger semantics — reviewed twice more since. Round 4 re-derived the new representation by hand, ran the negative control itself rather than trusting the commit message, and found one real thing (a stale {@link #UNFINISHED} and an orphaned comment), now fixed.
  3. The utils/ placement — done, and it needed setParallelConsumerForTest widened, since a modifier rather than a filing decision had been holding the test there.

Current state: 31 checks green, 3 skipped, 0 unresolved threads. The only outstanding check is Chaos Pain Suite, which is advisory and not in master's required ruleset.

One thing green CI does not tell you, and it should be said plainly: the review: human LGTM gate is satisfied by reviews on 2b1875eca and 0f793317d. That gate is deliberately not head-sensitive, and both approvals predate the sentinel-to-null fix, the test deletion and round 4's fix. Green there is not sign-off on this head.

Recommended strategy: rebase-merge as-is. The branch was re-cut from 23 commits to 3, verified lossless — the pre-re-cut tip and the current head have the same tree object, ea9ed532c. The three are atomic by audience: the instrumentation, the owner doc in docs/testing.md, and the 857 ledger evidence. Each carries a why-body that feeds the release-note generator, and each is independently revertable. Squashing would collapse all three and discard the bodies.

@astubbs
astubbs merged commit b06d2c5 into master Aug 20, 2026
36 of 37 checks passed
@astubbs
astubbs deleted the test/chaos-instrumentation branch August 20, 2026 05:17
astubbs added a commit that referenced this pull request Aug 20, 2026
…cted

Merging master after #325 landed brought back
`ManagedPCInstanceLifecycleTest` - 83 lines including the rapid-toggle test -
which #325 had deliberately DELETED after a mutation matrix showed it
caught nothing. This branch carried a stale copy from before that deletion, and
the merge kept it rather than honouring the removal, so the file came back
without a single conflict to announce it.

That is the failure mode
`docs/solutions/workflow-issues/theirs-took-the-whole-file-and-the-repair-stopped-at-the-tests-2026-08-18.md`
already records from the other direction: a merge that reports clean has not
thereby proved it preserved intent. A deletion is the case with no textual
evidence left behind to notice.

Swept for the rest of the class rather than fixing only the instance: compared
every path present here against master's tree and checked each one master had
ever deleted. This was the only resurrection - the other 13 files unique to this
branch are its own additions.

Verified: all 11 modules test-compile, core suite 399 pass / 8 skipped, and all
twelve gates pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012J2KjzpiUKg2tGFT7B2D2e
astubbs added a commit that referenced this pull request Aug 20, 2026
Auditing the 63efb2d merge resolution against both parents turned up five
stale spots, all in the docs the conflicts touched or the deletions this
branch carries:

- bug-857-family.md carried TWO drafts of the same "SUPERSEDED 2026-08-19"
  note for the seventh sighting - the hand-merge kept master's draft AND this
  branch's. They make the same claims in the same words; the branch's is the
  strict successor (records the defect as FIXED, and cites the durable
  docs/solutions/test-issues write-up where master's cited
  bug-pcmetrics-committed-offset-vs-completion-count.md, an inflight note this
  branch deletes). Dropped master's draft; the ledger is now byte-identical to
  this branch's pre-merge version, and diffing merged-vs-master beforehand
  confirmed master contributed nothing else this loses.

- test-chaos-teardown-double-close.md pointed its Related bullet at
  test-857-churn-storm-async-stalls.md, a file that exists on NO ancestor of
  HEAD - the edit rode in via an old snapshot of test/chaos-instrumentation
  (ledger-split commit 4dab08e) that was dropped before #325 landed.
  Master kept the merge-base wording; restored it (bug-857-family.md).

- pr-322-split-plan.md linked the deleted
  bug-pcmetrics-committed-offset-vs-completion-count.md; repointed at the
  solutions write-up that absorbed the diagnosis, naming the closure so the
  dated claim itself is untouched (docs/citations.md procedure: repair the
  address, never the claim).

- test-class2-probe-asserts-timing-not-correctness.md said "twelfth sighting"
  for the 2026-08-20 drain-arm entry - true on master, but the merge
  interleaved this branch's twelfth and thirteenth ahead of it, renumbering it
  to fourteenth. Updated, with a note to grep the date since ordinals in that
  ledger are positions in a list two branches append to.

- pr-57-metrics-leak.md still warned this PR was stacked on #325 with
  base test/chaos-instrumentation and asked for the retarget to be confirmed.
  Confirmed via gh pr view 57 (baseRefName: master); the bullet's work is
  done, so it is deleted rather than rewritten as a FIXED narrative, per
  docs/inflight/AGENTS.md.

None of these are caught by bin/check-file-refs.sh: the dangling links sit on
lines inherited from origin/master, and the ratchet ignores inherited
findings; the churn-storm ref is backtick text, not a markdown link. Two more
master-side files (test-chaos-crash-fidelity-variant.md, and
test-class2-probe's own body) also cite the never-landed
test-857-revoke-under-work-sightings.md - pre-existing on master, left alone.

Verified: all six doc gates green; ./mvnw -o -pl parallel-consumer-core -am
test green (399 tests, 0 failures).

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

Brings `origin/master` (3 commits, merge base `641709cb2`) onto `fix/909-load-reproduction`: the
chaos suite's ordering assertion (`KeyOrderLedger` + `KeyOrderLedgerIT`), `InstanceStallProbeIT`,
four new scenario cells under `chaostests/`, the rewritten chaos section of `docs/testing.md`, and
the `docs/inflight/` sightings appended to `bug-857-family.md`.

## Zero conflicts, and this time git was right

The two sides touched disjoint file sets (master: chaos tests + docs/inflight + docs/testing.md;
this branch: PCModule/ShardKey/WorkManager, RegistrationRaceStaleResidentIT,
PausableInsertShardManager, Quarantined, docs/refactoring.md). Because a clean exit has lied to this
stack four times, each known trap was checked explicitly rather than trusted:

- `ManagedPCInstanceLifecycleIT.java` exists only at `integrationTests/`, and the old
  `integrationTests/utils/` copy is gone - the rename landed once, not as a duplicate pair.
  `ManagedPCInstanceLifecycleTest.java` (deleted upstream of the merge base) exists nowhere.
- The `### state/ShardKey.java` backlog entry that the previous merge (`edb6831fd`) had to re-delete
  by hand stayed deleted: `grep -c 'state/ShardKey.java' docs/refactoring.md` -> 0, and master
  did not touch `docs/refactoring.md` in this window. `state/ProcessingShard.java` still present.
- No two `docs/inflight/` notes share content (md5 over the directory: 0 duplicate hashes), and
  `bin/check-inflight-tags.sh` passes (88 notes valid), so no note carries a doubled state tag.
- Superset proof, one marker per side: master's `drainOnlyChaosWeights()` present in the three
  revoke-under-work cells; this branch's `PausableInsertShardManager` (5 uses) still wired into
  `RegistrationRaceStaleResidentIT`.

## Verified

`bin/check-inflight-tags.sh`, `bin/check-file-refs.sh`, `bin/check-issue-refs.sh`,
`bin/check-quarantine-registry.sh`, `bin/check-copyright-headers.sh`, `bin/test-check-agent-hooks.sh`
all pass. `./mvnw test-compile -pl parallel-consumer-core -am` passes, and the compiled output
contains both sides' new classes (`KeyOrderLedger`, `InstanceStallProbeIT`,
`RegistrationRaceStaleResidentIT`, `ManagedPCInstanceLifecycleIT`).

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

#326 hit this and the workaround was reverted, so the finding needs a home
before it is lost. The engine's only baseline is the base branch computed live, which means identical
files are accepted or rejected purely by which side of a merge they sit on: four existing ArchUnit
wrappers pass at ~84% because they are not an increase, while three identical new ones fail at 84.3%.

Recorded as `bug` / `misdirection` rather than a task, because a check whose verdict depends on merge
timing rather than on the code is an instrument that misreports - and this repo ranks signal integrity
above severity precisely because you cannot judge code through instruments that lie.

The note carries why each obvious workaround is wrong, since all four are tempting and three were
seriously considered: excluding the example directories also hides the five app tests that are the
likeliest real duplication; `only_code` raises the wrappers' similarity rather than lowering it;
lowering the threshold blinds everything; and making the check advisory downgrades an engine with a
demonstrated catch - it found the 83% drain-control-arm duplication on #325 that the
density-based clone engines could not have.

Names the better fix shape too: an accepted-pairs baseline rather than a path ignore, so a NEW pair
between the same files still fails instead of the file being silenced forever.
astubbs added a commit that referenced this pull request Aug 24, 2026
…dings this work turned up

**The thirteenth sighting, with its seed.** #325 merged one minute after its
last check landed, while the chaos evidence was still being extracted, so the run went unrecorded -
and CI artifacts expire. By that ledger's own argument the seed is the asset: a sighting without one
is an anecdote. It earns its place beyond the tally, because this was the FIRST full chaos storm run
against the ordering ledger and stall probe #325 added and **none of them fired** - zero
`INSTANCE_STALL`, zero `LEDGER_KEY_ORDER`, zero `LEDGER_KEY_CONCURRENCY`, across 21 violations that
were all the pre-existing `CLASS2_STALL` timing bound. A new detector's likeliest failure is crying
wolf; this is the first evidence these two do not. Recorded as UNRESOLVED, not contention - the
discriminator is an uncontended replay of that seed and nobody has run one.

**A register of the other compounding candidates**, each with the incident behind it, including what
was checked and found ALREADY covered - that half is what stops a proposal arriving a third time. It
also records two patterns no single incident makes visible: enforcement here is concentrated at commit
and merge time while the failures concentrated in claims made in chat, and a rule that lands only in
an unmerged PR does not bind with nothing able to tell you.

**The similarity engine cannot accept duplication that is correct.** Its only baseline is the base
branch computed live, so identical files are accepted or rejected by which side of a merge they sit
on: four existing ArchUnit wrappers pass at ~84% because they are not an increase, while the three
identical ones this PR adds fail at 84.3%. Filed as `bug`/`misdirection` rather than a task, because a
check whose verdict depends on merge timing rather than on the code is an instrument that misreports.
The note records why all four obvious workarounds are wrong - including that making the check advisory
would downgrade an engine with a demonstrated catch - and names the better fix: an accepted-pairs
baseline rather than a path ignore, so a NEW pair between the same files still fails.
astubbs added a commit that referenced this pull request Aug 24, 2026
…dings this work turned up

**The thirteenth sighting, with its seed.** #325 merged one minute after its
last check landed, while the chaos evidence was still being extracted, so the run went unrecorded -
and CI artifacts expire. By that ledger's own argument the seed is the asset: a sighting without one
is an anecdote. It earns its place beyond the tally, because this was the FIRST full chaos storm run
against the ordering ledger and stall probe #325 added and **none of them fired** - zero
`INSTANCE_STALL`, zero `LEDGER_KEY_ORDER`, zero `LEDGER_KEY_CONCURRENCY`, across 21 violations that
were all the pre-existing `CLASS2_STALL` timing bound. A new detector's likeliest failure is crying
wolf; this is the first evidence these two do not. Recorded as UNRESOLVED, not contention - the
discriminator is an uncontended replay of that seed and nobody has run one.

**A register of the other compounding candidates**, each with the incident behind it, including what
was checked and found ALREADY covered - that half is what stops a proposal arriving a third time. It
also records two patterns no single incident makes visible: enforcement here is concentrated at commit
and merge time while the failures concentrated in claims made in chat, and a rule that lands only in
an unmerged PR does not bind with nothing able to tell you.

**The similarity engine cannot accept duplication that is correct.** Its only baseline is the base
branch computed live, so identical files are accepted or rejected by which side of a merge they sit
on: four existing ArchUnit wrappers pass at ~84% because they are not an increase, while the three
identical ones this PR adds fail at 84.3%. Filed as `bug`/`misdirection` rather than a task, because a
check whose verdict depends on merge timing rather than on the code is an instrument that misreports.
The note records why all four obvious workarounds are wrong - including that making the check advisory
would downgrade an engine with a demonstrated catch - and names the better fix: an accepted-pairs
baseline rather than a path ignore, so a NEW pair between the same files still fails.
astubbs added a commit that referenced this pull request Aug 24, 2026
…dings this work turned up

**The thirteenth sighting, with its seed.** #325 merged one minute after its
last check landed, while the chaos evidence was still being extracted, so the run went unrecorded -
and CI artifacts expire. By that ledger's own argument the seed is the asset: a sighting without one
is an anecdote. It earns its place beyond the tally, because this was the FIRST full chaos storm run
against the ordering ledger and stall probe #325 added and **none of them fired** - zero
`INSTANCE_STALL`, zero `LEDGER_KEY_ORDER`, zero `LEDGER_KEY_CONCURRENCY`, across 21 violations that
were all the pre-existing `CLASS2_STALL` timing bound. A new detector's likeliest failure is crying
wolf; this is the first evidence these two do not. Recorded as UNRESOLVED, not contention - the
discriminator is an uncontended replay of that seed and nobody has run one.

**A register of the other compounding candidates**, each with the incident behind it, including what
was checked and found ALREADY covered - that half is what stops a proposal arriving a third time. It
also records two patterns no single incident makes visible: enforcement here is concentrated at commit
and merge time while the failures concentrated in claims made in chat, and a rule that lands only in
an unmerged PR does not bind with nothing able to tell you.

**The similarity engine cannot accept duplication that is correct.** Its only baseline is the base
branch computed live, so identical files are accepted or rejected by which side of a merge they sit
on: four existing ArchUnit wrappers pass at ~84% because they are not an increase, while the three
identical ones this PR adds fail at 84.3%. Filed as `bug`/`misdirection` rather than a task, because a
check whose verdict depends on merge timing rather than on the code is an instrument that misreports.
The note records why all four obvious workarounds are wrong - including that making the check advisory
would downgrade an engine with a demonstrated catch - and names the better fix: an accepted-pairs
baseline rather than a path ignore, so a NEW pair between the same files still fails.
astubbs added a commit that referenced this pull request Aug 25, 2026
…he route that caused it

The previous commit filed the `Chaos Pain Suite` red on this branch as the runner-load kill class:
logs apparently stopping dead 54 seconds in, no `BUILD FAILURE`, no `Tests run:`, no `##[error]`.
Every one of those observations was an artefact of the fetch. `gh run view --job <id> --log` returned
990 lines of a ~5000-line log, cut inside a PASSING test and then appended the post-job steps - so
the file ended with a cleanup step and passed the completeness check.

What actually happened, from the failsafe XML in the uploaded artifact: eight chaos ITs green,
`ChaosChurnStormIT.churnStormMeetsSlosAndBalancesLedger` red at 224.7s on probe violations, seed
`7852140587594987229` recoverable. Recorded as the fourteenth sighting in `bug-857-family.md`, where
it is worth more than a tally mark: at t=+154670ms it tripped
`INSTANCE_STALL/NO_WORK_COMPLETED` - instance 70 holding 43 records out for processing and completing
none - which is the first firing of the detector #325 added, and which the thirteenth sighting
recorded as having produced zero findings. The 23 violations the autopsy lists are all the
`CLASS2_STALL` timing bound that `test-class2-probe-asserts-timing-not-correctness.md` already says
is not a correctness verdict, so reading only the autopsy list would have filed this as another tally.

THIS IS THE THIRD RECORDED INSTANCE of `gh-run-view-log-truncation.md`, and the first where the
reader was routed into it by the topic doc. That write-up's own Related section had named the fix -
`docs/ci.md` documented the job-level API route alone, with no completeness warning - and it had sat
undone since 2026-08-18. So `docs/ci.md` now leads with the artifact and archive-zip routes, names
both ways the job-level call misleads (silent truncation; exit 1 writing zero bytes with the reason
on stderr, which a `>` redirect discards), and carries the check that a grep returning zero on a
truncated log is a false negative shaped exactly like a clean run.

One refinement the incident adds to the write-up: its terminal-marker check is not sufficient as
stated. This log DID end with a cleanup step - the marker has to belong to the step being diagnosed,
not merely to the job.

The false entry in `ci-disabled-jobs-and-runner-load.md` is replaced by a short warning, because the
signature that entry describes and a truncated log are indistinguishable by the absence of
`Tests run:` - which is exactly how this went wrong.
astubbs added a commit that referenced this pull request Aug 25, 2026
…ed-dependence observed directly

`Chaos Pain Suite` went red again on the next push, and diagnosing it artifact-first this time took a
minute rather than an hour: `ChaosRevokeUnderWorkIT.revokeUnderWorkStaysProtocolHonest`, the eager
arm, 17 violations all `CLASS2_STALL/LAG_STAGNATION`, seed `567232329738342203`, both cooperative
arms green.

The pair is worth more than either red. Two runs on the same tree, minutes apart, failed DIFFERENT
tests on DIFFERENT seeds while the branch changes no product code - agent hooks, shell gates and
documentation only. This ledger has asserted seed-dependence since its second sighting by reasoning
from other branches passing on the same day; here it is the same branch twice, which is the stronger
form of the same observation.

It also constrains the fourteenth sighting rather than merely following it: this run produced zero
`INSTANCE_STALL`, so #325's detector is not firing on every chaos run - which is what an
over-eager new detector would look like, and is the concern the thirteenth sighting raised.
astubbs added a commit that referenced this pull request Aug 25, 2026
…PRs merged five days ago

`pr-323-docs-outstanding.md` and `pr-324-tooling-outstanding.md` each ended with that instruction.
#323 and #324 both merged on 2026-08-20, so master has been carrying two notes that
describe closed work as open - the exact residue `docs/inflight/AGENTS.md` forbids: "Never leave a
'delete this when #NN merges' marker on master. The merge is exactly when nobody is looking here."
Repaired the way that doc prescribes - shrink to what survives, rename to an area prefix - never
rewritten into an accurate past tense.

EVERY SURVIVING ITEM WAS RE-VERIFIED RATHER THAN CARRIED, and that is what removed most of them. A
finding nobody re-checks is how a stale claim gets a second life, which is the failure this whole
exercise is about.

Discharged, so deleted rather than moved:

- #324's first item - `bin/test-check-agent-hooks.sh` asserting against the **live**
  `docs/inflight/` corpus instead of a fixture. Already fixed: the grouping and ordering cases build
  `mktemp` fixture trees (`$class_tmp/docs/inflight/...`, `$pos_tmp/docs/inflight/...`), and the two
  cases that still write into the live directory create the note they assert on and remove it. The
  only other mention is a comment.
- Both "Already fixed" sections, #323's "Closed: the session-index window", and #324's
  "Ordering" - with both PRs merged, a merge protocol is history, not state.
- #323's observation that `STRATEGY.md` repeats two incidents `docs/compound-engineering.md`
  owns. It was recorded as *left alone deliberately*; a decision not to act is not open work, and
  keeping it invites someone to re-litigate a settled call.

Still open, relocated to where the fact belongs:

- **The five stranded commit bodies get their own note**,
  `branch-agent-hook-commit-bodies-only-on-backup.md` - `branch-` because that is work sitting on a
  branch with no PR. `origin/backup/pre-split-322` and all five SHAs resolve; their content is on
  master but their bodies are not, and the note records that the claim a reconciliation commit names
  them is false. `pr-322-split-plan.md` stated the same thing WITH that false claim, so it now
  points at the owner instead of repeating it.
- **`docs/quarantined-tests.md`'s overstatement is corrected in place, not tracked.** It said the
  owner-granted exception "had become the routine path" against a record of exactly one. The rule
  change stands on its own evidence, so the sentence now says what the record supports - the old
  rule's only escape hatch was an owner grant, leaving a contributor no path on the evidence they
  had. Do not track what you can correct.
- **The two "unverifiable as written" observations moved INSIDE the notes they are about**, rather
  than into a third note tracking other notes' defects: the PCMetrics figures are marked as one
  run's log never re-derived locally, and the stale-arrival guard's unnamed third NPEing fixture now
  says plainly that recovering it means re-running the prototype. A caveat a reader meets while
  reading the claim beats one filed elsewhere.
- **The merge ordering (323, 324, 325, 57, 322, 267, 29 - first three merged, so 57, 322, 267, 29
  remain) moved to `pr-blockers-and-collisions.md`**, which owns standing coordination facts, and
  `bug-shared-collections-across-the-poll-boundary.md` was repointed there. That citation is why
  deletion alone would have been wrong: a note can hold the last copy of a fact nobody filed
  anywhere else.

`pr-322-split-plan.md` survives - #322 is still open - but carried the same defect in
miniature: instructions conditioned on merges that have happened, including a rename obligation on
#325, which merged and whose two notes now carry `test-` prefixes. Those are gone and the
table records #324's merge.

Prior art, and the collision: #357 carries `4cc87c8ee`, which does this same
cleanup. It is BLOCKED behind #354, so the lying notes would sit on master
until that clears. This lands the same relocation with two differences its author should keep: the
caveats go inside their owner notes rather than into a `docs-claims-...` note about other notes, and
the quarantine sentence is fixed rather than filed.

Gates run locally: check-inflight-tags (91 notes valid), check-file-refs, check-issue-refs,
check-branch-self-reference (branch and PR 348), check-quarantine-registry, and the
.claude/hooks self-test suite.
astubbs added a commit that referenced this pull request Aug 25, 2026
…PRs merged five days ago

`pr-323-docs-outstanding.md` and `pr-324-tooling-outstanding.md` each ended with that instruction.
#323 and #324 both merged on 2026-08-20, so master has been carrying two notes that
describe closed work as open - the exact residue `docs/inflight/AGENTS.md` forbids: "Never leave a
'delete this when #NN merges' marker on master. The merge is exactly when nobody is looking here."
Repaired the way that doc prescribes - shrink to what survives, rename to an area prefix - never
rewritten into an accurate past tense.

EVERY SURVIVING ITEM WAS RE-VERIFIED RATHER THAN CARRIED, and that is what removed most of them. A
finding nobody re-checks is how a stale claim gets a second life, which is the failure this whole
exercise is about.

Discharged, so deleted rather than moved:

- #324's first item - `bin/test-check-agent-hooks.sh` asserting against the **live**
  `docs/inflight/` corpus instead of a fixture. Already fixed: the grouping and ordering cases build
  `mktemp` fixture trees (`$class_tmp/docs/inflight/...`, `$pos_tmp/docs/inflight/...`), and the two
  cases that still write into the live directory create the note they assert on and remove it. The
  only other mention is a comment.
- Both "Already fixed" sections, #323's "Closed: the session-index window", and #324's
  "Ordering" - with both PRs merged, a merge protocol is history, not state.
- #323's observation that `STRATEGY.md` repeats two incidents `docs/compound-engineering.md`
  owns. It was recorded as *left alone deliberately*; a decision not to act is not open work, and
  keeping it invites someone to re-litigate a settled call.

Still open, relocated to where the fact belongs:

- **The five stranded commit bodies get their own note**,
  `branch-agent-hook-commit-bodies-only-on-backup.md` - `branch-` because that is work sitting on a
  branch with no PR. `origin/backup/pre-split-322` and all five SHAs resolve; their content is on
  master but their bodies are not, and the note records that the claim a reconciliation commit names
  them is false. `pr-322-split-plan.md` stated the same thing WITH that false claim, so it now
  points at the owner instead of repeating it.
- **`docs/quarantined-tests.md`'s overstatement is corrected in place, not tracked.** It said the
  owner-granted exception "had become the routine path" against a record of exactly one. The rule
  change stands on its own evidence, so the sentence now says what the record supports - the old
  rule's only escape hatch was an owner grant, leaving a contributor no path on the evidence they
  had. Do not track what you can correct.
- **The two "unverifiable as written" observations moved INSIDE the notes they are about**, rather
  than into a third note tracking other notes' defects: the PCMetrics figures are marked as one
  run's log never re-derived locally, and the stale-arrival guard's unnamed third NPEing fixture now
  says plainly that recovering it means re-running the prototype. A caveat a reader meets while
  reading the claim beats one filed elsewhere.
- **The merge ordering (323, 324, 325, 57, 322, 267, 29 - first three merged, so 57, 322, 267, 29
  remain) moved to `pr-blockers-and-collisions.md`**, which owns standing coordination facts, and
  `bug-shared-collections-across-the-poll-boundary.md` was repointed there. That citation is why
  deletion alone would have been wrong: a note can hold the last copy of a fact nobody filed
  anywhere else.

`pr-322-split-plan.md` survives - #322 is still open - but carried the same defect in
miniature: instructions conditioned on merges that have happened, including a rename obligation on
#325, which merged and whose two notes now carry `test-` prefixes. Those are gone and the
table records #324's merge.

Prior art, and the collision: #357 carries `4cc87c8ee`, which does this same
cleanup. It is BLOCKED behind #354, so the lying notes would sit on master
until that clears. This lands the same relocation with two differences its author should keep: the
caveats go inside their owner notes rather than into a `docs-claims-...` note about other notes, and
the quarantine sentence is fixed rather than filed.

Gates run locally: check-inflight-tags (91 notes valid), check-file-refs, check-issue-refs,
check-branch-self-reference (branch and PR 348), check-quarantine-registry, and the
.claude/hooks self-test suite.
astubbs added a commit that referenced this pull request Aug 25, 2026
…PRs merged five days ago

`pr-323-docs-outstanding.md` and `pr-324-tooling-outstanding.md` each ended with that instruction.
#323 and #324 both merged on 2026-08-20, so master has been carrying two notes that
describe closed work as open - the exact residue `docs/inflight/AGENTS.md` forbids: "Never leave a
'delete this when #NN merges' marker on master. The merge is exactly when nobody is looking here."
Repaired the way that doc prescribes - shrink to what survives, rename to an area prefix - never
rewritten into an accurate past tense.

EVERY SURVIVING ITEM WAS RE-VERIFIED RATHER THAN CARRIED, and that is what removed most of them. A
finding nobody re-checks is how a stale claim gets a second life, which is the failure this whole
exercise is about.

Discharged, so deleted rather than moved:

- #324's first item - `bin/test-check-agent-hooks.sh` asserting against the **live**
  `docs/inflight/` corpus instead of a fixture. Already fixed: the grouping and ordering cases build
  `mktemp` fixture trees (`$class_tmp/docs/inflight/...`, `$pos_tmp/docs/inflight/...`), and the two
  cases that still write into the live directory create the note they assert on and remove it. The
  only other mention is a comment.
- Both "Already fixed" sections, #323's "Closed: the session-index window", and #324's
  "Ordering" - with both PRs merged, a merge protocol is history, not state.
- #323's observation that `STRATEGY.md` repeats two incidents `docs/compound-engineering.md`
  owns. It was recorded as *left alone deliberately*; a decision not to act is not open work, and
  keeping it invites someone to re-litigate a settled call.

Still open, relocated to where the fact belongs:

- **The five stranded commit bodies get their own note**,
  `branch-agent-hook-commit-bodies-only-on-backup.md` - `branch-` because that is work sitting on a
  branch with no PR. `origin/backup/pre-split-322` and all five SHAs resolve; their content is on
  master but their bodies are not, and the note records that the claim a reconciliation commit names
  them is false. `pr-322-split-plan.md` stated the same thing WITH that false claim, so it now
  points at the owner instead of repeating it.
- **`docs/quarantined-tests.md`'s overstatement is corrected in place, not tracked.** It said the
  owner-granted exception "had become the routine path" against a record of exactly one. The rule
  change stands on its own evidence, so the sentence now says what the record supports - the old
  rule's only escape hatch was an owner grant, leaving a contributor no path on the evidence they
  had. Do not track what you can correct.
- **The two "unverifiable as written" observations moved INSIDE the notes they are about**, rather
  than into a third note tracking other notes' defects: the PCMetrics figures are marked as one
  run's log never re-derived locally, and the stale-arrival guard's unnamed third NPEing fixture now
  says plainly that recovering it means re-running the prototype. A caveat a reader meets while
  reading the claim beats one filed elsewhere.
- **The merge ordering (323, 324, 325, 57, 322, 267, 29 - first three merged, so 57, 322, 267, 29
  remain) moved to `pr-blockers-and-collisions.md`**, which owns standing coordination facts, and
  `bug-shared-collections-across-the-poll-boundary.md` was repointed there. That citation is why
  deletion alone would have been wrong: a note can hold the last copy of a fact nobody filed
  anywhere else.

`pr-322-split-plan.md` survives - #322 is still open - but carried the same defect in
miniature: instructions conditioned on merges that have happened, including a rename obligation on
#325, which merged and whose two notes now carry `test-` prefixes. Those are gone and the
table records #324's merge.

Prior art, and the collision: #357 carries `4cc87c8ee`, which does this same
cleanup. It is BLOCKED behind #354, so the lying notes would sit on master
until that clears. This lands the same relocation with two differences its author should keep: the
caveats go inside their owner notes rather than into a `docs-claims-...` note about other notes, and
the quarantine sentence is fixed rather than filed.

Gates run locally: check-inflight-tags (91 notes valid), check-file-refs, check-issue-refs,
check-branch-self-reference (branch and PR 348), check-quarantine-registry, and the
.claude/hooks self-test suite.
astubbs added a commit that referenced this pull request Aug 25, 2026
…PRs merged five days ago

`pr-323-docs-outstanding.md` and `pr-324-tooling-outstanding.md` each ended with that instruction.
#323 and #324 both merged on 2026-08-20, so master has been carrying two notes that
describe closed work as open - the exact residue `docs/inflight/AGENTS.md` forbids: "Never leave a
'delete this when #NN merges' marker on master. The merge is exactly when nobody is looking here."
Repaired the way that doc prescribes - shrink to what survives, rename to an area prefix - never
rewritten into an accurate past tense.

EVERY SURVIVING ITEM WAS RE-VERIFIED RATHER THAN CARRIED, and that is what removed most of them. A
finding nobody re-checks is how a stale claim gets a second life, which is the failure this whole
exercise is about.

Discharged, so deleted rather than moved:

- #324's first item - `bin/test-check-agent-hooks.sh` asserting against the **live**
  `docs/inflight/` corpus instead of a fixture. Already fixed: the grouping and ordering cases build
  `mktemp` fixture trees (`$class_tmp/docs/inflight/...`, `$pos_tmp/docs/inflight/...`), and the two
  cases that still write into the live directory create the note they assert on and remove it. The
  only other mention is a comment.
- Both "Already fixed" sections, #323's "Closed: the session-index window", and #324's
  "Ordering" - with both PRs merged, a merge protocol is history, not state.
- #323's observation that `STRATEGY.md` repeats two incidents `docs/compound-engineering.md`
  owns. It was recorded as *left alone deliberately*; a decision not to act is not open work, and
  keeping it invites someone to re-litigate a settled call.

Still open, relocated to where the fact belongs:

- **The five stranded commit bodies get their own note**,
  `branch-agent-hook-commit-bodies-only-on-backup.md` - `branch-` because that is work sitting on a
  branch with no PR. `origin/backup/pre-split-322` and all five SHAs resolve; their content is on
  master but their bodies are not, and the note records that the claim a reconciliation commit names
  them is false. `pr-322-split-plan.md` stated the same thing WITH that false claim, so it now
  points at the owner instead of repeating it.
- **`docs/quarantined-tests.md`'s overstatement is corrected in place, not tracked.** It said the
  owner-granted exception "had become the routine path" against a record of exactly one. The rule
  change stands on its own evidence, so the sentence now says what the record supports - the old
  rule's only escape hatch was an owner grant, leaving a contributor no path on the evidence they
  had. Do not track what you can correct.
- **The two "unverifiable as written" observations moved INSIDE the notes they are about**, rather
  than into a third note tracking other notes' defects: the PCMetrics figures are marked as one
  run's log never re-derived locally, and the stale-arrival guard's unnamed third NPEing fixture now
  says plainly that recovering it means re-running the prototype. A caveat a reader meets while
  reading the claim beats one filed elsewhere.
- **The merge ordering (323, 324, 325, 57, 322, 267, 29 - first three merged, so 57, 322, 267, 29
  remain) moved to `pr-blockers-and-collisions.md`**, which owns standing coordination facts, and
  `bug-shared-collections-across-the-poll-boundary.md` was repointed there. That citation is why
  deletion alone would have been wrong: a note can hold the last copy of a fact nobody filed
  anywhere else.

`pr-322-split-plan.md` survives - #322 is still open - but carried the same defect in
miniature: instructions conditioned on merges that have happened, including a rename obligation on
#325, which merged and whose two notes now carry `test-` prefixes. Those are gone and the
table records #324's merge.

Prior art, and the collision: #357 carries `4cc87c8ee`, which does this same
cleanup. It is BLOCKED behind #354, so the lying notes would sit on master
until that clears. This lands the same relocation with two differences its author should keep: the
caveats go inside their owner notes rather than into a `docs-claims-...` note about other notes, and
the quarantine sentence is fixed rather than filed.

Gates run locally: check-inflight-tags (91 notes valid), check-file-refs, check-issue-refs,
check-branch-self-reference (branch and PR 348), check-quarantine-registry, and the
.claude/hooks self-test suite.

Also here, same class one file over: #347's Lincheck note called
`test/jcstress-poc-plain-long-visibility` "the branch carrying" the jcstress
half. True while this PR was open, false the moment it merges - so both mentions
now name the `jcstress-poc` module, which is a thing a future reader can go and
look at.

That one is worth a note about the gate rather than just a fix.
`bin/check-branch-self-reference.sh` catches a note naming its OWN branch, and
it only caught this because this PR is the one under test. On #347 those
two lines named a sibling's branch and passed - so the window between two merges
is exactly where a sibling-branch reference lands unchallenged.
astubbs added a commit that referenced this pull request Aug 25, 2026
…PRs merged five days ago

`pr-323-docs-outstanding.md` and `pr-324-tooling-outstanding.md` each ended with that instruction.
#323 and #324 both merged on 2026-08-20, so master has been carrying two notes that
describe closed work as open - the exact residue `docs/inflight/AGENTS.md` forbids: "Never leave a
'delete this when #NN merges' marker on master. The merge is exactly when nobody is looking here."
Repaired the way that doc prescribes - shrink to what survives, rename to an area prefix - never
rewritten into an accurate past tense.

EVERY SURVIVING ITEM WAS RE-VERIFIED RATHER THAN CARRIED, and that is what removed most of them. A
finding nobody re-checks is how a stale claim gets a second life, which is the failure this whole
exercise is about.

Discharged, so deleted rather than moved:

- #324's first item - `bin/test-check-agent-hooks.sh` asserting against the **live**
  `docs/inflight/` corpus instead of a fixture. Already fixed: the grouping and ordering cases build
  `mktemp` fixture trees (`$class_tmp/docs/inflight/...`, `$pos_tmp/docs/inflight/...`), and the two
  cases that still write into the live directory create the note they assert on and remove it. The
  only other mention is a comment.
- Both "Already fixed" sections, #323's "Closed: the session-index window", and #324's
  "Ordering" - with both PRs merged, a merge protocol is history, not state.
- #323's observation that `STRATEGY.md` repeats two incidents `docs/compound-engineering.md`
  owns. It was recorded as *left alone deliberately*; a decision not to act is not open work, and
  keeping it invites someone to re-litigate a settled call.

Still open, relocated to where the fact belongs:

- **The five stranded commit bodies get their own note**,
  `branch-agent-hook-commit-bodies-only-on-backup.md` - `branch-` because that is work sitting on a
  branch with no PR. `origin/backup/pre-split-322` and all five SHAs resolve; their content is on
  master but their bodies are not, and the note records that the claim a reconciliation commit names
  them is false. `pr-322-split-plan.md` stated the same thing WITH that false claim, so it now
  points at the owner instead of repeating it.
- **`docs/quarantined-tests.md`'s overstatement is corrected in place, not tracked.** It said the
  owner-granted exception "had become the routine path" against a record of exactly one. The rule
  change stands on its own evidence, so the sentence now says what the record supports - the old
  rule's only escape hatch was an owner grant, leaving a contributor no path on the evidence they
  had. Do not track what you can correct.
- **The two "unverifiable as written" observations moved INSIDE the notes they are about**, rather
  than into a third note tracking other notes' defects: the PCMetrics figures are marked as one
  run's log never re-derived locally, and the stale-arrival guard's unnamed third NPEing fixture now
  says plainly that recovering it means re-running the prototype. A caveat a reader meets while
  reading the claim beats one filed elsewhere.
- **The merge ordering (323, 324, 325, 57, 322, 267, 29 - first three merged, so 57, 322, 267, 29
  remain) moved to `pr-blockers-and-collisions.md`**, which owns standing coordination facts, and
  `bug-shared-collections-across-the-poll-boundary.md` was repointed there. That citation is why
  deletion alone would have been wrong: a note can hold the last copy of a fact nobody filed
  anywhere else.

`pr-322-split-plan.md` survives - #322 is still open - but carried the same defect in
miniature: instructions conditioned on merges that have happened, including a rename obligation on
#325, which merged and whose two notes now carry `test-` prefixes. Those are gone and the
table records #324's merge.

Prior art, and the collision: #357 carries `4cc87c8ee`, which does this same
cleanup. It is BLOCKED behind #354, so the lying notes would sit on master
until that clears. This lands the same relocation with two differences its author should keep: the
caveats go inside their owner notes rather than into a `docs-claims-...` note about other notes, and
the quarantine sentence is fixed rather than filed.

Gates run locally: check-inflight-tags (91 notes valid), check-file-refs, check-issue-refs,
check-branch-self-reference (branch and PR 348), check-quarantine-registry, and the
.claude/hooks self-test suite.

Also here, same class one file over: #347's Lincheck note called
`test/jcstress-poc-plain-long-visibility` "the branch carrying" the jcstress
half. True while this PR was open, false the moment it merges - so both mentions
now name the `jcstress-poc` module, which is a thing a future reader can go and
look at.

That one is worth a note about the gate rather than just a fix.
`bin/check-branch-self-reference.sh` catches a note naming its OWN branch, and
it only caught this because this PR is the one under test. On #347 those
two lines named a sibling's branch and passed - so the window between two merges
is exactly where a sibling-branch reference lands unchallenged.
astubbs added a commit that referenced this pull request Aug 31, 2026
…d" section, and move what is settled below it

bin/check-pr-ready.sh reported this note as listing 96 outstanding items. It does not, and never
did: the gate counts every line starting with "- " or "**" above an "## Already fixed" heading,
and this note had no such heading, so all 722 lines of prose formatting counted. The real
outstanding list is the NEXT TASKS section, which has five entries.

The gate is not wrong to block - what it is actually saying is that nothing in this note can be
marked resolved, because there is nowhere for resolved material to go. So it now has somewhere.

MOVED, NOT DELETED. Five sections are settled and sit below the heading with their reasoning
intact, because the reasoning is what a later reader needs:

  * the merge-order decision, and the PCMetrics instruction - both resolved outright now that all
    six dependencies this note waited on have merged (#57, #267, #322,
    #323, #324, #325)
  * whether #119 closes with this PR - answered rather than in progress
  * what the PR is NOT, and the checked interaction with the shutdown/teardown race

The #119 section also loses its "Research in progress" title and its provisional hedge.
The inventory and merged-PR mapping were gathered, and the transactional revoke wait was
established as a separate defect in a commit mode this fix cannot reach - so the answer is no,
and closing that issue here would take the rest of the family with it. A section that reads
"provisional" long after it was settled is how a finished question gets re-asked.

The count above the heading drops accordingly, and what remains above it is genuinely open.
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