Skip to content

8.5.3: Remove duplicate accessors in message assembly#499

Merged
leynos merged 10 commits intomainfrom
add-deterministic-assertion-helpers-944fa3
Mar 20, 2026
Merged

8.5.3: Remove duplicate accessors in message assembly#499
leynos merged 10 commits intomainfrom
add-deterministic-assertion-helpers-944fa3

Conversation

@leynos
Copy link
Copy Markdown
Owner

@leynos leynos commented Mar 11, 2026

Summary

  • Remove duplicate accessors in message-assembly fixtures by introducing and using a shared reassembly surface under wireframe_testing::reassembly, consisting of two assertion families: MessageAssembly and FragmentReassembly.
  • Adds a new wireframe_testing::reassembly module providing deterministic snapshot-based assertion helpers for both fragment reassembly and message assembly, with tests and docs updates. Public API returns TestResult<()> to keep diagnostics deterministic and reusable across test styles.
  • Refactors fixtures and BDD steps to delegate to the shared reassembly helpers, reducing duplication and improving diagnostics.
  • No runtime behavior changes; this is a testkit surface expansion.

📎 Task: https://www.devboxer.com/task/f327967d-5397-451e-b59f-956abdef91a3

📎 Task: https://www.devboxer.com/task/b903119c-35cb-49fd-919d-9b3769ce8eb6

Changes (high level)

  • Introduce wireframe_testing::reassembly module with two assertion families: MessageAssembly and FragmentReassembly.
  • Refactor message assembly and fragment reassembly fixtures and BDD steps to use the new helpers.
  • Add integration tests and docs updates to reflect the new API.
  • Ensure all helpers return TestResult<()> for deterministic diagnostics.

Documentation updates

  • ADR note and user guide updated to describe the new public helper API.
  • wireframe-testing-crate.md updated to include the reassembly assertion surface.

Tests

  • Add focused rstest integration tests covering the new reassembly assertion helper APIs.
  • Update existing tests and BDD worlds to rely on the helper-backed assertions.

Quality gates

  • All changes are additive and focused on testkit surface; no runtime behaviour changes.
  • Documentation, tests, and design docs updated to reflect the new public API.

📎 Task: https://www.devboxer.com/task/d6a55b81-cb61-4a55-8e19-4488a3e44a00

…comes

Introduce a new public helper module in the wireframe_testing crate to provide deterministic assertion functions for fragment reassembly and message assembly outcomes. This addition enables downstream tests to cleanly verify incomplete assemblies, completed messages, specific errors (e.g., MessageTooLarge, SequenceMismatch), and cleanup side effects without bespoke pattern matching in each test fixture or integration test.

The helpers return non-panicking result types with stable, human-readable diagnostics, supporting both rstest functions and rstest-bdd step functions. The implementation keeps fragment reassembly and message assembly expectations distinct, avoiding a universal error enum, and uses typed expectations and snapshot structs rather than macros.

This change consolidates existing ad hoc reassembly assertions into a reusable API, documented via Rustdoc and user guides, and accompanied by new rstest and rstest-bdd coverage. It adheres to existing code structure constraints and maintains non-breaking additive changes.

Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
@sourcery-ai
Copy link
Copy Markdown
Contributor

sourcery-ai Bot commented Mar 11, 2026

Reviewer's Guide

Adds a new public wireframe_testing::reassembly module that centralizes deterministic, non-panicking assertion helpers for fragment reassembly and message assembly, then refactors existing BDD fixtures/steps and updates docs and roadmap to use this shared helper surface.

Sequence diagram for using reassembly snapshots in tests

sequenceDiagram
    actor Tester
    participant RootTest as root_test
    participant Fixture as fixture_or_world
    participant Reassembly as wireframe_testing_reassembly
    participant Wire as wireframe

    Tester->>RootTest: run()

    RootTest->>Wire: drive_message_assembly_and_reassembly()
    Wire-->>RootTest: state(last_result, completed, evicted, buffered)

    RootTest->>Fixture: update_world_state(state)
    Fixture-->>RootTest: world_with_state

    RootTest->>Fixture: build_message_snapshot()
    Fixture-->>RootTest: MessageAssemblySnapshot

    RootTest->>Reassembly: assert_message_assembly_completed_for_key(snapshot, key, expected_body)
    Reassembly->>Reassembly: inspect snapshot
    Reassembly-->>RootTest: TestResult

    alt assertion_ok
        RootTest-->>Tester: test passes
    else assertion_err
        RootTest-->>Tester: test fails with deterministic diagnostics
    end
Loading

Class diagram for wireframe_testing::reassembly helpers

