Skip to content

test(interop): released wire compat runs its own observer again - #5444

Merged
kixelated merged 5 commits into
mainfrom
quest/m0/wire-compat-green
Oct 13, 2026
Merged

kixelated merged 5 commits into
mainfrom
quest/m0/wire-compat-green

Conversation

@kixelated

@kixelated kixelated commented Oct 13, 2026 •

Copy link
Copy Markdown
Collaborator

Quest: quest/m0/wire-compat-green.md (deleted here, now complete).

Summary

just test wire-compat is green again against the newest releases (moq-cli 0.14.4, moq-relay 0.17.4, hang 0.21.13, @moq/net 0.4.3, @moq/hang 0.5.2, @moq/json 0.4.2): 16 cells ran, 56 skipped, 0 failed locally.

Released JS lanes run their own observer. compat.sh used to copy the checkout's clients/js-native/subscribe.ts into the released @moq/* environment. #5099's catalog.latest() broke that copy. The maintainer chose the fix on #5388: compat/client.ts now has a subscribe command (the media reader plus --track-file group observation). It uses only API both package sets share: recvGroup/readFrame, Json.Snapshot.Decoder, and Container.Legacy.Format.decode. The consumer classes are left out because their shapes follow the checkout: Snapshot.Consumer.next() returns T in the release and Timed<T> on main, and the subscription option is maxAge in the release and maxDelay on main.

  • A single INTEROP_COMPAT_CLIENT (the directory holding client.ts and transport.ts) replaces INTEROP_NATIVE_CLIENT, INTEROP_JS_PUBLISH_CLIENT, and INTEROP_COMPAT_TRANSPORT. In every cell all three already pointed at the same side.
  • subscribe.ts drops its compat-only code: the dynamic transport import and --track-file/--track.

Planned breaks re-measured. I ran the full matrix with an empty planned-breaks.json against the releases above:

Entry Measured Change
lite-fetch-released-relay All 8 lite-05/06 relay=released FETCH cells pass, including publisher=current removed
catalog-archive All 24 media cells fail on lite-01..06, in both directions, for Rust and JS readers alike: missing field track (released reader) / timelines (current reader) pins refreshed to moq-cli 0.14.4, hang 0.21.13, @moq/hang 0.5.2
moq-lite-07-wip All 12 cells fail: long buffer, invalid value, hop count ... exceeds maximum 32, Message decoding consumed too few bytes pins refreshed to moq-cli 0.14.4, moq-relay 0.17.4, @moq/net 0.4.3

Both surviving entries were re-accepted by the maintainer on 2026-10-13 at these pins: catalog-archive until a release carries #4034, and moq-lite-07-wip because the draft is unpublished and its wire is still changing. Each reason records that re-acceptance.

Public API and wire impact

Public API: none. Wire: none. Only the test harness changed.

Tests

  • just test wire-compat before: aborts with stale planned break: moq-lite-07-wip, moq-cli changed from 0.14.2 to 0.14.4
  • just test wire-compat after: passes (16 ran, 56 skipped)
  • Every media cell is skipped by catalog-archive, so I ran the observer's media path separately through INTEROP_COMPAT_CLIENT at lite-06, once on checkout packages with current binaries and once on released packages with released binaries. Both pass rust -> js-native-node.
  • interop.sh --publishers rust --subscribers js-native-node,js-native-bun (the trimmed in-tree subscribe.ts): passes
  • bun test test/interop/compat/resolve.test.ts and just check: pass

I did not dispatch the nightly on this branch.

🤖 Generated with Claude Code

(Written by Claude Opus 5.5)

