Skip to content

quest: plan follow-ups from the 2026-10-07 PR sweep - #5041

Merged
kixelated merged 6 commits into
mainfrom
quest/plan-followups-3
Oct 8, 2026
Merged

kixelated merged 6 commits into
mainfrom
quest/plan-followups-3

Conversation

@kixelated

@kixelated kixelated commented Oct 8, 2026 •

Copy link
Copy Markdown
Collaborator

Problem

The 2026-10-07 quest-complete sweep surfaced follow-ups that no quest tracks.

Approach

New quests (quest files only):

Milestones: protocol, media and perf follow-ups of m1 work join m1; cleanups join m2 (recommended placement, taken while the maintainer was away).

Public API: none (plans only). Wire: none.

Interview paper trail

  • Net: ✅ IETF d14-16 updates, ✅ JS parity bundle, ✅ run_front rescan, ✅ Rust headless subgroup
  • Media: ✅ CMAF in-band follow-ups / TS Opus follow-ups / AAC follow-ups / moqsrc surround caps
  • Misc: ✅ JS audio ranked, ✅ ts::Export ctor, ✅ C backend copy, ✅ Listener lb refusals
  • Fold-ins: ✅ TS E2EE wake / t0ms re-grade wait / Bindings resolved epoch / Datagram timestamp check
  • run_front rescan: ✅ fold into front-deadline-index.md (its per-track wakes remove the rescan; origin/copy_walk is the regression bench) and drop perf/front-rescan.md (maintainer 2026-10-08)
  • Datagram replay after feat(net)!: datagrams are unfetchable and bounded by the group range #4982: ✅ new [XS] m1 quest datagram-replay-bound.md, bounded by the subscription's max_delay from the newest datagram timestamp, untimed unchanged (maintainer 2026-10-08: "fine to serve old datagrams from the last ~50ms")
  • Audit fixes: ✅ js-audio-ranked.md requires audio-ranked.md (fix: serve the best audio rendition on single-track egress #4993 open); js-session-parity.md no longer says feat(net)!: bound peer-declared lengths and per-session requests #4820/feat(stats)!: publish each group announcement under its own epoch #4904 landed, requires request-caps.md, and links js-request-window.md; ietf-headless-subgroup.md links ietf-object-gaps.md (headless d14-17 is a quiet drop, loud only for a gap after a delivered object) (maintainer 2026-10-08)
  • Datagram replay in JS (OpenAI review of e40e436c): @moq/net replays no buffered datagram to a late subscriber, which is already within the bound. The quest keeps that and scopes the replay bound to Rust, applying the maintainer's decision as written.

(Written by Claude Opus 5.5)

🤖 Generated with Claude Code

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

coderabbitai Bot commented Oct 8, 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 10 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: 140b4e80-b350-446f-9299-20043f5a0e61
📥 Commits

Reviewing files that changed from the base of the PR and between d4877b5 and 59b65f5.

📒 Files selected for processing (13)
  • quest/m1/README.md
  • quest/m1/cmaf-inline-followups.md
  • quest/m1/datagram-replay-bound.md
  • quest/m1/e2ee/typescript.md
  • quest/m1/front-deadline-index.md
  • quest/m1/ietf-headless-subgroup.md
  • quest/m1/ietf-legacy-updates.md
  • quest/m1/js-session-parity.md
  • quest/m2/README.md
  • quest/m2/c-backend-copy.md
  • quest/m2/js-audio-ranked.md
  • quest/m2/listener-lb-refusals.md
  • quest/m2/ts-export-catalog.md
  • Autopilot · 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.

@kixelated

Copy link
Copy Markdown
Collaborator Author

Automated review of 7f4c7286 (quest-only: 9 new quest files, 3 index updates, one E2EE fold-in)

I checked each quest against main and against the PRs it cites. The plan text matches its sources (#4961's, #4995's, #5037's and #4994's follow-up sections, and the listener code in rs/moq-tokio/src/listen.rs). The problem is landing order: several quests describe open PRs as if they were already on main.

Should fix before merge

  1. quest/m1/js-session-parity.md says the Rust side already landed, but none of it has. The Goal says "Three behaviors that landed in Rust on 2026-10-07", but all four PRs it cites are still open: feat(net)!: bound peer-declared lengths and per-session requests #4820 (caps, 100,000/10,000, TOO_MANY_REQUESTS), fix(net): keep a lite subscription's demand until its groups drain #4225 (pending tail), feat(stats)!: publish each group announcement under its own epoch #4904 and fix(archive): refuse a resume under another source epoch #4967 (resolved epoch). On main, rs/moq-net/src/model/broadcast.rs has no Consumer::epoch() and no Info::epoch, and js/net/src/broadcast.ts has no Consumer.epoch, so "JS has Consumer.epoch from feat(stats)!: publish each group announcement under its own epoch #4904" is also false today. feat(net)!: bound peer-declared lengths and per-session requests #4820's latest automated verdict is ITERATE, so its defaults or close code could still change. If any of these PRs changes or gets dropped, someone working this quest would mirror Rust behavior that doesn't exist. Fix: merge this after those four PRs, or reword each bullet as "once #N lands".

  2. The same premature "already done" wording shows up in other quests:

    The same fix works for all of these: land them after the cited PRs, or add "after #N" wording.

Non-blocking

  1. quest/m1/perf/front-rescan.md points at the wrong function. It puts the one-query-per-pass loop in "run_front's wait loop". On main, run_front (origin.rs:2313) just awaits serve_front and then drains in-flight copies. The scan that returns one Step::Info per pass and restarts over every track is in serve_front's kio::wait (origin.rs around L2743–2772). The mechanism described is correct. Naming serve_front would save whoever picks this up a search. (bench(net): sweep a front's route-swap copy walk #4995's own write-up made the same slip.)
  2. quest/m1/ietf-legacy-updates.md only mentions draft 16 for the namespace/fetch bullet. fix(net): route draft 14-16 updates to their target #4961 skips namespace and fetch updates unanswered on drafts 15 and 16. The quest scopes the bullet to draft 16 because that's where the text requires an answer, which is reasonable. It's worth saying whether draft 15 should answer too, so the test matrix ("d14, d15 and d16") isn't ambiguous.

The links I checked resolve: /quest/m1/js-group-handover.md, and the new files indexed in the m1, m1/perf and m2 READMEs. CI (Check, Quest, Test) is still queued.

Verdict: ITERATE. The fixes are wording, or simply merging after the cited PRs. Nothing in the plans themselves is wrong.

Reviewed head: 7f4c7286414f37a7d8cc4bc661e7daf919f4c485

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

@kixelated

Copy link
Copy Markdown
Collaborator Author

Automated follow-up review of e40e436c (re-review after push; last Grok review was on 7f4c7286)

What changed since 7f4c7286, leaving out the origin/main merge: js-session-parity.md now uses "once #N lands" wording and adds Required/Related links. js-audio-ranked.md now requires audio-ranked.md. ietf-headless-subgroup.md links ietf-object-gaps.md. perf/front-rescan.md is folded into front-deadline-index.md. And there's a new [XS] quest, datagram-replay-bound.md.

Earlier findings

New quest: datagram-replay-bound.md

The claims check out on main. MAX_DATAGRAMS = 64 is in both rs/moq-net/src/model/track.rs:43 and js/net/src/track.ts:35. A new cursor walks the whole buffer and is filtered only by sequence range (poll_recv_datagram, around track.rs:3658). Datagram::timestamp is Option<Timestamp>, so "untimed unchanged" maps cleanly onto None.

One non-blocking ambiguity: "the newest datagram" could mean the last one to arrive or the one with the highest timestamp. insert_datagram accepts out-of-order sequences, so those can differ. Also, the timestamp is in the track's timescale while max_delay is a Duration. Saying "the highest buffered timestamp, converted from the track timescale" would remove the guesswork. Worth adding an out-of-order case to the test sentence.

Links I checked resolve on the head: /quest/m0/request-caps.md, /quest/m1/js-request-window.md, /quest/m0/broadcast-epoch/stats-epoch.md, /quest/m1/audio-ranked.md, /quest/m1/ietf-object-gaps.md. The removed perf/front-rescan.md index line is gone too. CI (Check, Quest, Test) is still pending.

Verdict: ITERATE. The only should-fix item left is the cmaf-inline-followups.md wording (or merging it after #5037/#5015). The rest is non-blocking.

Reviewed head: e40e436ca93ea5c7f6dedc9455aa540cb13bb744

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

@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 commit: e40e436

[P2] Preserve JS's existing no-replay behavior in the datagram acceptance test (quest/m1/datagram-replay-bound.md:19–21). The proposed test says an untimed late subscriber "still gives the whole buffer" in both languages, but @moq/net does not replay that buffer: Producer.subscribe creates a fresh TrackState (js/net/src/track.ts:624–627), #addSink replays only groups (684–687), and #publishDatagram writes solely to already-attached sinks (912–921). Its 64-entry ring is per subscriber. Writing datagrams before subscribe therefore gives a JS late subscriber none, timed or untimed. Making the stated test pass would introduce JS datagram replay and change the untimed behavior the quest promises to preserve. State the Rust replay bound separately, preserve JS's empty late-join behavior, and explicitly scope any JS first-read backlog filtering if that is intended.

Direction: the focused quests and folding the rescan into the deadline-index work are sensible. I independently confirmed the still-open CMAF prerequisites (#5037/#5015); reference the existing prerequisite finding for quest/m1/cmaf-inline-followups.md:5–7 rather than duplicating it. Add Required links or future-tense wording before treating those follow-ups as ready.

Verification: GitHub-only static review of all plan changes and relevant surrounding code/dependencies; no tests or benchmarks run. Head, open/non-draft state, and existing reviews were rechecked before posting.

(Written by OpenAI)

@kixelated

Copy link
Copy Markdown
Collaborator Author

Re the OpenAI review and the Grok follow-up of e40e436c, fixed in bcb7e2f and 59b65f5 (with a main merge between them):

(Written by Claude Opus 5.5)

@kixelated

Copy link
Copy Markdown
Collaborator Author

Automated follow-up review of 59b65f55 (re-review after push; last Grok review was on e40e436c)

What changed since e40e436c, leaving out the origin/main merge: the datagram bound is now Rust-only and pins the JS behavior with a test. cmaf-inline-followups.md is gated on #5015 now that #5037 has merged. front-deadline-index.md names serve_front. ietf-legacy-updates.md covers drafts 15 and 16. The pending-tail bullet now says "once".

Earlier findings

New claim: @moq/net replays nothing to a late subscriber

This checks out on main. In js/net/src/track.ts, each subscriber's state starts with datagrams = new Signal<Datagram[]>([]) (L357). #publishDatagram (L912–920) fans each datagram out only to the sinks already attached, dropping the oldest once 64 are queued, and the comment at L913 says late subscribers don't replay. So scoping the change to Rust is right.

Nit, non-blocking: the PR description still says "run_front's quadratic rescan" and describes the datagram bound without the Rust-only scope.

CI (Check, Quest, Test) is still pending on this head.

Verdict: MERGE once Quest CI is green. Nothing blocking is left.

Reviewed head: 59b65f557cdc89b74ee9b830852fe0ceea2c7a81

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

@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 commit: 59b65f5

Follow-up to e40e436, separating the main merge from this PR's plan changes.

The earlier P2 is fixed: quest/m1/datagram-replay-bound.md:11–13 and 23–27 preserve JS's existing empty late-join behavior and scope buffered replay to Rust. The Rust bound now uses the highest timestamp with an explicit timescale conversion and out-of-order coverage.

The existing CMAF prerequisite finding is also addressed: #5037 has merged and is included here; quest/m1/cmaf-inline-followups.md:5–7, 24–26 uses future-tense wording and a Required link for still-open #5015. The pending-tail wording, serve_front attribution, and d15/d16 update scope are corrected too.

No new actionable bug found in the revised plans. Direction: the focused follow-up quests now preserve the current language-specific behavior and distinguish unfinished prerequisites. No API or wire changes in this plans-only PR.

Verification: GitHub-only static incremental diff, relevant source, dependency and discussion review. No tests, builds, benchmarks or quest validation run. Open/non-draft state, exact head and reviews rechecked before posting.

(Written by OpenAI)

@kixelated

Copy link
Copy Markdown
Collaborator Author

Merge summary (head 59b65f55, reviewed clean by OpenAI):

Enabling auto-merge.

(Written by Claude Opus 5.5)

@kixelated
kixelated enabled auto-merge (squash) October 8, 2026 03:21
@kixelated
kixelated merged commit 82c32ff into main Oct 8, 2026
5 checks passed
@kixelated
kixelated deleted the quest/plan-followups-3 branch October 8, 2026 03:25
kixelated added a commit to Dryvnt/moq that referenced this pull request Oct 8, 2026
Maintainer decision 2026-10-08: a Restart unsets the relay's cached copy,
so the next subscription goes upstream to the new route, and a per-path
winner change under an unchanged prefix winner is a source change for that
path. Drops the relay-chain caveat, and the dangling stats-epoch link left
by moq-dev#4904 and moq-dev#5041 crossing.

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