classDiagram
    class MessageAssemblySnapshot {
        +last_result: Option<&Result<Option<AssembledMessage>,MessageAssemblyError>>
        +completed_messages: &[AssembledMessage]
        +evicted_keys: &[MessageKey]
        +buffered_count: usize
        +total_buffered_bytes: usize
        +new(last_result, completed_messages, evicted_keys, buffered_count, total_buffered_bytes) MessageAssemblySnapshot
    }

    class MessageAssemblyErrorExpectation {
        <<enum>>
        +SequenceMismatch(expected: FrameSequence, found: FrameSequence)
        +DuplicateFrame(key: MessageKey, sequence: FrameSequence)
        +MissingFirstFrame(key: MessageKey)
        +DuplicateFirstFrame(key: MessageKey)
        +MessageTooLarge(key: MessageKey)
        +ConnectionBudgetExceeded(key: MessageKey)
        +InFlightBudgetExceeded(key: MessageKey)
    }

    class FragmentReassemblySnapshot {
        +last_reassembled: Option<&ReassembledMessage>
        +last_error: Option<&ReassemblyError>
        +evicted_ids: &[MessageId]
        +buffered_messages: usize
        +new(last_reassembled, last_error, evicted_ids, buffered_messages) FragmentReassemblySnapshot
    }

    class FragmentReassemblyErrorExpectation {
        <<enum>>
        +MessageTooLarge(message_id: MessageId)
        +IndexMismatch
        +MessageMismatch
        +SeriesComplete
        +IndexOverflow
    }

    class ReassemblyModule {
        <<module>>
    }

    class TestResult {
        <<type_alias>>
        +Ok
        +Err
    }

    class AssembledMessage {
        +message_key() MessageKey
        +body() &[u8]
    }

    class MessageAssemblyError {
    }

    class MessageSeriesError {
    }

    class MessageKey {
    }

    class FrameSequence {
    }

    class ReassembledMessage {
        +payload() &[u8]
    }

    class ReassemblyError {
    }

    class FragmentError {
    }

    class MessageId {
        +get() u64
    }

    ReassemblyModule ..> MessageAssemblySnapshot
    ReassemblyModule ..> MessageAssemblyErrorExpectation
    ReassemblyModule ..> FragmentReassemblySnapshot
    ReassemblyModule ..> FragmentReassemblyErrorExpectation
    ReassemblyModule ..> TestResult

    MessageAssemblySnapshot --> AssembledMessage
    MessageAssemblySnapshot --> MessageAssemblyError
    MessageAssemblySnapshot --> MessageKey

    FragmentReassemblySnapshot --> ReassembledMessage
    FragmentReassemblySnapshot --> ReassemblyError
    FragmentReassemblySnapshot --> MessageId

    MessageAssemblyErrorExpectation --> MessageAssemblyError
    MessageAssemblyErrorExpectation --> MessageSeriesError
    MessageAssemblyErrorExpectation --> MessageKey
    MessageAssemblyErrorExpectation --> FrameSequence

    FragmentReassemblyErrorExpectation --> ReassemblyError
    ReassemblyError --> FragmentError
    FragmentReassemblyErrorExpectation --> MessageId
Loading

File-Level Changes

Change Details Files
Replace ad hoc message-assembly step assertions with fixture methods delegating to centralized reassembly helpers.
  • Remove generic assertion utilities and FrameId from the message_assembly BDD step module.
  • Add assertion methods on MessageAssemblyWorld that build a MessageAssemblySnapshot and call shared helpers for incomplete results, completed bodies, errors, buffered counts, and eviction.
  • Update all Then-steps to call the new MessageAssemblyWorld assertion methods and structured error expectations instead of bespoke checks.
tests/steps/message_assembly_steps.rs
tests/fixtures/message_assembly.rs
tests/steps/mod.rs
Refactor fragment reassembly fixture assertions to use shared snapshot-based helpers.
  • Introduce FragmentWorld::reassembly_snapshot to construct FragmentReassemblySnapshot from internal state.
  • Replace inline length/absence/error/buffer/eviction checks with calls to assert_fragment_reassembly_* helpers, using FragmentReassemblyErrorExpectation where needed.
  • Keep configuration and driver logic unchanged so only assertion behavior is centralized.
tests/fixtures/fragment/reassembly.rs
Introduce public snapshot-based assertion API in wireframe_testing::reassembly for message assembly and fragment reassembly.
  • Add MessageAssemblySnapshot, MessageAssemblyErrorExpectation, and helper functions (e.g., assert_message_assembly_incomplete/completed/error/buffered_count/evicted) that operate on snapshots and return TestResult.
  • Add FragmentReassemblySnapshot, FragmentReassemblyErrorExpectation, and helper functions (e.g., assert_fragment_reassembly_absent/completed_len/error/buffered_messages/evicted).
  • Expose the new module from wireframe_testing::lib and document non-panicking, typed, expectation-based design in Rustdoc comments.
wireframe_testing/src/reassembly/mod.rs
wireframe_testing/src/reassembly/message.rs
wireframe_testing/src/reassembly/message_error.rs
wireframe_testing/src/reassembly/fragment.rs
wireframe_testing/src/lib.rs
Add focused integration tests to validate the new reassembly helpers’ behavior and diagnostics.
  • Create tests that construct MessageAssemblySnapshot and FragmentReassemblySnapshot directly, asserting success paths for incomplete/completed/error/eviction scenarios.
  • Cover multiple MessageAssemblyErrorExpectation and FragmentReassemblyErrorExpectation variants via rstest parameterization.
  • Include a negative test that asserts error messages are descriptive when assertions fail.
tests/reassembly_assertion_helpers.rs
Update documentation and roadmap to describe and mark completion of the deterministic reassembly assertion helpers work.
  • Extend users-guide with sections detailing message-assembly and fragment-reassembly assertion helpers and example usage.
  • Update wireframe-testing crate docs to describe the new reassembly module, its snapshot/expectation design, and example patterns.
  • Add an implementation note to ADR-002, mark roadmap item 8.5.3 as done, and introduce an ExecPlan document capturing constraints, decisions, and validation steps.
docs/users-guide.md
docs/wireframe-testing-crate.md
docs/adr-002-streaming-requests-and-shared-message-assembly.md
docs/roadmap.md
docs/execplans/8-5-3-deterministic-reassembly-outcome-assertion-helpers.md

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Mar 11, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 5f9c7ae7-33cc-41b6-ba61-f711bbd383d1

📥 Commits

Reviewing files that changed from the base of the PR and between 33deaf2 and abf88dc.

📒 Files selected for processing (1)
  • wireframe_testing/src/reassembly/message.rs

Summary by CodeRabbit

Release Notes

  • New Features

    • Added deterministic, non-panicking assertion helpers for validating fragment reassembly and protocol message assembly test outcomes.
  • Documentation

    • Added comprehensive user guide section detailing assertion functionality for testing reassembly.
    • Added execution plan documentation for assertion helper implementation roadmap.
    • Updated architectural decision records and testing framework documentation.
  • Tests

    • Added integration tests validating assertion helpers across multiple reassembly scenarios.
    • Updated test fixtures to use assertion-driven testing approach.
    • Refactored BDD step definitions to leverage new assertion methods.