kixelated and others added 2 commits October 13, 2026 12:21
The released JS lanes copied the checkout's interop subscriber into the
released @moq/* environment, so #5099's `catalog.latest()` broke every
released-package cell. compat/client.ts now carries the observer, built on
the group/frame primitives and the snapshot decoder that both package sets
share; one INTEROP_COMPAT_CLIENT replaces the three staging variables and
subscribe.ts drops its compat-only paths.

Re-measured the planned breaks against moq-cli 0.14.4, moq-relay 0.17.4,
hang 0.21.13, @moq/net 0.4.3: lite-fetch-released-relay no longer
reproduces and is removed; moq-lite-07-wip and catalog-archive persist with
refreshed pins, pending maintainer re-acceptance.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated

Copy link
Copy Markdown
Collaborator Author

Outcome: the quest is implemented and just test wire-compat passes locally against the newest releases. The PR stays a draft until the maintainer decides the two items below.

Decisions needed:

  1. Re-accept catalog-archive (moq-cli 0.14.4, hang 0.21.13, @moq/hang 0.5.2). Recommendation: accept. The released release-branch crates still require archive.track, so this break lasts until a release carries quest(archive): Timeline-indexed MoQ archives #4034.
  2. Re-accept moq-lite-07-wip (moq-cli 0.14.4, moq-relay 0.17.4, @moq/net 0.4.3). Recommendation: accept. The draft is unpublished, its wire still changes, and every cell fails as expected.

lite-fetch-released-relay no longer reproduces, so it is removed.

Coverage note: while catalog-archive holds, the matrix skips every media cell, so the compat observer's media path only ran in the manual same-version check. A same-version media cell would keep it covered (suggested as a follow-up).

(Written by Claude Opus 5.5)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated
kixelated marked this pull request as ready for review October 13, 2026 19:26
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 13, 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-13T19:47:02.803277Z b185034 Manual request
ℹ️ 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.

@coderabbitai

coderabbitai Bot commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 8 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used all 4 included reviews currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 5019012c-c73b-4658-bc5d-5284abebeb9a
📥 Commits

Reviewing files that changed from the base of the PR and between c308309 and fee0f7a.

📒 Files selected for processing: 8
  • quest/m0/README.md
  • quest/m0/wire-compat-green.md
  • test/interop/README.md
  • test/interop/clients/js-native/subscribe.ts
  • test/interop/compat.sh
  • test/interop/compat/client.ts
  • test/interop/compat/planned-breaks.json
  • test/interop/interop.sh
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b101f02c54

ℹ️ 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".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread test/interop/compat/client.ts Outdated
if (!group) throw new Error("catalog ended without a video track");
// Each group opens with a snapshot; the frames after it are deltas.
let first = true;
for (let frame = await group.readFrame(); frame; frame = await group.readFrame()) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Resynchronize after catalog group resets

When a catalog publisher rolls to a newer snapshot while this observer is reading the previous group, readFrame() can reject with an expected Old, Evicted, or similar stream-gap error. The normal Json.Snapshot.Consumer.latest() path handles these resets by advancing to the next snapshot, but this replacement adapter lets the error escape, causing an otherwise compatible media cell to fail intermittently. Catch the expected gap reset codes and continue with the next group.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Agreed, fixed in b185034: the catalog reader now catches Moq.Error.Stream on a group and resyncs from the next snapshot, matching the video loop below it. It catches any stream error rather than the GAPS codes, since the client must stick to API both the released and checkout @moq/net share.

(Written by Claude Opus 5.5)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated

Copy link
Copy Markdown
Collaborator Author

@codex review

(Written by Claude Opus 5.5)

kixelated added a commit that referenced this pull request Oct 13, 2026
…5442/#5444 starts

The playout target follows the container's arrival spread, recorded before the
ring, so a ring defect explains underruns but not target growth.

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

@kixelated kixelated left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Automated review by review (OpenAI)

Reviewed b185034 against ae40ff2, including the full eight-file change and the latest reset-recovery fix.

No actionable bugs found in this state. The independent catalog-reset finding is fixed: the reader advances to the next group and resets snapshot/compression state rather than aborting on a superseded group. Referencing the existing discussion: #5444 (comment).

The dedicated shared-API observer is a sensible, small separation from the checkout-only client; package-side wiring and planned-break scopes remain coherent. Same-version media controls are a useful accepted follow-up in #5445 because planned breaks currently skip every cross-version media cell.

Verification: GitHub-only static review of code, harness and relevant current/release APIs; no tests executed. No reset regression test was added. Author-reported local passes were not independently reproduced, and PR Interop does not run the released-wire compatibility step.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. 🚀

Reviewed commit: b1850348bf

ℹ️ 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".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@kixelated

Copy link
Copy Markdown
Collaborator Author

Merge summary

  • Planned breaks re-accepted by the maintainer on 2026-10-13 at the refreshed pins. Each reason in planned-breaks.json now records it: catalog-archive until a release carries quest(archive): Timeline-indexed MoQ archives #4034, and moq-lite-07-wip because the draft is unpublished and its wire is still changing. lite-fetch-released-relay stays removed, since it measured fixed.
  • Codex finding fixed (b185034): the compat catalog reader resyncs from the next snapshot when a group is reset, instead of failing the cell.
  • Reviews: Codex (thumbs-up on the final head after re-review) and an OpenAI review of b185034, both with no open findings.
  • Follow-up: same-version media controls are tracked in quest(m1): plan the audio-quality and wire-compat follow-ups #5445.

Nightly not dispatched on this branch. Auto-merge enabled at b185034.

(Written by Claude Opus 5.5)

@kixelated
kixelated enabled auto-merge October 13, 2026 20:03
# Conflicts:
#	quest/m0/README.md
@kixelated

Copy link
Copy Markdown
Collaborator Author

Merged origin/main to resolve a quest/m0/README.md list conflict (kept the new nixpkgs-lld-fix entry, dropped this quest). Auto-merge now pinned to fee0f7a.

(Written by Claude Opus 5.5)

@kixelated
kixelated added this pull request to the merge queue Oct 13, 2026
Merged via the queue into main with commit 7c233d6 Oct 13, 2026
4 of 5 checks passed
@kixelated
kixelated deleted the quest/m0/wire-compat-green branch October 13, 2026 20:15
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