Centralize streaming inbound assertions; add ExecPlan doc and tests#501
Centralize streaming inbound assertions; add ExecPlan doc and tests#501
Conversation
…ion closure Add a comprehensive draft ExecPlan outlining the closing documentation phase for roadmap items 8.6.1 to 8.6.3. This new document audits existing materials, aligns multi-document claims, specifies constraints, risks, and test coverage gaps, and plans targeted edits and validation steps to finalize streaming request body documentation, MessageAssembler usage, and memory budgets guidance. It ensures consistency across design docs, user guide, tests, and enforcement of quality gates before marking roadmap items complete. Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
Reviewer's GuideAdds an ExecPlan documenting completion criteria for streaming requests documentation work, clarifies how streaming requests, MessageAssembler, and memory budgets interact in multiple docs and Rustdoc, and introduces a focused BDD suite plus fixtures for streaming inbound request bodies with centralized assertion helpers. Sequence diagram for inbound streaming request pipeline and budgetssequenceDiagram
actor Client
participant TransportCodec
participant FragmentAdapter
participant MessageAssembler
participant InboundPipeline
participant Handler
Client->>TransportCodec: send_request()
TransportCodec->>FragmentAdapter: decode_transport_frame()
FragmentAdapter-->>TransportCodec: reassembled_packet
TransportCodec->>MessageAssembler: deliver_protocol_packet()
MessageAssembler-->>InboundPipeline: assembled_message_or_stream()
InboundPipeline->>InboundPipeline: enforce_per_frame_budgets()
InboundPipeline->>InboundPipeline: apply_soft_pressure_at_80_percent()
InboundPipeline->>InboundPipeline: abort_on_hard_cap_exceeded()
alt Buffered_request
InboundPipeline->>Handler: handle(buffered_request)
else Streaming_request
InboundPipeline->>Handler: handle(RequestParts, RequestBodyStream)
end
Handler-->>Client: send_response()
Class diagram for streaming request test fixtures and centralized helpersclassDiagram
class StreamingRequestFixture {
+setup_inbound_stream()
+send_body_chunk(bytes)
+finish_request()
+assert_field_eq(field, expected, actual)
+classify_next_chunk(chunk) NextChunk
}
class NextChunk {
<<enumeration>>
+Metadata
+Body
+End
+Error
}
class StreamingRequestSteps {
+given_streaming_request_fixture(fixture StreamingRequestFixture)
+when_handler_consumes_body()
+then_chunks_arrive_in_order()
+then_backpressure_is_applied()
+then_errors_propagate_to_handler()
}
class StreamingRequestScenarios {
+streaming_body_happy_path()
+streaming_body_backpressure()
+streaming_body_error_propagation()
}
StreamingRequestSteps --> StreamingRequestFixture
StreamingRequestScenarios --> StreamingRequestFixture
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Run ID: 📒 Files selected for processing (2)
Summary by CodeRabbit
WalkthroughDocument the completion of streaming requests and shared message assembly: add an ExecPlan and update design docs, roadmap and user guide; extend builder doc-comments; introduce a BDD test suite (feature, fixtures, scenarios, steps) that exercises streaming request bodies. No runtime public API changes in this diff. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
participant Client
participant Transport as Transport/Codec
participant FragmentAdapter
participant MessageAssembler
participant Wireframe
participant Handler
Client->>Transport: send logical request (may fragment)
Transport->>FragmentAdapter: deliver transport packet(s)
FragmentAdapter->>MessageAssembler: reassembled transport frames
MessageAssembler->>Wireframe: classified frame (first/continuation) + body stream or buffered body
alt streaming path
Wireframe->>Handler: invoke handler with RequestParts + RequestBodyStream/StreamingBody
Handler->>Wireframe: consume stream (back-pressure applies against memory_budgets)
else buffered path
Wireframe->>Handler: invoke handler with buffered RequestParts and complete body
end
Note over MessageAssembler,Wireframe: memory_budgets enforce per-frame reject, soft-pressure (~80%), hard-cap abort (connection)
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
📝 Coding Plan
Comment |
…h memory budgets - Completed documentation updates for streaming request body APIs and message assembler integration. - Implement inbound streaming request bodies exposing RequestParts and RequestBodyStream or StreamingBody. - Enforce shared per-connection memory budgets with per-frame rejection, soft read pacing, and hard abort. - Added builder support for configuring memory budgets and message assembler hook. - Introduced comprehensive behavioural tests using rstest-bdd for back-pressure, error propagation, and AsyncRead adapter correctness. - Enhanced public API guidance ensuring protocol authors can adopt streaming incrementally and preserve ergonomic buffered requests. This allows handlers to consume large inbound payloads incrementally while preserving back-pressure and reliable error handling. Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
|
@coderabbitai Please suggest a fix for this issue and supply a prompt for an AI coding agent to enable it to apply the fix: tests/steps/streaming_request_steps.rs Comment on file fn then_last_stream_error_kind_is(
streaming_request_world: &mut StreamingRequestWorld,
kind: String,
) -> TestResult {
let kind = match parse_error_kind(&kind) {
Ok(kind) => kind,
Err(err) => return Err(err.into()),
};
streaming_request_world.assert_last_error_kind(kind)
}❌ New issue: Code Duplication |
|
@coderabbitai Please suggest a fix for this issue and supply a prompt for an AI coding agent to enable it to apply the fix: tests/fixtures/streaming_request.rs Comment on file pub fn assert_collected_body(&self, expected: &str) -> TestResult {
if self.collected_body == expected.as_bytes() {
return Ok(());
}
Err(format!(
"expected body {:?}, observed {:?}",
expected.as_bytes(),
self.collected_body
)
.into())
}❌ New issue: Code Duplication |
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
…pers Refactored tests fixtures and steps by introducing a common helper function `assert_field_eq` to simplify equality assertions and reduce repetition in error handling assertions. Also added `try_parse_error_kind` helper in test steps to clean up error kind parsing logic, improving readability and maintainability. Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
|
@coderabbitai Please suggest a fix for this issue and supply a prompt for an AI coding agent to enable it to apply the fix: tests/steps/streaming_request_steps.rs Comment on file //! Step definitions for streaming request body scenarios.
❌ New issue: String Heavy Function Arguments |
This comment was marked as resolved.
This comment was marked as resolved.
Introduce ErrorKindArg newtype that implements FromStr to allow concise capture of io::ErrorKind from Gherkin step strings via BDD macros. This removes manual parsing and unwrap logic from the streaming_request_steps test steps, improving clarity and type safety. Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
Changed assert_field_eq function to take referenced arguments and support ?Sized trait. This makes the function more flexible and prevents unnecessary cloning. Adapted calls accordingly in streaming_request.rs test fixture. Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
There was a problem hiding this comment.
Hey - I've found 4 issues
Prompt for AI Agents
Please address the comments from this code review:
## Individual Comments
### Comment 1
<location path="docs/execplans/8-6-1-update-documentation-for-streaming-requests.md" line_range="14-15" />
<code_context>
+
+Roadmap items `8.6.1` through `8.6.3` close the documentation phase for
+streaming request bodies, the generic `MessageAssembler` abstraction, and the
+standardized per-connection memory-budget model introduced by
+`docs/adr-002-streaming-requests-and-shared-message-assembly.md`.
+
+After this work, a protocol author or library consumer should be able to read
</code_context>
<issue_to_address>
**issue (bug_risk):** ADR path/filename looks inconsistent with existing ADR references and may be broken.
Other docs reference this ADR as `adr/0002-streaming-requests-and-shared-message-assembly.md`, but here it’s `docs/adr-002-...` (different directory and zero-padding). Please update this reference to match the existing ADR path and filename so the link resolves correctly.
</issue_to_address>
### Comment 2
<location path="docs/execplans/8-6-1-update-documentation-for-streaming-requests.md" line_range="585" />
<code_context>
+debt, stop before marking the roadmap item done and record the exact blocking
+files in `Decision Log`.
+
+## Artifacts and notes
+
+Key evidence gathered during planning:
+
+```plaintext
+- Existing docs already contain partial 8.6 content.
+- docs/users-guide.md already documents RequestParts, MessageAssembler, and MemoryBudgets.
+- tests/streaming_request.rs exists and uses rstest.
+- No tests/features/streaming_request.feature exists today.
+```
+
+Target new artefacts if the audit confirms the current gap:
+
+```plaintext
</code_context>
<issue_to_address>
**suggestion (typo):** Mixed use of “Artifacts” and “artefacts” is inconsistent with the stated en-GB spelling guideline.
The heading and body use different spellings (“Artifacts” vs “artefacts”). Given the en-GB-oxendict guideline, please standardise on one form (likely “artefacts”) in both places.
```suggestion
## Artefacts and notes
```
</issue_to_address>
### Comment 3
<location path="docs/execplans/8-6-1-update-documentation-for-streaming-requests.md" line_range="54" />
<code_context>
+ and public API examples needed to make the documented behaviour trustworthy.
+- Do not introduce new product behaviour merely to make the documents read
+ better. If documentation work exposes an implementation bug, fix only the
+ smallest issue required to align the code with ADR 0002 and document the
+ decision.
+- Preserve existing public API signatures unless a contradiction in the current
</code_context>
<issue_to_address>
**issue (review_instructions):** ADR is used here without first expanding it (for example as "Architecture Decision Record (ADR)").
To follow the acronym rule, expand ADR the first time it appears in the document, for example "Architecture Decision Record (ADR) 0002", and then use "ADR 0002" thereafter.
<details>
<summary>Review instructions:</summary>
**Path patterns:** `**/*.md`
**Instructions:**
Define uncommon acronyms on first use.
</details>
</issue_to_address>
### Comment 4
<location path="docs/execplans/8-6-1-update-documentation-for-streaming-requests.md" line_range="159" />
<code_context>
+- Observation: streaming request bodies currently have strong `rstest`
+ coverage in `tests/streaming_request.rs`, but there is no matching
+ behavioural suite under `tests/features/`. Impact: the implementation cannot
+ honestly claim both unit and behavioural validation for the inbound streaming
+ half of ADR 0002 until that BDD gap is closed.
+
</code_context>
<issue_to_address>
**issue (review_instructions):** BDD is referenced later as a "BDD gap" without first being defined (for example as "behaviour-driven development (BDD)").
When mentioning the "BDD gap", please expand BDD on its first occurrence in the document, such as "behaviour-driven development (BDD) gap", then use BDD on its own afterwards.
<details>
<summary>Review instructions:</summary>
**Path patterns:** `**/*.md`
**Instructions:**
Define uncommon acronyms on first use.
</details>
</issue_to_address>Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 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/execplans/8-6-1-update-documentation-for-streaming-requests.md`:
- Around line 15-16: The ADR path references use the incorrect filename
`docs/adr-002-streaming-requests-and-shared-message-assembly.md`; update all
occurrences of that string in this document to the canonical path
`docs/adr/0002-streaming-requests-and-shared-message-assembly.md` (fixing the
path at the three noted spots and any other matches) so links and audit commands
point to the ADR under docs/adr.
In `@tests/fixtures/streaming_request.rs`:
- Around line 129-136: In the async block inside
tests/fixtures/streaming_request.rs (the self.block_on(...) that uses
tokio::time::timeout(Duration::from_millis(timeout_ms), sender.send(...))),
replace the final .await.is_err() boolean collapse with an explicit match on the
timeout result so you can distinguish the three cases: return true only when the
timeout returns Err(_) (i.e., elapsed), return false when timeout yields
Ok(Ok(())) (successful send), and propagate/return an Err when timeout yields
Ok(Err(send_err)) (channel closed/send failure) so SendError is not treated as
back-pressure; use the unique symbols sender.send, tokio::time::timeout,
Duration::from_millis, and the surrounding block (the value assigned to blocked)
to locate where to implement the match.
🪄 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: 1c7f826e-c6dc-4702-a6cb-9b32ebb279b2
📒 Files selected for processing (15)
docs/execplans/8-6-1-update-documentation-for-streaming-requests.mddocs/generic-message-fragmentation-and-re-assembly-design.mddocs/multi-packet-and-streaming-responses-design.mddocs/roadmap.mddocs/the-road-to-wireframe-1-0-feature-set-philosophy-and-capability-maturity.mddocs/users-guide.mdsrc/app/builder/config.rssrc/app/builder/protocol.rstests/features/streaming_request.featuretests/fixtures/mod.rstests/fixtures/streaming_request.rstests/scenarios/mod.rstests/scenarios/streaming_request_scenarios.rstests/steps/mod.rstests/steps/streaming_request_steps.rs
…equests doc
Corrected typographical errors ('Artefacts') and expanded abbreviations ('ADR', 'BDD') to improve clarity and consistency in the documentation for streaming requests.
Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
There was a problem hiding this comment.
Actionable comments posted: 6
🤖 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/execplans/8-6-1-update-documentation-for-streaming-requests.md`:
- Line 533: Replace the verbose phrase "all of the following are true" with the
more concise "the following are true" in the sentence that currently reads
"Acceptance means all of the following are true" so the line becomes "Acceptance
means the following are true"; update the single occurrence in the documentation
file (same sentence) to keep phrasing concise.
- Line 571: Replace the US spelling "normalization" with the British
en-GB-oxendict spelling "normalisation" in the doc where the phrase
"normalization if harmless or restore only that unrelated file before" appears;
search for the exact token "normalization" in the content of
docs/execplans/8-6-1-update-documentation-for-streaming-requests.md and update
it to "normalisation" so the documentation conforms to en-GB-oxendict spelling
rules.
- Around line 398-400: Replace the semicolon-plus-conjunction in the sentence
containing "first; and" so it reads correctly (either change the semicolon to a
comma or remove the word "and" and keep the semicolon); locate the sentence in
the document text near the phrase "a new user can follow the guide without
needing to read the ADR first; and" and update it to "a new user can follow the
guide without needing to read the ADR first, and" (or "a new user can follow the
guide without needing to read the ADR first; any Rustdoc examples...") to remove
the semicolon-before-conjunction error.
- Line 341: Update the sentence that currently reads "must configure so the two
layers do not fight each other" by inserting a comma before "so" to form "must
configure, so the two layers do not fight each other"; locate this phrase in the
document (the line containing the exact text "must configure so the two layers
do not fight each other") and apply the punctuation fix.
- Around line 179-208: The five Decision log entries in the doc (the lines that
start "- Decision: ..." and end with "Date/Author: YYYY-MM-DD / Codex") are
missing terminal periods; update each entry so the trailing "Date/Author:
YYYY-MM-DD / Codex" becomes "Date/Author: YYYY-MM-DD / Codex." for all five
occurrences (the entries listing the roadmap phase decision, the rstest-bdd
suite decision, the docs update decision, the marking-done decision, and the
streaming-request behavioural gap decision).
- Around line 1-604: Reflow the overlong bulleted list items so each
continuation line is <=80 columns (specifically the bullets that quote filenames
and long phrases in the plan's audit/observations/steps sections) by breaking
backtick-quoted filenames and long phrases across lines; also break the two
overlong bash commands ("set -o pipefail && timeout 300 make markdownlint
MDLINT=/root/.bun/bin/markdownlint-cli2 2>&1 | tee /tmp/8-6-markdownlint.log"
and "set -o pipefail && timeout 300 make doctest-benchmark 2>&1 | tee
/tmp/8-6-doctest-benchmark.log") into multiple lines using backslash
continuations inside the bash code blocks so each line <=120 columns; after
editing, run make fmt to normalise formatting.
🪄 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: a905017d-00f0-4346-a085-78f237beb750
📒 Files selected for processing (1)
docs/execplans/8-6-1-update-documentation-for-streaming-requests.md
|
@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. |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: Length of output: 28277
No requirements should be annulled — all four are consistent with en-GB-oxendict spelling and none increases cyclomatic complexity. Comment 1 remains open. The file still uses Diff: -`docs/adr-002-streaming-requests-and-shared-message-assembly.md`.
+`adr/0002-streaming-requests-and-shared-message-assembly.md`.Apply the same substitution to every remaining occurrence in the file. |
|
@coderabbitai the file is named |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: Length of output: 279
Updated status:
All four comments are resolved. |
… backpressure states accurately - Improved backpressure detection logic in `send_chunk_with_timeout` by differentiating the timeout, successful send, and channel error cases. - Enhanced handling ensures clearer indication of whether send is blocked due to backpressure or channel error. - Minor editorial fixes in documentation for clarity and style without changing meaning. Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
There was a problem hiding this comment.
Actionable comments posted: 2
♻️ Duplicate comments (2)
docs/execplans/8-6-1-update-documentation-for-streaming-requests.md (2)
513-519:⚠️ Potential issue | 🟡 MinorSplit overlong gate commands in the bash block.
Fix Line 513 and Line 519 to keep each code-block line at or below 120
columns.🔧 Proposed fix
- set -o pipefail && timeout 300 make markdownlint MDLINT=/root/.bun/bin/markdownlint-cli2 2>&1 | tee /tmp/8-6-markdownlint.log + set -o pipefail && timeout 300 make markdownlint \ + MDLINT=/root/.bun/bin/markdownlint-cli2 2>&1 \ + | tee /tmp/8-6-markdownlint.log @@ - set -o pipefail && timeout 300 make doctest-benchmark 2>&1 | tee /tmp/8-6-doctest-benchmark.log + set -o pipefail && timeout 300 make doctest-benchmark 2>&1 \ + | tee /tmp/8-6-doctest-benchmark.logAs per coding guidelines, “Code blocks in Markdown must be wrapped at 120
columns.”🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/execplans/8-6-1-update-documentation-for-streaming-requests.md` around lines 513 - 519, Split the two overlong bash lines so no code-block line exceeds 120 columns: for the line starting with "set -o pipefail && timeout 300 make markdownlint MDLINT=/root/.bun/bin/markdownlint-cli2 2>&1 | tee /tmp/8-6-markdownlint.log" break after "make markdownlint" and move the MDLINT=... and the pipe to tee onto subsequent indented lines using backslashes; similarly for the line starting with "set -o pipefail && timeout 300 make doctest-benchmark 2>&1 | tee /tmp/8-6-doctest-benchmark.log" break before the "|" and place the pipe on the next indented line with a trailing backslash to keep each physical line <= 120 chars.
570-572:⚠️ Potential issue | 🟡 MinorUse en-GB spelling:
normalisation.Replace
normalizationat Line 571 withnormalisation.🇬🇧 Proposed fix
-3. if `make fmt` rewrote an unrelated document, either keep the clean - normalization if harmless or restore only that unrelated file before +3. if `make fmt` rewrote an unrelated document, either keep the clean + normalisation if harmless or restore only that unrelated file before continuing.As per coding guidelines, “Documentation must use en-GB-oxendict spelling and
grammar.”🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/execplans/8-6-1-update-documentation-for-streaming-requests.md` around lines 570 - 572, Replace the American spelling "normalization" with en-GB "normalisation" in the sentence that begins "if `make fmt` rewrote an unrelated document..." (the occurrence currently at Line 571) so the document uses en-GB-oxendict spelling; update only that word and leave surrounding punctuation and spacing unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@tests/fixtures/streaming_request.rs`:
- Around line 185-198: In drain_stream, drop the sender before you start
draining: set self.sender = None immediately at the start of pub fn
drain_stream(&mut self) (before taking self.stream) so the channel won’t stay
open; this change touches drain_stream and ensures the subsequent block_on async
loop that reads from stream (using classify_next_chunk and stream.next()) can
observe EOF rather than blocking.
- Around line 101-103: The create_channel method currently forwards
user-supplied capacity to body_channel which will panic if capacity == 0; change
create_channel to return Result<(), String>, validate that capacity > 0 and
return Err("request body channel capacity must be greater than zero") when it is
zero, otherwise call body_channel(capacity), assign self.sender and self.stream,
clear self.collected_body, reset self.collected_chunks, self.last_error_kind and
self.send_blocked_by_backpressure as before, and return Ok(()) on success so
callers can handle the error instead of allowing a panic.
---
Duplicate comments:
In `@docs/execplans/8-6-1-update-documentation-for-streaming-requests.md`:
- Around line 513-519: Split the two overlong bash lines so no code-block line
exceeds 120 columns: for the line starting with "set -o pipefail && timeout 300
make markdownlint MDLINT=/root/.bun/bin/markdownlint-cli2 2>&1 | tee
/tmp/8-6-markdownlint.log" break after "make markdownlint" and move the
MDLINT=... and the pipe to tee onto subsequent indented lines using backslashes;
similarly for the line starting with "set -o pipefail && timeout 300 make
doctest-benchmark 2>&1 | tee /tmp/8-6-doctest-benchmark.log" break before the
"|" and place the pipe on the next indented line with a trailing backslash to
keep each physical line <= 120 chars.
- Around line 570-572: Replace the American spelling "normalization" with en-GB
"normalisation" in the sentence that begins "if `make fmt` rewrote an unrelated
document..." (the occurrence currently at Line 571) so the document uses
en-GB-oxendict spelling; update only that word and leave surrounding punctuation
and spacing unchanged.
🪄 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: 9704852a-64ee-4d0e-b12f-3bb41c9fc616
📒 Files selected for processing (2)
docs/execplans/8-6-1-update-documentation-for-streaming-requests.mdtests/fixtures/streaming_request.rs
… is zero Added error handling to StreamingRequestWorld::create_channel to return an error when capacity is zero, preventing invalid channel creation. Updated related test step to propagate the error accordingly. Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
Changes
Rationale
Validation and acceptance criteria
Impacted artifacts
📎 Task: https://www.devboxer.com/task/70376dcf-86a9-4729-becb-3a2a78f480e3