Walkthrough

Summarise addition of deterministic, non‑panicking reassembly assertion helpers: snapshot types, typed expectation enums, and TestResult‑returning assertion functions for fragment reassembly and message assembly; includes documentation, test fixtures, BDD step updates and new integration tests. (≤50 words)

Changes

Cohort / File(s) Summary
Documentation
docs/adr-002-streaming-requests-and-shared-message-assembly.md, docs/execplans/8-5-3-deterministic-reassembly-outcome-assertion-helpers.md, docs/roadmap.md, docs/users-guide.md, docs/wireframe-testing-crate.md
Add execution plan, user‑guide content, crate docs, examples and mark roadmap item 8.5.3 complete. Document intended usage of wireframe_testing::reassembly helpers.
Crate export
wireframe_testing/src/lib.rs
Export the new reassembly module from the crate root.
Reassembly assertion library
wireframe_testing/src/reassembly/mod.rs, wireframe_testing/src/reassembly/fragment.rs, wireframe_testing/src/reassembly/message.rs, wireframe_testing/src/reassembly/message_error.rs, wireframe_testing/src/reassembly/assert_helpers.rs
Introduce snapshot structs, typed error‑expectation enums and non‑panicking TestResult‑returning assertion helpers for fragments and messages; add shared helpers and error‑matching logic; public re‑exports.
Test fixtures refactor
tests/fixtures/fragment/reassembly.rs, tests/fixtures/message_assembly.rs
Replace bespoke state inspection with snapshot builders and calls to new assertion helpers; remove many direct accessors and expose assertion methods returning TestResult.
BDD steps and step exports
tests/steps/message_assembly_steps.rs, tests/steps/mod.rs
Remove local helper types and direct assertions; update Then steps to delegate to MessageAssemblyWorld assertion methods; remove FrameId re‑export.
Integration tests
tests/reassembly_assertion_helpers.rs
Add integration tests validating snapshot construction and each assertion helper across success and failure scenarios for message assembly and fragment reassembly.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

Snapshots hold the story true,
Expectations typed, assertions new,
Tests now speak in measured tone,
No panics thrown, results are shown,
Reassembly sings — evidence in view ✨

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarises the primary change: removing duplicate accessors in message assembly by introducing shared reassembly assertion helpers.
Description check ✅ Passed The description comprehensively relates to the changeset, explaining the introduction of wireframe_testing::reassembly, refactoring of fixtures and BDD steps, and documentation updates.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch add-deterministic-assertion-helpers-944fa3

Comment @coderabbitai help to get the list of available commands and usage tips.

codescene-delta-analysis[bot]

This comment was marked as outdated.

…outcomes

Introduce a new public `wireframe_testing::reassembly` module with non-panicking, deterministic assertion helpers
for both transport fragment reassembly and protocol message assembly. This includes:

- Snapshot types capturing state for assertion
- Typed expectation enums for errors
- Result-returning assertion functions for incomplete, completed, errored, buffered, and evicted conditions

Refactor existing test fixtures and BDD step definitions to use these helper APIs,
improving test reuse and diagnostic clarity. Documentation and roadmap updated accordingly.

These helpers return `TestResult` to integrate smoothly with `rstest` and `rstest-bdd` without panics.

Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
@leynos leynos changed the title 8.5.3: Add deterministic reassembly assertion helpers 8.5.3: Implement deterministic reassembly assertion helpers Mar 12, 2026
codescene-delta-analysis[bot]

This comment was marked as outdated.

@leynos
Copy link
Copy Markdown
Owner Author

leynos commented Mar 16, 2026

@coderabbitai Please suggest a fix for this issue and supply a prompt for an AI coding agent to enable it to apply the fix:

wireframe_testing/src/reassembly/message_error.rs

Comment on file

pub(super) fn matches_message_error(
    err: &MessageAssemblyError,
    expected: MessageAssemblyErrorExpectation,
) -> bool {
    match expected {
        MessageAssemblyErrorExpectation::SequenceMismatch { expected, found } => {
            matches!(
                err,
                MessageAssemblyError::Series(MessageSeriesError::SequenceMismatch {
                    expected: actual_expected,
                    found: actual_found,
                }) if *actual_expected == expected && *actual_found == found
            )
        }
        MessageAssemblyErrorExpectation::DuplicateFrame { key, sequence } => {
            matches!(
                err,
                MessageAssemblyError::Series(MessageSeriesError::DuplicateFrame {
                    key: actual_key,
                    sequence: actual_sequence,
                }) if *actual_key == key && *actual_sequence == sequence
            )
        }
        MessageAssemblyErrorExpectation::MissingFirstFrame { key } => {
            matches!(
                err,
                MessageAssemblyError::Series(MessageSeriesError::MissingFirstFrame {
                    key: actual_key,
                }) if *actual_key == key
            )
        }
        MessageAssemblyErrorExpectation::DuplicateFirstFrame { key } => {
            matches!(
                err,
                MessageAssemblyError::DuplicateFirstFrame { key: actual_key }
                    if *actual_key == key
            )
        }
        MessageAssemblyErrorExpectation::MessageTooLarge { key } => {
            matches!(
                err,
                MessageAssemblyError::MessageTooLarge { key: actual_key, .. }
                    if *actual_key == key
            )
        }
        MessageAssemblyErrorExpectation::ConnectionBudgetExceeded { key } => {
            matches!(
                err,
                MessageAssemblyError::ConnectionBudgetExceeded { key: actual_key, .. }
                    if *actual_key == key
            )
        }
        MessageAssemblyErrorExpectation::InFlightBudgetExceeded { key } => {
            matches!(
                err,
                MessageAssemblyError::InFlightBudgetExceeded { key: actual_key, .. }
                    if *actual_key == key
            )
        }
    }
}

❌ New issue: Complex Method
matches_message_error has a cyclomatic complexity of 11, threshold = 9

@leynos
Copy link
Copy Markdown
Owner Author

leynos commented Mar 16, 2026

@coderabbitai Please suggest a fix for this issue and supply a prompt for an AI coding agent to enable it to apply the fix:

wireframe_testing/src/reassembly/message.rs

Comment on file

pub fn assert_message_assembly_buffered_count(
    snapshot: MessageAssemblySnapshot<'_>,
    expected: usize,
) -> TestResult {
    if snapshot.buffered_count == expected {
        Ok(())
    } else {
        Err(format!(
            "expected buffered_count={expected}, got {}",
            snapshot.buffered_count
        )
        .into())
    }
}

❌ New issue: Code Duplication
The module contains 2 functions with similar structure: assert_message_assembly_buffered_count,assert_message_assembly_total_buffered_bytes

@coderabbitai

This comment was marked as resolved.

@coderabbitai

This comment was marked as resolved.

Reduce cyclomatic complexity of matches_message_error from 11 to 1 by
extracting each match arm body into a dedicated private helper function.
The main function now serves as a pure dispatch table, delegating to
seven new private helpers that each encapsulate a single error-matching
pattern.

No public APIs, use imports, or type definitions were changed. All
existing tests pass without modification.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
codescene-delta-analysis[bot]

This comment was marked as outdated.

@leynos
Copy link
Copy Markdown
Owner Author

leynos commented Mar 16, 2026

@coderabbitai Please suggest a fix for this issue and supply a prompt for an AI coding agent to enable it to apply the fix:

wireframe_testing/src/reassembly/message.rs

Comment on file

pub fn assert_message_assembly_buffered_count(
    snapshot: MessageAssemblySnapshot<'_>,
    expected: usize,
) -> TestResult {
    if snapshot.buffered_count == expected {
        Ok(())
    } else {
        Err(format!(
            "expected buffered_count={expected}, got {}",
            snapshot.buffered_count
        )
        .into())
    }
}

❌ New issue: Code Duplication
The module contains 2 functions with similar structure: assert_message_assembly_buffered_count,assert_message_assembly_total_buffered_bytes

@leynos
Copy link
Copy Markdown
Owner Author

leynos commented Mar 16, 2026

@coderabbitai Please suggest a fix for this issue and supply a prompt for an AI coding agent to enable it to apply the fix:

wireframe_testing/src/reassembly/message_error.rs

Comment on file

pub(super) fn matches_message_error(
    err: &MessageAssemblyError,
    expected: MessageAssemblyErrorExpectation,
) -> bool {
    match expected {
        MessageAssemblyErrorExpectation::SequenceMismatch { expected, found } => {
            matches!(
                err,
                MessageAssemblyError::Series(MessageSeriesError::SequenceMismatch {
                    expected: actual_expected,
                    found: actual_found,
                }) if *actual_expected == expected && *actual_found == found
            )
        }
        MessageAssemblyErrorExpectation::DuplicateFrame { key, sequence } => {
            matches!(
                err,
                MessageAssemblyError::Series(MessageSeriesError::DuplicateFrame {
                    key: actual_key,
                    sequence: actual_sequence,
                }) if *actual_key == key && *actual_sequence == sequence
            )
        }
        MessageAssemblyErrorExpectation::MissingFirstFrame { key } => {
            matches!(
                err,
                MessageAssemblyError::Series(MessageSeriesError::MissingFirstFrame {
                    key: actual_key,
                }) if *actual_key == key
            )
        }
        MessageAssemblyErrorExpectation::DuplicateFirstFrame { key } => {
            matches!(
                err,
                MessageAssemblyError::DuplicateFirstFrame { key: actual_key }
                    if *actual_key == key
            )
        }
        MessageAssemblyErrorExpectation::MessageTooLarge { key } => {
            matches!(
                err,
                MessageAssemblyError::MessageTooLarge { key: actual_key, .. }
                    if *actual_key == key
            )
        }
        MessageAssemblyErrorExpectation::ConnectionBudgetExceeded { key } => {
            matches!(
                err,
                MessageAssemblyError::ConnectionBudgetExceeded { key: actual_key, .. }
                    if *actual_key == key
            )
        }
        MessageAssemblyErrorExpectation::InFlightBudgetExceeded { key } => {
            matches!(
                err,
                MessageAssemblyError::InFlightBudgetExceeded { key: actual_key, .. }
                    if *actual_key == key
            )
        }
    }
}

❌ New issue: Complex Method
matches_message_error has a cyclomatic complexity of 11, threshold = 9

@coderabbitai

This comment was marked as resolved.

@leynos
Copy link
Copy Markdown
Owner Author

leynos commented Mar 16, 2026

@coderabbitai Please suggest a fix for this issue and supply a prompt for an AI coding agent to enable it to apply the fix:

Code Duplication

wireframe_testing/src/reassembly/message.rs:

What lead to degradation?

The module contains 2 functions with similar structure: assert_message_assembly_buffered_count,assert_message_assembly_total_buffered_bytes

Why does this problem occur?

Duplicated code often leads to code that's harder to change since the same logical change has to be done in multiple functions. More duplication gives lower code health.

How to fix it?

A certain degree of duplicated code might be acceptable. The problems start when it is the same behavior that is duplicated across the functions in the module, ie. a violation of the Don't Repeat Yourself (DRY) principle. DRY violations lead to code that is changed together in predictable patterns, which is both expensive and risky. DRY violations can be identified using CodeScene's X-Ray analysis to detect clusters of change coupled functions with high code similarity. Read More
Once you have identified the similarities across functions, look to extract and encapsulate the concept that varies into its own function(s). These shared abstractions can then be re-used, which minimizes the amount of duplication and simplifies change.

@coderabbitai

This comment was marked as resolved.

…rtions

Refactor assertion helper functions in message.rs to use a new
helper function `assert_usize_field`. This reduces code duplication and
improves clarity when asserting usize fields in tests.

Additionally, add the "metrics" dependency to Cargo.lock, presumably to
support metrics collection enhancements.

Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
@leynos leynos changed the title 8.5.3: Implement deterministic reassembly assertion helpers 8.5.3: Refactor reassembly assertions with deterministic helpers Mar 16, 2026
codescene-delta-analysis[bot]

This comment was marked as outdated.

@leynos
Copy link
Copy Markdown
Owner Author

leynos commented Mar 16, 2026

@coderabbitai Please suggest a fix for this issue and supply a prompt for an AI coding agent to enable it to apply the fix:

Code Duplication

wireframe_testing/src/reassembly/message.rs:

What lead to degradation?

The module contains 2 functions with similar structure: assert_message_assembly_buffered_count,assert_message_assembly_total_buffered_bytes

Why does this problem occur?

Duplicated code often leads to code that's harder to change since the same logical change has to be done in multiple functions. More duplication gives lower code health.

How to fix it?

A certain degree of duplicated code might be acceptable. The problems start when it is the same behavior that is duplicated across the functions in the module, ie. a violation of the Don't Repeat Yourself (DRY) principle. DRY violations lead to code that is changed together in predictable patterns, which is both expensive and risky. DRY violations can be identified using CodeScene's X-Ray analysis to detect clusters of change coupled functions with high code similarity. Read More
Once you have identified the similarities across functions, look to extract and encapsulate the concept that varies into its own function(s). These shared abstractions can then be re-used, which minimizes the amount of duplication and simplifies change.

@coderabbitai

This comment was marked as resolved.

@leynos
Copy link
Copy Markdown
Owner Author

leynos commented Mar 17, 2026

@coderabbitai Please suggest a fix for this issue and supply a prompt for an AI coding agent to enable it to apply the fix. Include the file and symbol names indicated in the issue at the head of your response.

Code Duplication

wireframe_testing/src/reassembly/message.rs:

What lead to degradation?

The module contains 2 functions with similar structure: assert_message_assembly_buffered_count,assert_message_assembly_total_buffered_bytes

Why does this problem occur?

Duplicated code often leads to code that's harder to change since the same logical change has to be done in multiple functions. More duplication gives lower code health.

How to fix it?

A certain degree of duplicated code might be acceptable. The problems start when it is the same behavior that is duplicated across the functions in the module, ie. a violation of the Don't Repeat Yourself (DRY) principle. DRY violations lead to code that is changed together in predictable patterns, which is both expensive and risky. DRY violations can be identified using CodeScene's X-Ray analysis to detect clusters of change coupled functions with high code similarity. Read More
Once you have identified the similarities across functions, look to extract and encapsulate the concept that varies into its own function(s). These shared abstractions can then be re-used, which minimizes the amount of duplication and simplifies change.

@coderabbitai

This comment was marked as resolved.

@leynos leynos changed the title 8.5.3: Refactor reassembly assertions with deterministic helpers 8.5.3: Introduce deterministic reassembly assertion helpers Mar 17, 2026
@leynos
Copy link
Copy Markdown
Owner Author

leynos commented Mar 17, 2026

@coderabbitai Please suggest a fix for this issue and supply a prompt for an AI coding agent to enable it to apply the fix. Include the file and symbol names indicated in the issue at the head of your response.

Code Duplication

wireframe_testing/src/reassembly/message.rs:

What lead to degradation?

The module contains 2 functions with similar structure: assert_message_assembly_buffered_count,assert_message_assembly_total_buffered_bytes

Why does this problem occur?

Duplicated code often leads to code that's harder to change since the same logical change has to be done in multiple functions. More duplication gives lower code health.

How to fix it?

A certain degree of duplicated code might be acceptable. The problems start when it is the same behavior that is duplicated across the functions in the module, ie. a violation of the Don't Repeat Yourself (DRY) principle. DRY violations lead to code that is changed together in predictable patterns, which is both expensive and risky. DRY violations can be identified using CodeScene's X-Ray analysis to detect clusters of change coupled functions with high code similarity. Read More
Once you have identified the similarities across functions, look to extract and encapsulate the concept that varies into its own function(s). These shared abstractions can then be re-used, which minimizes the amount of duplication and simplifies change.

@coderabbitai

This comment was marked as resolved.

@leynos
Copy link
Copy Markdown
Owner Author

leynos commented Mar 17, 2026

@coderabbitai As CodeScene is still reporting this concern, please supply a clear explanatory one to two paragraph markdown message I can paste into the CodeScene web ui's diagnostic suppression function so this diagnostic can be silenced.

Code Duplication

wireframe_testing/src/reassembly/message.rs:

What lead to degradation?

The module contains 2 functions with similar structure: assert_message_assembly_buffered_count,assert_message_assembly_total_buffered_bytes

Why does this problem occur?

Duplicated code often leads to code that's harder to change since the same logical change has to be done in multiple functions. More duplication gives lower code health.

How to fix it?

A certain degree of duplicated code might be acceptable. The problems start when it is the same behavior that is duplicated across the functions in the module, ie. a violation of the Don't Repeat Yourself (DRY) principle. DRY violations lead to code that is changed together in predictable patterns, which is both expensive and risky. DRY violations can be identified using CodeScene's X-Ray analysis to detect clusters of change coupled functions with high code similarity. Read More
Once you have identified the similarities across functions, look to extract and encapsulate the concept that varies into its own function(s). These shared abstractions can then be re-used, which minimizes the amount of duplication and simplifies change.

@leynos
Copy link
Copy Markdown
Owner Author

leynos commented Mar 18, 2026

@coderabbitai Have the following now been resolved?

Annul any requirements that violate the en-GB-oxendict spelling (-ize / -yse / -our) conventions (for example a request to replace "normalize" with "normalise" or "artefact" with "artifact"), or where the requirement unnecessarily increases cyclomatic complexity.

Please address the comments from this code review:

## Overall Comments
- In `FragmentWorld::assert_reassembly_over_limit` you re-pattern-match `ReassemblyError` just to recover the `message_id` before delegating to `assert_fragment_reassembly_error`; consider extending `FragmentReassemblyErrorExpectation` (e.g., a variant that doesn’t require a `MessageId`) or adding a helper that extracts the id, so fixtures stay thin and don’t duplicate low-level error matching.
- The various `describe_last_result` / `assert_usize_field`-style helpers in `reassembly::message` and the length/buffered-count checks in `reassembly::fragment` are structurally similar; you could factor out a small internal utility module for common formatting and equality checks to keep the assertion modules smaller and easier to maintain.

## Individual Comments

### Comment 1
<location path="tests/reassembly_assertion_helpers.rs" line_range="68-77" />
<code_context>
+        .expect("completed-for-key assertion should pass");
+}
+
+#[rstest]
+#[case(
+    MessageAssemblyError::Series(MessageSeriesError::SequenceMismatch {
+        expected: FrameSequence(2),
+        found: FrameSequence(3),
+    }),
+    MessageAssemblyErrorExpectation::SequenceMismatch {
+        expected: FrameSequence(2),
+        found: FrameSequence(3),
+    }
+)]
+#[case(
+    MessageAssemblyError::DuplicateFirstFrame {
+        key: MessageKey(4),
+    },
+    MessageAssemblyErrorExpectation::DuplicateFirstFrame {
+        key: MessageKey(4),
+    }
+)]
+#[case(
+    MessageAssemblyError::MessageTooLarge {
+        key: MessageKey(9),
+        attempted: 12,
+        limit: std::num::NonZeroUsize::MIN,
+    },
+    MessageAssemblyErrorExpectation::MessageTooLarge {
+        key: MessageKey(9),
+    }
+)]
+fn message_assertion_helpers_match_errors(
+    #[case] error: MessageAssemblyError,
+    #[case] expected: MessageAssemblyErrorExpectation,
</code_context>
<issue_to_address>
**suggestion (testing):** Add tests for all MessageAssemblyErrorExpectation variants to ensure matcher coverage

The `message_assertion_helpers_match_errors` rstest currently only covers `SequenceMismatch`, `DuplicateFirstFrame`, and `MessageTooLarge`, but `MessageAssemblyErrorExpectation` also has `MissingFirstFrame`, `DuplicateFrame`, `ConnectionBudgetExceeded`, and `InFlightBudgetExceeded`. Please add cases for these remaining variants (either here or in a new rstest) to fully exercise `matches_message_error` and protect against regressions if its logic changes.
</issue_to_address>

### Comment 2
<location path="tests/reassembly_assertion_helpers.rs" line_range="45-53" />
<code_context>
+}
+
+#[test]
+fn message_assertion_helpers_accept_incomplete_and_counts() {
+    let last_result = Ok(None);
+    let snapshot = MessageAssemblySnapshot::new(Some(&last_result), &[], &[], 1, 5);
+
+    assert_message_assembly_incomplete(snapshot).expect("incomplete assertion should pass");
+    assert_message_assembly_buffered_count(snapshot, 1)
+        .expect("buffered-count assertion should pass");
+}
</code_context>
<issue_to_address>
**suggestion (testing):** Exercise assert_message_assembly_total_buffered_bytes in the integration tests

This module exercises most public message-assembly helpers, but `assert_message_assembly_total_buffered_bytes` is never used. Since `total_buffered_bytes` is a dedicated field on the snapshot and part of the public API, please either extend this test to pass a non-zero value to `MessageAssemblySnapshot::new` and assert via that helper, or add a small dedicated test. This will cover the field wiring and the helper’s error message.

```suggestion
#[test]
fn message_assertion_helpers_accept_incomplete_and_counts() {
    let last_result = Ok(None);
    let snapshot = MessageAssemblySnapshot::new(Some(&last_result), &[], &[], 1, 5);

    assert_message_assembly_incomplete(snapshot).expect("incomplete assertion should pass");
    assert_message_assembly_buffered_count(snapshot, 1)
        .expect("buffered-count assertion should pass");
    assert_message_assembly_total_buffered_bytes(snapshot, 5)
        .expect("total-buffered-bytes assertion should pass");
}
```
</issue_to_address>

### Comment 3
<location path="tests/reassembly_assertion_helpers.rs" line_range="169-175" />
<code_context>
+    ),
+    FragmentReassemblyErrorExpectation::IndexMismatch
+)]
+fn fragment_assertion_helpers_match_errors(
+    #[case] error: wireframe::fragment::ReassemblyError,
+    #[case] expected: FragmentReassemblyErrorExpectation,
+) {
+    let snapshot = FragmentReassemblySnapshot::new(None, Some(&error), &[], 0);
+
+    assert_fragment_reassembly_error(snapshot, expected)
+        .expect("fragment error assertion should pass");
+}
</code_context>
<issue_to_address>
**suggestion (testing):** Consider adding negative-path tests for fragment assertion helpers to validate diagnostics

Right now fragment reassembly tests only cover success paths. Please add at least one failing-path test (e.g., with a mismatched `FragmentReassemblyErrorExpectation` or calling `assert_fragment_reassembly_completed_len` when `last_reassembled` is `None`) to exercise and lock in the error diagnostics from these helpers.

Suggested implementation:

```rust
)]

}

#[test]
fn fragment_assertion_helpers_fail_when_error_is_missing() {
    // Snapshot without any recorded fragment reassembly error.
    let snapshot = FragmentReassemblySnapshot::new(None, None, &[], 0);

    // Asking for a specific error expectation should fail and yield a diagnostic.
    let err = assert_fragment_reassembly_error(
        snapshot,
        FragmentReassemblyErrorExpectation::IndexMismatch,
    )
    .expect_err("fragment error assertion should fail when no error is present");

    let message = err.to_string();
    assert!(
        !message.is_empty(),
        "diagnostic message for missing fragment error should not be empty"
    );
    assert!(
        message.contains("error").unwrap_or(true),
        "diagnostic should mention an error condition, got: {message}"
    );
}

#[test]
fn fragment_assertion_helpers_fail_when_completed_len_missing() {
    // Snapshot without any last_reassembled result.
    let snapshot = FragmentReassemblySnapshot::new(None, None, &[], 0);

    let err = assert_fragment_reassembly_completed_len(snapshot, 1)
        .expect_err("completed_len assertion should fail when last_reassembled is None");

    let message = err.to_string();
    assert!(
        !message.is_empty(),
        "diagnostic message for missing completed length should not be empty"
    );
    // We don't rely on an exact wording, just that the message references the missing state.
    assert!(
        message.contains("last_reassembled")
            || message.contains("completed")
            || message.contains("len"),
        "diagnostic should reference missing completed/last_reassembled state, got: {message}"
    );
}

fn assembled_message(key: u64, body: &[u8]) -> AssembledMessage {

```

If your assertion helpers return a custom error type that does not implement `Display` or whose `to_string()` is not meaningful, you may want to:
1. Adjust the diagnostic checks to use `Debug` formatting (`format!("{err:?}")`) instead of `to_string()`.
2. If the helpers already produce well-defined diagnostic strings (e.g., via `thiserror`), you can tighten the `contains(...)` checks to assert on specific substrings that match your existing messages.
</issue_to_address>

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Mar 18, 2026

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
echo "=== tests/reassembly_assertion_helpers.rs ==="
cat tests/reassembly_assertion_helpers.rs 2>/dev/null || fd 'reassembly_assertion_helpers.rs' --exec cat {}

echo ""
echo "=== tests/fixtures/fragment/reassembly.rs ==="
fd 'reassembly.rs' tests/ --exec cat {}

echo ""
echo "=== wireframe_testing/src/reassembly/message.rs (private helpers section) ==="
fd 'message.rs' wireframe_testing/src/reassembly/ --exec cat {}

Length of output: 23029


@leynos: Yes, all five items are resolved in the current branch state.

# Issue Status
Overall 1 assert_reassembly_over_limit re-pattern-matching ReassemblyError to recover message_id ✅ Resolved — FragmentReassemblyErrorExpectation::MessageTooLargeAny variant added; the fixture delegates directly with no local pattern-match
Overall 2 Shared formatting/equality helpers duplicated across reassembly::message and reassembly::fragment ✅ Resolved — assert_usize_field and assert_body_eq extracted into a super::assert_helpers module and imported from there
Comment 1 message_assertion_helpers_match_errors missing cases for MissingFirstFrame, DuplicateFrame, ConnectionBudgetExceeded, InFlightBudgetExceeded ✅ Resolved — all four #[case] entries are present
Comment 2 assert_message_assembly_total_buffered_bytes not exercised in integration tests ✅ Resolved — message_assertion_helpers_accept_incomplete_and_counts now calls it with value 5
Comment 3 No negative-path tests for fragment assertion helpers ✅ Resolved — fragment_error_assertion_fails_when_no_error_present and fragment_completed_len_fails_when_no_message_reassembled added

No requirements were annulled: none of the original items introduced en-GB-oxendict violations or unnecessarily increased cyclomatic complexity.

…message assembly outcomes

- Added multiple new assertion methods to MessageAssemblyWorld for better test coverage:
  - assert_result_incomplete to check incomplete outcomes
  - assert_completed_body and assert_completed_body_for_key to verify completion with expected body
  - assert_buffered_count for checking buffered assemblies count
  - assert_error to verify expected message assembly errors
  - assert_evicted for checking evicted message keys
- Improved FragmentWorld reassembly snapshot handling, removing error returns by assuming defaults
- Minor documentation and code style fixes in docs and reassembly tests

These additions improve test expressiveness and enable deterministic assertions over message assembly and fragment reassembly states.

Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
codescene-delta-analysis[bot]

This comment was marked as outdated.

Replace `make markdownlint MDLINT=/root/.bun/bin/markdownlint-cli2` with
the canonical `make markdownlint` invocation in the validation section.
The MDLINT environment variable assignment was environment-specific and
not portable across different setups.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
codescene-delta-analysis[bot]

This comment was marked as outdated.

@leynos
Copy link
Copy Markdown
Owner Author

