Skip to content

feat(net): a timed track refuses a group that rewinds - #5803

Merged
kixelated merged 15 commits into
mainfrom
quest/m1/refuse-rewinds
Oct 17, 2026
Merged

kixelated merged 15 commits into
mainfrom
quest/m1/refuse-rewinds

Conversation

@kixelated

@kixelated kixelated commented Oct 16, 2026 •

Copy link
Copy Markdown
Collaborator

Completes the quest/m1/refuse-rewinds.md quest, deleted here: a timed track refuses a group whose first frame rewinds, on a local publisher's writes, in Rust and js/net. Follows the decision in #5446.

What changed

  • The rule. A timed track refuses a group whose frame 0 starts before the nearest checked group below it, or after the nearest checked group above it, with TimestampMismatch. Groups land out of sequence order, so both neighbors count. An equal start is allowed. Untimed tracks are exempt.
  • Where it runs. The check runs where frame 0 is stamped (write_frame, write_frames, open_frame; JS writeFrame, plus writeGroup for a group stamped before it joined). It is atomic with the stamp: the track lock is held across the group lock, in the existing track-then-group order.
  • Local writes only. A session marks its copy of a remote track as received (Rust track::Producer::received, crate-private; js/net hooks.receiveTrack), and a received track checks nothing. Received groups at every version (lite-05/06/07 and IETF) are accepted as is and still drive media-time expiry. A received timestamp may not be media time, so checking it on a relay hop could close a track that never rewound.
  • Eviction watermark. The track keeps one entry, the sequence and start of the highest-sequence evicted group that had a checked start. A group above it is checked against the watermark and its cached neighbors. A group at or below it is checked against its surviving neighbors with the watermark as a ceiling, then accepted as unverified. An unverified group bounds nothing and has no timestamp for media-time expiry. A group resumed partway in (start_at) is neither checked nor a bound.
  • Replacement producers. A name's sequence namespace (one per broadcast) also keeps the highest-sequence checked start any producer of the name wrote, and a producer joining it takes that as its eviction watermark, so a replacement can't rewind past its predecessor. A new broadcast starts a fresh namespace, so nothing crosses instances or epochs.
  • Error. TimestampMismatch (stream code 0x39) is reused. Its doc and message are broadened to "frame timestamp doesn't fit its track".
  • Docs. draft-lcurley-moq-lite states the publisher MUST and that receivers do not check it. reach/#successor no longer cite rewinds. rs/moq-net/MIGRATE.md gains an Unreleased entry. The fmp4 Import::discontinuity doc notes that a restarting timeline now fails.
  • Quest. New quest/m1/lite-time-provenance.md: make received timestamps trustworthy enough to check across hops.
  • Tests.
    • Deleted the rewind-premise tests: reach_follows_the_immediate_successor_not_a_later_rewind, aborted_stamped_successor_wakes_a_parked_read and moq-archive a_decreasing_timestamp_fails_the_recording.
    • Deleted a_failed_recording_flushes_what_was_reported. Its trigger, an in-session group-start rewind, can no longer reach the writer, and an ID-range overflow takes the read path, which flushes differently.
    • Reworked tests that stamped now() out of order to use media time.
    • New Rust tests: appended rewind, single-frame rewind aborts, either arrival order, every write path, evicted predecessor still bounds, late group unverified, resumed partial group exempt, untimed any order.
    • A received rewinding or out-of-order group is accepted: a_received_rewind_is_accepted_at_every_version (lite-05/06/07), a_received_rewind_is_accepted (IETF draft-18), and js/net version %p accepts a received rewind (lite-05/06/07).
    • Relay-shaped: received_rewind::a_relay_forwards_descending_send_times_without_closing_the_track sends an untimed track's groups 1 then 0 into a relay over lite-06 and out over lite-06, lite-07 and moq-transport-22; every subscriber reads both groups and the track stays open.
    • Matching JS local-write tests in track.test.ts.
  • Bench. track_stamp_groups stamps a group's first frame, swept over N cached groups. append adds stamped groups to a track holding N stamped ones: 420 / 549 / 814 ns at 64 / 512 / 4096. sparse creates N groups and then stamps them in order: 441 ns / 2.94 µs / 27.6 µs per stamp when neighbors were found by walking slots, and 165 / 199 / 229 ns with checked starts kept in a per-track BTreeMap by sequence. js/net already binary-searches a sorted array of bound starts only, so it has no such scan.

Public API and wire impact

  • No new public items. TimestampMismatch keeps its variant and code; only its doc and Display text change.
  • The received mark is crate-private in Rust and an internal hook in js/net, both marked pending on quest/m1/public-model/ingest.md, so a custom session built on the public model gets local-write checks on its track copies. Exposing it is left to the public-model quest, if a consumer needs it.
  • Behavior: a local timed write whose group start rewinds now fails. A publisher whose timeline restarts must publish a new broadcast. Received groups are unchanged.
  • Regression: an HLS or fmp4 import whose EXT-X-DISCONTINUITY restarts decode times now fails with TimestampMismatch instead of continuing. Import::discontinuity no longer rescues a restarting timeline. Accepted until the follow-up quest restarts the import under a successor epoch.
  • Wire: no encoding change and no new reset. The lite draft adds a publisher MUST that receivers do not check (moq-lite-07 changelog entry); the 0x39 row is unchanged.

Decisions (settled by the maintainer)

  1. Late groups below the eviction watermark are accepted unverified. Refusing a late group whose lower bound was evicted would also refuse legitimate backfill.
  2. Only a local publisher's writes refuse a rewind. Received groups, at every version, are never checked. The maintainer chose to split received-timestamp provenance out ("Split it out"): released clients stamp wall-clock time on data tracks, released relays stamp arrival time on untimed input, and lite-05/06 untimed tracks carry send times, so no received timestamp is yet known to be media time. Tracked in quest/m1/lite-time-provenance.md.
  3. Reuse TimestampMismatch (0x39) with a broader message, instead of a new code.
  4. Groups that were stamped and then aborted still count as bounds. This deviates from the quest's "non-aborted": a stamped start was checked when it landed, and dropping it on abort would let a later group rewind past a start subscribers may already have seen.
  5. Replacing an aborted group keeps its start as the watermark. Subscribers may have seen it, so a replacement at the same sequence is checked as late (capped by it), and no later group can start before it. Rust's claim_sequence uncaches; js/net's writeGroup evicts the old incarnation before checking the replacement. (Earlier rounds dropped the bound; Codex P1 showed that let a later group rewind.)
  6. HLS/fmp4 imports whose discontinuities restart decode times now fail with TimestampMismatch. Accepted as a regression; a follow-up quest restarts them under a successor epoch.

Paper trail: why received groups are unchecked

just test interop --all found that checking received groups broke tail js-native-* -> rust (2 in 10 runs): lite-05/06 publishers stamp an untimed track's frames with their send time, groups are served concurrently, and a later-sent lower group closed the relay's track. Exempting lite-05/06 ingest (an earlier round) fixed that hop, but Codex found the relay then forwards those send times as media time over lite-07 or IETF, where the next hop's check closes the track. Released clients and relays also put wall-clock and arrival times on the wire, so no received timestamp is reliably media time today.

  • Stamp the join time on lite-05/06. Fixes the first hop only; per-process anchor jitter (up to 69.4 s) still rewinds across route switches.
  • Exempt only lite-05/06 ingest. Leaves the relay-forwarding hole above.
  • Check local writes only, and move provenance to a quest (chosen by the maintainer).
  • A lite-07 TRACK_INFO provenance marker. Weighed in the new quest.

Suggested follow-ups

  • quest/m1/lite-time-provenance.md: received timestamps are media time, so the check can run across hops.
  • HLS and fmp4 discontinuity restart under a successor epoch (follow-up quest being planned), or remove Import::discontinuity if nothing else needs it.
  • Re-cover moq-archive's flush-on-failure path with a trigger that still reaches the report path, or drop the in-session report floor if it is now unreachable.
  • Tighten reach to the first stamped group above, which the refusal makes safe, if a stall shows it matters.

Checks

This round (local writes only):

  • just check (lint, compile and test what the branch changed): pass (6913 moq-net tests plus the other changed crates and js workspaces).
  • The received-group tests fail with TimestampMismatch when the received mark is ignored, and pass with it: Rust lite, IETF and relay integration; js/net lite.
  • just test interop --all: 68 of 68 pass, including every tail lane.
  • just drafts check: pass.
  • quest check: pass.

Codex P1 (replacement producers): just check passes (6914 moq-net tests plus the changed crates and js workspaces). New tests replacement_refuses_a_rewind_past_its_predecessor (Rust, model/broadcast.rs) and a replacement producer refuses a rewind past its predecessor (js/net, broadcast.test.ts) fail without the shared bound.

Codex P2 (O(N^2) sparse stamping): confirmed and fixed with the bound index, numbers in the Bench bullet. just check passes.

Codex P1 (replaced aborted group): new tests a_replaced_aborted_group_still_bounds_later_ones (Rust) and a replaced aborted group still bounds later ones (js/net) fail without the fix. just check passes (6915 moq-net tests plus the changed crates and js workspaces).

Merge with main (7e90fb4):

  • Six moq-cli play tests new on main restarted the timeline at 0 after discontinuity(), which this PR's local-write check refuses. They now resume forward; just rs play passes 215 of 215.
  • moq-ffi's catalog_now_fixes_the_clock_for_later_media failed about half its runs: its start_paused runtime counts Timestamp::now() from its own jittered anchor while the FFI runtime uses the process anchor, so catalog snapshots written from both rewound. It never advances time, so it runs unpaused: 300 of 300 pass.
  • Ported the new tests from moq_net_sim to moq_clock (Migrate network timing onto moq-clock #5681), and moved the upgrade note into rs/moq-net/MIGRATE.md.
  • just check: pass.

Second merge with main (128b062), after #5794 narrowed the model: the rewind check's model-only items are pub(super), and track::Producer::received and hooks.receiveTrack carry // pending: /quest/m1/public-model/ingest.md, which now lists them. just check: pass.

Codex P1 (fetch-only tracks unmarked): not reachable. Lite fetches run under a ServeLoop, whose constructor accepts and marks the track first; IETF tracks are accepted by SUBSCRIBE or TRACK_STATUS, which both mark. New received_rewind::fetches_alone_accept_descending_send_times (lite-05/06, fetch-only, descending send times) passes and fails if ServeLoop::new stops marking. just check: pass.

Earlier rounds:

  • Codex P2: js/net compared cross-scale timestamps in lossy doubles; earlier now compares exactly in BigInt, as Rust does in u128. Kept, since local JS writes can mix scales. Test a rewind across large timescales is refused.
  • cargo nextest run across moq-net, moq-archive, moq-flate, moq-mux, moq-stats, hang, moq-ffi, moq-e2ee, moq-hls, moq-tokio, moq-relay, moq-srt, moq-loc, moq-room, moq-json, moq-rtmp, moq-c, moq-rtc, moq-uring, moq-gst, moq-video, moq-audio, moq-transcode and moq-boy: pass.
  • cargo clippy -D warnings, cargo fmt, Biome, tsc --noEmit, just drafts check, just rs wasm: clean.

(Written by Claude Opus 5.5)

🤖 Generated with Claude Code

kixelated and others added 2 commits October 16, 2026 16:59
A timed track now refuses a group whose first frame starts before the
nearest checked group below it or after the nearest one above it, with
TimestampMismatch. An equal start is allowed and untimed tracks are exempt.
The check runs where frame 0 is stamped, atomically with the stamp, so every
producer refuses: local writes, relays, and Rust and JS subscribers.

Eviction keeps a one-entry watermark (the highest-sequence evicted start), so
an evicted predecessor still bounds a later group. A late group at or below
it is capped by the watermark and accepted unverified, which keeps it out of
every bound and out of media-time expiry.

A received rewind closes the track and keeps the session. The lite draft
states the rule and broadens TIMESTAMP_MISMATCH; no wire change.

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

Copy link
Copy Markdown
Collaborator Author

Paper trail: implemented quest/m1/refuse-rewinds.md as a background quest session. It is a draft because the decisions in the body need a maintainer call. The main ones are #4, which deviates from the quest (aborted-but-stamped groups still bound), and #7, a consequence: HLS discontinuities that reset decode times now fail the import. The quest's three recommendations are implemented as written (late groups unverified, every producer refuses, reuse TimestampMismatch). CI was not monitored.

(Written by Opus 5.5)

kixelated and others added 3 commits October 16, 2026 18:57
…rate

# Conflicts:
#	rs/moq-net/src/model/track.rs
Lite-05/06 stamp an untimed track's frames with their send time, which
needn't rise with sequence: concurrently served groups go out in any
order, and a relay or second publisher stamps from its own clock. A
receiver can't tell send times from media time, so a group received over
lite-05/06 skips the rewind check and never bounds its neighbors, in Rust
and js/net. Local writes, lite-07 and IETF ingest still refuse rewinds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated
kixelated marked this pull request as ready for review October 17, 2026 02:46
@kixelated

Copy link
Copy Markdown
Collaborator Author

@codex review

(Written by Opus 5.5)

@coderabbitai

coderabbitai Bot commented Oct 17, 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 38 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: 84e80087-296f-4a14-8dc3-aa53a8092e3a
📥 Commits

Reviewing files that changed from the base of the PR and between 8332188 and 2397119.

📒 Files selected for processing: 40
  • drafts/draft-lcurley-moq-lite.md
  • js/hang/src/container/consumer.test.ts
  • js/net/src/broadcast.test.ts
  • js/net/src/error.ts
  • js/net/src/group.ts
  • js/net/src/ietf/subscriber.ts
  • js/net/src/internal.ts
  • js/net/src/lite/publisher.test.ts
  • js/net/src/lite/subscriber.test.ts
  • js/net/src/lite/subscriber.ts
  • js/net/src/mock.ts
  • js/net/src/track.test.ts
  • js/net/src/track.ts
  • quest/m1/README.md
  • quest/m1/lite-time-provenance.md
  • quest/m1/public-model/ingest.md
  • quest/m1/refuse-rewinds.md
  • rs/moq-archive/src/writer.rs
  • rs/moq-cli/src/play/media.rs
  • rs/moq-cli/src/play/video.rs
  • rs/moq-ffi/src/test.rs
  • rs/moq-flate/src/stream/mod.rs
  • rs/moq-mux/src/container/consumer.rs
  • rs/moq-mux/src/container/fmp4/import.rs
  • rs/moq-mux/src/container/fmp4/import_test.rs
  • rs/moq-mux/src/container/ts/export_test.rs
  • rs/moq-net/MIGRATE.md
  • rs/moq-net/benches/group.rs
  • rs/moq-net/src/error.rs
  • rs/moq-net/src/ietf/subscriber.rs
  • rs/moq-net/src/lite/subscriber.rs
  • rs/moq-net/src/model/broadcast.rs
  • rs/moq-net/src/model/cache.rs
  • rs/moq-net/src/model/delivered.rs
  • rs/moq-net/src/model/group.rs
  • rs/moq-net/src/model/track.rs
  • rs/moq-net/tests/integration/late_lower_group.rs
  • rs/moq-net/tests/integration/main.rs
  • rs/moq-net/tests/integration/received_rewind.rs
  • rs/moq-stats/src/aggregate.rs
  • 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 commented Oct 17, 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-17T17:34:26.572559Z 2397119 Draft marked ready
ℹ️ 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.

@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: 40c9daa343

ℹ️ 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 js/net/src/track.ts Outdated
Cross-scale products can pass 2^53 and round alike, letting a real rewind through. Compare them in BigInt, as Rust does in u128, with fractions decomposed into exact binary mantissas.

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

Copy link
Copy Markdown
Collaborator Author

@codex review

(Written by Opus 5.5)

@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: 635dd074de

ℹ️ 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 js/net/src/lite/subscriber.ts Outdated
… check

Its first frame is a later one, whose timestamp says nothing about where the group began. Matches Rust, where start_at leaves the group unchecked.

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

Copy link
Copy Markdown
Collaborator Author

@codex review

(Written by Opus 5.5)

@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: 4016e601d8

ℹ️ 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 rs/moq-net/src/lite/subscriber.rs Outdated
A received timestamp may not be media time: lite-05/06 untimed tracks carry
send times, and released peers stamp wall-clock time on data tracks. A relay
that checked received groups could close a track that never rewound its
media, so sessions mark their track copies as received and skip the check
at every version. Received groups still drive media-time expiry.

Drops the per-group skip (lite-05/06 and partial groups) and the ingest
paths that closed the track on TimestampMismatch. Provenance moves to
quest/m1/lite-time-provenance.md.

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

Copy link
Copy Markdown
Collaborator Author

@codex review

(Written by Opus 5.5)

@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: a2bd83972b

ℹ️ 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 js/net/src/track.ts
A track name keeps one sequence namespace for its broadcast's life, so a
replacement producer continues the same timeline. Its rewind check only saw
its own cache, so it could start a group before the last one its
predecessor wrote. The namespace now keeps the highest-sequence checked
start, and a producer joining it takes that as its eviction watermark. A
new broadcast starts a fresh namespace, so nothing crosses instances.

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

Copy link
Copy Markdown
Collaborator Author

@codex review

(Written by Opus 5.5)

@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: 51f924cffe

ℹ️ 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 rs/moq-net/src/model/track.rs Outdated
A first frame found its neighbors' starts by walking cached slots until one
was stamped, so N groups created before any was stamped cost O(N^2) to stamp
in order. The track now keeps the checked starts in a BTreeMap, filled when
frame 0 becomes a bound and pruned as slots leave, so the lookup is
O(log N). `track_stamp_groups/sparse` covers the case: 441 ns / 2.94 us /
27.6 us at 64 / 512 / 4096 groups before, 165 / 199 / 229 ns after.

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

Copy link
Copy Markdown
Collaborator Author

@codex review

(Written by Opus 5.5)

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@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: 0e3ab33ff1

ℹ️ 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 js/net/src/track.ts Outdated
Subscribers may have seen an aborted group's start, but replacing it at the
same sequence dropped its bound without raising the eviction watermark, so a
later group could start before it. Rust's claim_sequence now uncaches, and
js/net's writeGroup evicts the old incarnation as a watermark before checking
the replacement.

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

Copy link
Copy Markdown
Collaborator Author

@codex review

(Written by Opus 5.5)

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

kixelated and others added 2 commits October 17, 2026 09:10
Port the rewind tests from moq_net_sim to moq_clock, and move the
rewind note from doc/setup/upgrade.md into rs/moq-net/MIGRATE.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Main added moq-cli play tests that restart a track's timestamps after a
discontinuity, which a local write now refuses as a rewind; they resume
forward instead. catalog_now_fixes_the_clock_for_later_media ran on a
paused runtime while the FFI runtime is unpaused, and each counts
Timestamp::now() from its own jittered anchor, so catalog snapshots
written from both rewound about half the time. It never advances time,
so it runs unpaused.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated
kixelated marked this pull request as draft October 17, 2026 16:49
@kixelated
kixelated marked this pull request as ready for review October 17, 2026 16:49
@kixelated
kixelated enabled auto-merge October 17, 2026 16:54
Narrow the rewind check's model-only items to pub(super) and mark
track::Producer::received and hooks.receiveTrack pending on the public
ingest quest (#5794).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated
kixelated marked this pull request as draft October 17, 2026 17:11
auto-merge was automatically disabled October 17, 2026 17:11

Pull request was converted to draft

@kixelated
kixelated marked this pull request as ready for review October 17, 2026 17:11

@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: 128b0626d6

ℹ️ 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 rs/moq-net/src/lite/subscriber.rs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated
kixelated marked this pull request as draft October 17, 2026 17:31
@kixelated
kixelated marked this pull request as ready for review October 17, 2026 17:31
@kixelated
kixelated enabled auto-merge October 17, 2026 17:34
@kixelated
kixelated added this pull request to the merge queue Oct 17, 2026
Merged via the queue into main with commit d73fb3a Oct 17, 2026
17 checks passed
@kixelated
kixelated deleted the quest/m1/refuse-rewinds branch October 17, 2026 18:47
kixelated added a commit that referenced this pull request Oct 17, 2026
…nchor quest

Every reader gets Old when an unfinished group expires, and the hole budget
reuses the subscription's max delay. Adds the process-wide Timestamp::now()
anchor quest from #5803.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
kixelated added a commit that referenced this pull request Oct 17, 2026
Conflicts:
- cpp/moq/include/moq/moq.hpp: take main's #5727, which generates
  unprefixed names, dropping the alias list (and this branch's
  Anchor/Order/Range aliases, now generated directly).
- rs/moq-net/src/model/track.rs: keep both appended test sets
  (subscription ranges here, rewind refusal from #5803).

Semantic follow-ups for callers main added against the old API:
- rs/moq-net/tests/integration/received_rewind.rs: with_start(group 0)
  becomes with_groups(0..), as this branch migrated other callers.
- py/moq-rs/tests/test_testing_clock.py: group_start=0 becomes an
  absolute group-0 range.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
kixelated added a commit that referenced this pull request Oct 17, 2026
…5871

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
kixelated added a commit that referenced this pull request Oct 17, 2026
Also guard Go's nil receive-bandwidth consumer in the #5777 snippet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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