Skip to content

fix(net): accept an End of Group status on a marked subgroup stream (backport #5081) - #5127

Merged
kixelated merged 1 commit into
releasefrom
backport/end-of-group-status
Oct 10, 2026
Merged

kixelated merged 1 commit into
releasefrom
backport/end-of-group-status

Conversation

@kixelated

Copy link
Copy Markdown
Collaborator

Backport of #5081 (52a2a8953) to release.

What breaks on release

imquic on draft-16, draft-18, and draft-21 sets the END_OF_GROUP header bit on a subgroup stream and also sends an explicit End of Group (0x3) object status. Release treats that status as invalid whenever the header bit is set, so both the Rust subscriber (moq-relay pulling from imquic) and the JS subscriber abort the group and lose its last object. This is an interop failure against imquic for the Seattle interop on 2026-10-12.

What changed versus the original

  • The fix itself (Rust GroupIngest and JS Frame.decode) applied unchanged.
  • The Rust regression test is adapted: release lacks the end_marker helper and the codec API from refactor(net)!: plain u64 varint codec and simulated-time tests (rs2ts) #4437, so the test writes the draft-18 status object (delta, empty extension block, zero size, status) inline with release's value.encode(&mut bytes, Version::Draft18) form. Release's end_of_track helper and its callers are untouched.
  • The test runs under #[tokio::test] because release has no moq_net_sim; it reads a scripted stream and does not depend on time.
  • Quest file edits are dropped.

Public API and wire impact

No public API change. Wire: the subscriber now accepts a valid peer behavior it previously rejected; nothing new is sent.

Test evidence

  • cargo nextest run -p moq-net an_end_of_group_status: passes with the fix, fails without it (the group is aborted instead of finished).
  • bun test src/ietf/subscriber.test.ts in js/net: 33 pass. The new JS test fails with the GROUP_END line reverted.
  • just check (against origin/release): passes, 4988 Rust tests plus lint and JS tests.

(Written by Claude Opus 5.5)

🤖 Generated with Claude Code

…5081)

Backport to release. The Rust regression test writes the draft-18 status
object inline with release's encode form and runs under tokio::test,
since release lacks the end_marker helper and moq_net_sim. Quest edits
dropped.

(cherry picked from commit 52a2a89)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 9, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-09T22:21:20.192448Z 64eee3d PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@kixelated

Copy link
Copy Markdown
Collaborator Author

Review of head 64eee3d2 (backport of #5081 to release).

The fix matches the original: both the Rust GroupIngest and JS Frame.decode now treat an explicit End of Group (0x3) status as a clean group end whether or not the header's END_OF_GROUP bit is set, and the now-unused has_end field is removed. Both new tests cover the imquic case (marked header plus explicit status), and the description says each fails with the fix reverted.

Blocking: none.

Non-blocking

  • CI hasn't reported yet. Every check is still pending.
  • In JS, a status object with status === 0 on an unmarked stream still returns an empty Frame() and ends the group, not an empty payload (this is the existing moq-rs TODO). That's unchanged by this PR, but it's worth knowing it's still there on release.
  • There's no test for a stream that sends the explicit status and then more objects after it. It's pre-existing behaviour and the Finished phase should reject them, so this is just a gap in coverage.

Verdict: MERGE once CI is green.

This is an automated review, not the maintainer's decision
(Written by Grok)

@kixelated

Copy link
Copy Markdown
Collaborator Author

Merging at the maintainer's direction. Faithful backport of #5081 (Rust GroupIngest and JS Frame.decode identical; the Rust test writes the draft-18 status inline since release has no end_marker helper). CI green on 64eee3d2; Codex reviewed that head with no findings; Grok's two notes predate this PR and apply to main too.

(Written by Claude Opus 5.5)

@kixelated
kixelated merged commit 1df4155 into release Oct 10, 2026
9 checks passed
@kixelated
kixelated deleted the backport/end-of-group-status branch October 10, 2026 00:30
This was referenced Oct 10, 2026
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