leynos commented Mar 18, 2026

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Mar 18, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docs/users-guide.md`:
- Around line 406-410: Update the documentation bullet for
assert_fragment_reassembly_error to enumerate all supported
FragmentReassemblyError variants rather than only “over-limit and ordering”;
specifically mention the full set from
wireframe_testing::reassembly::FragmentReassemblyErrorExpectation (e.g.,
OverLimit, Ordering, MessageMismatch, SeriesComplete, IndexOverflow) and briefly
state what each variant checks so the guide matches the public enum and test
expectations.

In `@tests/reassembly_assertion_helpers.rs`:
- Around line 190-218: The test only covers MessageTooLarge and IndexMismatch
but must exercise all public FragmentReassemblyErrorExpectation variants; extend
the rstest matrix in fragment_assertion_helpers_match_errors to include cases
for MessageTooLargeAny, MessageMismatch, SeriesComplete, and IndexOverflow by
constructing the corresponding wireframe::fragment::ReassemblyError variants and
their matching FragmentReassemblyErrorExpectation (e.g., MessageTooLargeAny,
MessageMismatch, SeriesComplete, IndexOverflow) and assert them with the
existing FragmentReassemblySnapshot::new(...) +
assert_fragment_reassembly_error(...) call so every public expectation in
wireframe_testing/src/reassembly/fragment.rs is covered.

In `@wireframe_testing/src/reassembly/fragment.rs`:
- Around line 90-117: The current helper
assert_fragment_reassembly_completed_len only checks payload length via
assert_usize_field and misses verifying actual bytes; add a new helper (e.g.,
assert_fragment_reassembly_completed_bytes or
assert_fragment_reassembly_completed_eq) that mirrors the existing function's
pattern: fetch snapshot.last_reassembled (as in
assert_fragment_reassembly_completed_len), return the same "no message
reassembled" error if None, then compare message.payload() byte-for-byte against
an expected &[u8] argument using the project's existing byte-comparison/assert
helper (or a new assert_bytes_field) and return TestResult; keep the
length-assert behavior or call it internally to preserve the length check and
use the same error/report style as other assertion helpers.

In `@wireframe_testing/src/reassembly/message.rs`:
- Around line 109-124: The helper assert_message_assembly_completed currently
unwraps snapshot.last_result to only check the message body via assert_body_eq;
update it so tests can also assert routing and metadata by returning or exposing
the full AssembledMessage (or providing accessors) instead of reducing it to
body-only: locate assert_message_assembly_completed and the matching helper at
146-165, change the match arm that binds Some(Ok(Some(message))) to return the
AssembledMessage (or add getters on MessageAssemblySnapshot to retrieve
AssembledMessage) and adjust callers to use message.routing() and
message.metadata() (or similar accessors) so downstream tests can perform
routing/metadata assertions while preserving the existing body assertion using
assert_body_eq.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: a4d5cb73-6c22-4975-b9df-edb84f9c9ef9

📥 Commits

Reviewing files that changed from the base of the PR and between 1724309 and 5970fb0.

📒 Files selected for processing (10)
  • docs/execplans/8-5-3-deterministic-reassembly-outcome-assertion-helpers.md
  • docs/users-guide.md
  • docs/wireframe-testing-crate.md
  • tests/fixtures/fragment/reassembly.rs
  • tests/fixtures/message_assembly.rs
  • tests/reassembly_assertion_helpers.rs
  • wireframe_testing/src/reassembly/assert_helpers.rs
  • wireframe_testing/src/reassembly/fragment.rs
  • wireframe_testing/src/reassembly/message.rs
  • wireframe_testing/src/reassembly/mod.rs

Comment thread docs/users-guide.md Outdated
Comment thread tests/reassembly_assertion_helpers.rs
Comment thread wireframe_testing/src/reassembly/fragment.rs
Comment thread wireframe_testing/src/reassembly/message.rs
…sage reassembly

Extend the wireframe_testing::reassembly API with additional helpers and
documentation improvements:

1. Document all FragmentReassemblyErrorExpectation variants in the user
   guide (MessageTooLarge, IndexMismatch, MessageMismatch, SeriesComplete,
   IndexOverflow).

2. Add comprehensive test coverage for all fragment error expectations,
   including MessageTooLargeAny, MessageMismatch, SeriesComplete, and
   IndexOverflow variants.

3. Add assert_fragment_reassembly_completed_bytes helper to verify
   reassembled payload bytes in addition to the existing length-only
   assertion.

4. Add MessageAssemblySnapshot::last_completed_message() accessor to
   enable tests to assert on routing and metadata fields of assembled
   messages, not just the body.

All changes maintain backward compatibility with existing APIs. Tests
pass and documentation is updated.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
codescene-delta-analysis[bot]

This comment was marked as outdated.

…sors for completed messages

- Introduce `assert_fragment_reassembly_completed_bytes` to verify exact payload content in fragment reassembly tests.
- Add `last_completed` and `completed_for_key` accessors on `MessageAssemblySnapshot` for easier retrieval of completed messages.
- Update existing assertions to leverage the new accessors for clarity and reuse.
- Enhance documentation for fragment reassembly error assertions to include more error variant coverage.

Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
codescene-delta-analysis[bot]

This comment was marked as outdated.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@wireframe_testing/src/reassembly/message.rs`:
- Around line 59-108: The two identical accessors last_completed_message and
last_completed on MessageAssemblySnapshot both return the same
Option<&AssembledMessage> by matching self.last_result; remove the duplication
by deleting one of the methods (prefer keeping the more idiomatic name) or make
last_completed_message delegate to last_completed (or vice versa) so only one
implementation exists; update any references to the removed name accordingly to
use the retained method.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 6f5a0e58-f1c3-458f-bf77-a6eb213b5cc3

📥 Commits

Reviewing files that changed from the base of the PR and between 5940bef and 33deaf2.

📒 Files selected for processing (4)
  • docs/users-guide.md
  • tests/reassembly_assertion_helpers.rs
  • wireframe_testing/src/reassembly/fragment.rs
  • wireframe_testing/src/reassembly/message.rs

Comment thread wireframe_testing/src/reassembly/message.rs Outdated
…geAssemblySnapshot

The last_completed_message method was removed to simplify the MessageAssemblySnapshot API and consolidate message extraction logic.

Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
@leynos leynos changed the title 8.5.3: Refactor reassembly assertions and add deterministic helpers 8.5.3: Remove duplicate accessors in message assembly Mar 18, 2026
@leynos
Copy link
Copy Markdown
Owner Author

leynos commented Mar 18, 2026

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Mar 18, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@leynos
Copy link
Copy Markdown
Owner Author

leynos commented Mar 20, 2026

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Mar 20, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@leynos
Copy link
Copy Markdown
Owner Author

leynos commented Mar 20, 2026

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Mar 20, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@leynos
Copy link
Copy Markdown
Owner Author

leynos commented Mar 20, 2026

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Mar 20, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@leynos leynos merged commit 317a3a4 into main Mar 20, 2026
6 checks passed
@leynos leynos deleted the add-deterministic-assertion-helpers-944fa3 branch March 20, 2026 23:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant