Skip to content

quest: import #7067, #7088, #7101 and #7102 - #7124

Merged
kixelated merged 9 commits into
mainfrom
quest-plan/import-7067-7102
Oct 28, 2026
Merged

kixelated merged 9 commits into
mainfrom
quest-plan/import-7067-7102

Conversation

@kixelated

@kixelated kixelated commented Oct 28, 2026 •

Copy link
Copy Markdown
Collaborator

Problem

Four open issues had no quest: #7102, #7101, #7088 and #7067. This PR plans them from a maintainer interview on 2026-10-28. It mentions the issues without closing them; each one closes with the quest that finishes it.

Approach

Plan-only. New quests, all in m1:

Aligned existing quests:

  • obs-source-renditions and 2848: they assumed viewers deselect a disabled rendition; both now hold.
  • time-addressing/consumers: feat(moq-c)!: supply bitrate and group duration hints #7068's group_duration_us hint becomes the join-interval declaration.
  • ts-reliability: the catalog-hold out-of-scope note gains its restart exception.

Root causes found while importing:

Decisions

#7102

#7101

  • Fixes:
    • ✅ Watch holds disabled renditions
    • ✅ Publisher keeps its encoder
    • ✅ Mute that keeps capture open
    • ✅ Publisher head buffer, later replaced by always-on encoding
  • Hold scope:
    • Audio only
    • ✅ Audio and video, default on
    • Opt-in flag
  • Hold parity: ✅ every first-party consumer, and weaken the spec to "should not select" (user's wording).
  • DTX vs hold: hold (asked and explained; the user did not pick DTX).
  • Encode without demand: ✅ audio and video, always-on by default in every language, with on-demand opt-in (user's wording). Rejected: a raw-frame backbuffer for video.
  • Raw audio on demand (user's proposal):
    • ✅ Becomes audio's default
    • Opt-in only
    • Defer to m3
  • Stay on-demand by default: ✅ moq-transcode rungs, ✅ moq-boy, ✅ CARLA.

#7088

#7067

  • Direction:
  • Hang churn:
    • ✅ Quantize the rise
    • Same settle as MSF
    • Leave as is
  • MSF: ✅ dedupe and hold the first publish until estimates are made (user's wording).
    • ✅ First group closes, then frozen
    • Big rises republish
    • Fixed window
  • Opt-out:
    • ✅ No opt-out
    • Per-track opt-out
  • HLS pointer: superseded by time-addressing/consumers (user's pointer).

Placement

  • Milestones:
    • Proposed m1/m2 split
    • ✅ All in m1
    • TS and join only

Follow-ups (settled after the first review, while #7124 was queued)

  • moqx refusing the joining FETCH:
  • feat(moq-c)!: supply bitrate and group duration hints #7068:
    • ✅ Review it now (posted)
    • Leave it
    • Takeover quest
  • Mute shape:
    • ✅ muted keeps the mic
    • New attribute
    • Library path only
  • invisible: ✅ symmetric, so the camera stays open and removing source releases both (user's wording); keep releasing
  • Unwatched rendition bitrate:
    • ✅ Configured bitrate
    • Last grant, else configured
    • Lowest rung
  • MSF freeze, since moq-c can't hint jitter or delay and bitrate needs ~1 s:
    • ✅ The later of the first group closing and a minimum duration (user's wording; set to RATE_WINDOW, 1 s)
    • Per field
    • First group, absent stays
    • Fixed window

The merge from main dropped catalog-identity-rs.md (landed in #7110), so catalog-estimates now links that PR instead.

Impact

Public API: none in this PR. Wire: none.

🤖 Generated with Claude Code

(Written by Claude Opus 5.5)

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

coderabbitai Bot commented Oct 28, 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
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 79b57dc2-1935-49b8-9fe4-16a75869ce4c
Commits

Reviewing files that changed from the base of the PR and between ca90117 and d5595b8.

Files selected for processing: 21
  • quest/m1/README.md
  • quest/m1/catalog-estimates.md
  • quest/m1/eager-encode/README.md
  • quest/m1/eager-encode/audio.md
  • quest/m1/eager-encode/cli.md
  • quest/m1/eager-encode/js.md
  • quest/m1/eager-encode/raw-audio.md
  • quest/m1/eager-encode/video.md
  • quest/m1/ietf-js-join.md
  • quest/m1/push-to-talk/README.md
  • quest/m1/push-to-talk/hold-js.md
  • quest/m1/push-to-talk/hold-rs.md
  • quest/m1/push-to-talk/mute.md
  • quest/m1/push-to-talk/reenable.md
  • quest/m1/time-addressing/consumers.md
  • quest/m1/ts-reliability/README.md
  • quest/m1/ts-reliability/export-reacquire.md
  • quest/m1/ts-reliability/restart-catalog.md
  • quest/m1/ts-reliability/step-restart.md
  • quest/m2/2848-follow-the-bandwidth-grant-in-moq-audio-instead-of.md
  • quest/m2/obs-source-renditions.md
  • 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 28, 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-28T20:10:57.870009Z d5595b8 New commits
ℹ️ 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: 9187b77f99

ℹ️ 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 quest/m1/push-to-talk/README.md Resolved

@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: 9187b77

P2: Preserve the capture timeline when removing the audio reset (quest/m1/push-to-talk/reenable.md:16-23). The current encoder explicitly resets across a timestamp gap because Chrome derives output timestamps from its first input plus encoded samples, ignoring later input jumps (js/publish/src/audio/encoder.ts:693-702). Keeping that encoder across a mute without a replacement clock correction makes resumed chunks trail capture time by the mute duration; the output callback forwards frame.timestamp directly. Require explicit output timestamp rebasing, or retain the reset while caching only the probe/config. Add a multi-second mute regression that checks resumed timestamps against capture time, not merely that a frame was emitted without reset.

Also agree with the existing performance-validation finding: retain the reporter's random-loss setup as a reproduction, but include a constrained-link/finite-queue acceptance test (#7124 (comment)). No duplicate inline comment added.

Direction: separating restart supervision, held subscriptions, and bounded raw-audio buffering is sensible; preserving the audio clock is essential to the proposed latency improvement. These are plans, not implemented fixes. Static review of the changed plans and relevant existing paths only; no tests, browser runs, or latency measurements performed.

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 commit: 9e7148f

Follow-up on the single planning change since 9187b77: the independent performance-validation finding is addressed in quest/m1/push-to-talk/README.md:36-44. Acceptance now requires a constrained link with a deep, finite queue; random loss is retained only to reproduce the reporter's numbers. This is a better separation of acceptance from reproduction.

The earlier audio timestamp-rebasing P2 remains open: quest/m1/push-to-talk/reenable.md is unchanged (#7124 (review)). No new actionable bugs found in this delta.

Static plan review only. No implementation, tests, browser runs, or latency measurements verified.

…ow capture

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

Copy link
Copy Markdown
Collaborator Author

Addressing the P2 from #7124 (review) (audio timestamps across a mute): agreed. reenable.md now caches only the probe result (settings and decoder description) and keeps the reset at a timestamp gap. Chrome stamps output from its first input plus the samples encoded since, so a kept encoder would trail capture time by the mute's length. Rebasing timestamps by hand is listed as rejected, and the tests check resumed timestamps against capture time after a multi-second mute.

This narrows the "publisher keeps its encoder" pick to "keeps its probe". The saving was the probe anyway, and the reset only drops chunks from before the gap.

(Written by Claude Opus 5.5)

@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: 2bb8fee

The prior audio timestamp P2 is addressed in the plan: quest/m1/push-to-talk/reenable.md now caches only the probe result, preserves reset/reconfigure across timestamp gaps, and requires resumed timestamps to match capture time after a multi-second mute. The epic summary agrees. Retaining the existing clock correction is simpler and safer than introducing a second output timestamp clock.

The congestion-validation correction from the previous review remains intact. No new actionable bugs found in this two-file delta.

Static planning review only. This fixes the proposed design, not runtime behavior; implementation, tests and browser/latency measurements were not run.

@kixelated

Copy link
Copy Markdown
Collaborator Author

Merging. This plans #7067, #7088, #7101 and #7102 as m1 quests from the 2026-10-28 maintainer interview; the decisions are in the PR body.

Two review fixes came after it opened:

  • push-to-talk acceptance is gated on bufferbloat, not random loss;
  • re-enable caches the probe but keeps the timestamp-gap reset, so resumed audio keeps capture timestamps.

Codex found nothing on 2bb8fee, the required check is green, and quest check --base origin/main passes.

(Written by Claude Opus 5.5)

@kixelated
kixelated added this pull request to the merge queue Oct 28, 2026
`muted` and `invisible` disable only the encoder and keep capture open; an
unwatched rendition encodes at its configured bitrate; ietf-js-join links
the moqx joining-FETCH report.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Oct 28, 2026
kixelated and others added 3 commits October 28, 2026 13:05
Bitrate is measured over RATE_WINDOW, so freezing at the first group close
would leave 20 ms audio groups without one.

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

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 commit: b838f62

P2 — Preserve the element lifecycle gate when separating mute from capture (quest/m1/push-to-talk/mute.md:23-28). Having source and Capture follow source alone also bypasses the existing #enabled gate. disconnectedCallback() only clears #enabled, deliberately retaining the source selection (js/publish/src/element.ts:355-359, 425-431). Following this plan literally would leave microphone/camera capture active after the element is removed from the document. Keep capture gated by the element's lifecycle-enabled state plus its selected source, independent of muted/invisible; add detach/reconnect coverage alongside the source-removal test.

Direction: configured bitrate for unwatched renditions avoids stale grant state, and waiting through the bitrate estimation window makes the MSF freeze better specified. Reusing mute/hide controls is simpler than adding another flag, provided lifecycle cleanup remains intact. The earlier timestamp-reset and congestion-validation findings remain fixed in the plan.

Reviewed the substantive planning delta since 2bb8fee, excluding upstream base changes, with relevant current code. Static review only; no implementation, tests, browser runs or latency measurements executed.

Detaching the element only clears #enabled, so capture following source alone would stay open after removal.

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

Copy link
Copy Markdown
Collaborator Author

Agreed, and fixed in the latest push: capture now follows the element's lifecycle gate (#enabled, which disconnectedCallback clears) plus source, and stays independent of muted/invisible. The tests now also cover detaching and reattaching the element.

(Written by Claude Opus 5.5)

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

The prior lifecycle-gating P2 is fixed in the plan: quest/m1/push-to-talk/mute.md:24-28 now retains #enabled alongside source selection, independent of mute/hide; lines 41-44 require detach/reconnect coverage. This preserves device release when the element leaves the document without adding another mute control.

No new actionable bugs found in this one-file delta. Earlier timestamp-reset and congestion-validation corrections are unchanged. Static planning review only; runtime behavior, tests and browser measurements were not executed or verified.

@kixelated
kixelated added this pull request to the merge queue Oct 28, 2026
Merged via the queue into main with commit 396fc0c Oct 28, 2026
10 checks passed
@kixelated
kixelated deleted the quest-plan/import-7067-7102 branch October 28, 2026 20:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant