Skip to content

feat(rate)!: native publishers disable simulcast rungs the grant cannot fund - #6781

Merged
kixelated merged 22 commits into
mainfrom
quest/m1/simulcast-rung-disable
Oct 27, 2026
Merged

kixelated merged 22 commits into
mainfrom
quest/m1/simulcast-rung-disable

Conversation

@kixelated

@kixelated kixelated commented Oct 25, 2026 •

Copy link
Copy Markdown
Collaborator

Quest: quest/m1/simulcast-rung-disable.md. This PR lands the Rust/FFI/C publishers and rewrites the quest to the remaining OBS work and the shaped-uplink proof.

Summary

  • Rule (moq_mux::rate): Policy::lower sets a band boundary at (max + 2 * lower) / 3. Below it, Control::update / Follower::next yield rate::Target::Disabled. The rung resumes once the grant reaches boundary + 5%, restarting at the boundary and ramping 25%/s. A policy without lower (the lowest rendition) never disables.
  • Sender gate (moq_net::bandwidth): a rung disables only while a session probes for its reservation, via the new Consumer::probed(). A session counts only when its transport has a sender, i.e. it took the allocator's target, and none counts while Allocator::set_target(Some(Rate::ZERO)) turns probing off.
  • Recovery without demand: an idle reservation reads the share it would get, still claiming nothing from its siblings. A disabled rung whose viewers left can therefore resume. Mirrored in js/net.
  • FFI video producer: takes lower: Option<MoqVideoProducer> and sits one track priority below it.
    • While disabled it drains the encoder, marks a discontinuity, and advertises enabled: false.
    • It reopens on a keyframe at its ceiling. The advertised maximum never moves.
    • It refuses a lower without bandwidth, or one whose ceiling is not below its own.
    • Each encoder publishes its ceiling on a kio channel that closes when it finishes. A rung watches its lower rendition's channel, so it notices that rendition moving or ending even if the lower one reserves nothing or uses another allocator. The C encoder does the same.
  • C: moq_encode_video takes a moq_video_encode_options holding bandwidth and lower, in place of its positional bandwidth. NULL or zeroed is the old unadapted behavior; new fields append. The options are validated before the encoder opens.
  • Bindings: Python, Swift, and Go pass lower. Kotlin and Dart alias the regenerated options record. Docs and MIGRATE notes are updated. cpp/moq and cpp/obs use the generated moq-ffi package, not moq-c, so the C struct does not reach them.
  • Policy changes: Follower::set_policy starts over at the ceiling only for a new max or min. A new lower alone (the lower rendition retuned or finished) keeps the applied target and ramp, since nothing retuned this sender. A target dropped because the policy moved before it was applied is taken back (Follower::failed) and asked for again (both from Codex review).
  • Rung state holes (Codex review of the main merge): a disabled rung whose failed resume falls back under the margin drops its retry deadline, which otherwise spun the follower on a fired timer while it held the encoder lock. A rung whose applied target is under its boundary (probing just started, or the lower rendition rose) disables on a grant below it rather than being held on by the deadband; on a grant above it, it keeps ramping.
  • Model test: rate::tests::model replays seeded proptest walks of grants, jitter, probing flips, lower/max/min changes, refused changes, and time through Control the way Follower drives it. After every wake it checks: no deadline is already due, the target stays within [min, max], a rung disables only while probed, under its boundary, and outside the deadband, a disabled rung resumes once probed with the grant at boundary + 5%, and a policy without lower never disables. It catches both state holes above when either fix is reverted, and runs in under a second. Follower::set_policy moved onto Control so the model drives the same code.
  • Capture: moq-video's capture path is single-rendition, so it sets no lower and never disables.
  • Quest: the rewritten Plan records that the BBR3 estimate this rule reads can stay high for 20 s or more after the path drops (update_max_bw never ages an app-limited max_bw, measured in moq-dev/moq#6635); a separate quest fixes that.

Impact

  • Wire: none (enabled already exists in the catalog).
  • Breaking, moq-mux:
    • rate::Follower::next / poll_next return rate::Target. Match Target::Enabled(rate) where you took the rate.
    • Control::update returns Option<Target>.
    • Policy gains pub lower. Add lower: None to struct literals.
  • Breaking behavior, moq-net / js/net / MoqReservation::grant / moq_reservation_grant: an unwatched reservation reports its would-be share instead of None. None now means only "no estimate". A sender that relied on None to hold while unwatched should check its track's demand.
  • Additive, moq-net: bandwidth::Consumer::probed().
  • Additive, FFI: MoqVideoProducerOptions.lower (UniFFI default None).
  • Breaking, C ABI: moq_encode_video(broadcast, input, output, const moq_video_encode_options *options). Pass NULL where you passed a 0 bandwidth, or &(moq_video_encode_options){.bandwidth = bandwidth}.

Decisions

Maintainer picks (2026-10-25):

C signature for the lower rendition

  • 5th positional uint32_t lower on moq_encode_video
  • ✅ A moq_video_encode_options struct holding bandwidth and lower

Scope

  • ✅ Land the native part now, and rewrite the quest to the OBS per-encoder rung and the shaped-uplink resume proof
  • Keep this PR a draft until OBS and the shaped proof land

Prompt: "Land #6781. (1) do not add a 5th positional argument to moq_encode_video; add a moq_video_encode_options struct holding bandwidth and lower, following moq-c's struct conventions, and update every consumer. (2) Land the native part now, and rewrite the quest to what remains (the OBS per-encoder rung and the shaped-uplink resume proof). Also record in the quest's Plan that the BBR3 estimate it reads can stay high for 20 s or more after the path drops; a separate quest will fix that, so just note the dependency." ✅

Design checkpoint after four review rounds

  • ✅ Continue: fix the three Codex findings, and add a mocked-time model test of Control/Follower to catch this class of state bug in one pass
  • Merge as is
  • Split the disable rule into a separate Rung type

Choices made

  • lower references the lower producer, rather than taking a bitrate plus priority. The boundary therefore tracks the lower rung's ceiling, and the priority ordering can't be misconfigured.
  • The rule is folded into Control / Follower, which return Target, rather than living in a separate Rung type. Every follower gets the same hysteresis state.
  • MoqReservation::probed was dropped from the FFI because nothing consumes it yet. OBS adds it with its rung.
  • Constants are as the quest recommended: band at a third, 5% resume hysteresis, 25%/s ramp.
  • moq_video_encode_options follows moq_announce_config: the pointer may be NULL, a zeroed struct means the defaults, and new fields append.

Follow-ups

  • moq_encode_audio still takes bandwidth positionally (its 6th argument). A moq_audio_encode_options would match the video shape; left out of scope.

Checks

  • just check after the options struct and the main merge: pass, except one Dart RSS leak test (a non-null optional argument is released, in resolve, untouched here) that flaked under the parallel load and passes alone. Swift skipped on Linux.
  • After the second main merge (fixing two test call sites for main's typed durations) and the state-hole fixes: just check passes, with just rs test run separately. Its check flake step cannot build the github-runner image here (unshare is not permitted in the local sandbox), and CI covers it. Swift was not re-run; nothing it binds changed.
  • After the lower-ceiling watch: just check passes except the same check flake step. just rs test, cargo test -p moq-c --lib, and cargo test -p moq-ffi --lib --features openh264,testing pass. One exception is server_cancel_releases_the_bound_port (port reuse, untouched here), which hit AddrInUse under the shared host's load and passes alone.
  • just test interop --all: passed on the previous head. Not re-run: the struct change is moq-c only, and no interop client calls moq_encode_video.
  • Not run: a real shaped-uplink run, and OBS (both left in the quest).

🤖 Generated with Claude Code

(Written by Claude Opus 5.5)

kixelated and others added 8 commits October 25, 2026 02:23
Policy::lower sets a band boundary below which a rendition disables, once
a session probes for its reservation. Idle reservations read the share
they would get back, so a disabled rung resumes after its viewers left.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MoqVideoProducerOptions::lower names the next lower rendition: the rung
takes the priority below it, stops encoding and advertises itself
disabled below its band, and reopens on a keyframe once the grant
recovers. MoqReservation::probed reports whether a session probes for it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
moq_encode_video takes the next lower rendition's handle, mirroring
MoqVideoProducerOptions::lower.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Mirrors the Rust allocator: an unwatched track claims nothing from its
siblings but its own reservation reads the slice it would get back.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Python, Swift, and Go take a lower producer; Kotlin and Dart alias the
regenerated options. Docs and MIGRATE notes cover the rung and the idle
grant, and grant tests wait for their subscription to land.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated kixelated changed the title Native publishers disable simulcast rungs the grant cannot fund feat(rate)!: native publishers disable simulcast rungs the grant cannot fund Oct 25, 2026
kixelated and others added 2 commits October 25, 2026 08:36
Replace the positional bandwidth and lower handles with a struct that
holds both, validated before the encoder opens. NULL or zeroed keeps the
unadapted behavior, and new fields append. The quest notes the BBR3
max_bw aging it depends on.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated
kixelated marked this pull request as ready for review October 25, 2026 16:50
@coderabbitai

coderabbitai Bot commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

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 3 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: b55debd8-cbff-44a0-8af9-79c069a493ed
Commits

Reviewing files that changed from the base of the PR and between def2ee5 and 4b01197.

Files ignored due to path filters: 1
  • Cargo.lock is excluded by !**/*.lock
Files selected for processing: 40
  • cpp/obs/src/moq-rate.h
  • dart/moq_ffi/lib/src/moq.dart
  • doc/lib/c/index.md
  • doc/lib/cpp/index.md
  • doc/lib/dart/index.md
  • doc/lib/go/index.md
  • doc/lib/js/net.md
  • doc/lib/kt/index.md
  • doc/lib/py/index.md
  • doc/lib/swift/index.md
  • go/wrapper/session.go
  • go/wrapper/video/video.go
  • js/net/src/bandwidth.test.ts
  • js/net/src/bandwidth.ts
  • js/net/src/connection/bandwidth.test.ts
  • py/moq-rs/moq/session.py
  • py/moq-rs/moq/video.py
  • quest/m1/README.md
  • quest/m1/simulcast-rung-disable.md
  • quest/m2/probe/README.md
  • rs/moq-c/MIGRATE.md
  • rs/moq-c/c-tests/decode-output.c
  • rs/moq-c/src/bandwidth.rs
  • rs/moq-c/src/test.rs
  • rs/moq-c/src/video.rs
  • rs/moq-ffi/MIGRATE.md
  • rs/moq-ffi/src/bandwidth.rs
  • rs/moq-ffi/src/test.rs
  • rs/moq-ffi/src/video.rs
  • rs/moq-mux/Cargo.toml
  • rs/moq-mux/MIGRATE.md
  • rs/moq-mux/src/codec/h264/import.rs
  • rs/moq-mux/src/codec/h265/import.rs
  • rs/moq-mux/src/codec/video.rs
  • rs/moq-mux/src/rate.rs
  • rs/moq-net/MIGRATE.md
  • rs/moq-net/src/model/bandwidth.rs
  • rs/moq-video/src/encode/producer.rs
  • swift/Sources/Moq/Bandwidth.swift
  • swift/Sources/Moq/Video.swift

No actionable comments were generated in the recent review.

Recent review info
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: 979fb774-6598-495f-815e-6dbc3ccc8896
Commits

Reviewing files that changed from the base of the PR and between d7ee6bf and def2ee5.

Files ignored due to path filters: 1
  • Cargo.lock is excluded by !**/*.lock
Files selected for processing: 12
  • doc/lib/c/index.md
  • doc/lib/cpp/index.md
  • doc/lib/dart/index.md
  • doc/lib/go/index.md
  • doc/lib/kt/index.md
  • doc/lib/py/index.md
  • doc/lib/swift/index.md
  • quest/m1/README.md
  • rs/moq-c/src/test.rs
  • rs/moq-c/src/video.rs
  • rs/moq-ffi/src/test.rs
  • rs/moq-ffi/src/video.rs
Files skipped from review as they are similar to previous changes: 1
  • quest/m1/README.md

Included review availability: This review used your included allowance. Your plan provides up to 4 included reviews per hour; 0 remain after this review.

Walkthrough

Idle reservations now report their prospective bandwidth share, and consumers expose probe-state changes. Rate following can disable a linked rendition when its grant is insufficient and resume it when funding recovers. C and FFI video producers apply these targets by stopping or reopening encoders and updating rendition state. Language bindings, tests, and documentation add the lower-rendition option and describe the related behavior.

Priority: Normal

Merge Risk: Low · previous review def2e

Linked-rung setup may fail when readers follow the guides, and changing rung bitrates into an invalid order can stop adaptive disabling. These bounded issues are mergeable with owner awareness.

Pre-merge checks: Passed 4 · Failed 1

Failed Failed checks: 1 warning

Check name Status Explanation Resolution
Docstring Coverage Warning Docstring coverage is 78.26% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 184 functions across 23 files. (8 skipped… Write docstrings for the functions missing them to satisfy the coverage threshold.
Passed Passed checks: 4 passed
Check name Status Explanation
Title check Passed The title names the main change: native publishers (Rust, FFI, C) disable simulcast renditions whose bandwidth grant cannot fund them. The changeset adds this rung-disable behavior in moq-mux rate con…
Description check Passed The description matches the changeset. It links the quest, explains the rate rule (Policy::lower, the boundary, and the 5% resume margin), the probing gate via Consumer::probed(), the idle reservation…
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Full details: Title check

Explanation

The title names the main change: native publishers (Rust, FFI, C) disable simulcast renditions whose bandwidth grant cannot fund them. The changeset adds this rung-disable behavior in moq-mux rate control, moq-net probing, the FFI and C video producers, and the C options struct. The title is specific, concise, and matches the primary objective. The breaking marker (!) also matches the documented breaking API changes.

Full details: Description check

Explanation

The description matches the changeset. It links the quest, explains the rate rule (Policy::lower, the boundary, and the 5% resume margin), the probing gate via Consumer::probed(), the idle reservation change, the FFI and C producer changes, the moq_video_encode_options struct, binding updates, and breaking changes. It also records the maintainer decisions, checks run, and follow-ups.

Full details: Docstring Coverage

Explanation

Docstring coverage is 78.26% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 184 functions across 23 files. (8 skipped: 8 unsupported.)

Resolution

Write docstrings for the functions missing them to satisfy the coverage threshold.

Finishing Touches
✨ Simplify code
  • Commit to this branch
  • Create a new PR
  • 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 25, 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-27T01:54:21.491381Z 4b01197 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: a82a81d598

ℹ️ 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-ffi/src/video.rs Outdated

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

Confirmed the existing P2 lower-ceiling target finding #6781 (comment) at rs/moq-ffi/src/video.rs:887 and rs/moq-c/src/video.rs:290. Lower-only updates reset the follower’s remembered target to max without retuning the encoder. If the resulting grant equals max, no update/deadline is emitted and the encoder stays below its intended rate. Preserve actual target/ramp or explicitly synchronize the reset with the encoder; cover a two-rung lower-ceiling change.

Direction: common-controller disable/resume and non-claiming idle reservations are coherent; policy updates need that state correction.

Verification: static controller, allocator, native/C publisher, bindings and tests inspection. No tests or shaped-uplink/OBS verification.

Follower::set_policy reset the target to the ceiling on any policy
change, but a lower rendition moving or finishing never retuned this
sender, so a grant at the ceiling read as already applied and the
encoder stayed below it. Only a new ceiling or floor starts over now.

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

@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: 30c4025942

ℹ️ 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-ffi/src/video.rs
When the policy moves between a follower's target and its apply, the
target is dropped unapplied. Now that a moved lower rendition keeps the
follower's state, it would count that target applied, so a disable could
leave the encoder running. Roll it back before installing the policy.

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

Copy link
Copy Markdown
Collaborator Author

Maintainer decision (2026-10-25): options struct. moq_encode_video takes a moq_video_encode_options holding bandwidth and lower, rather than a 5th positional argument.

The hand-written moq-c ships at this cut with parity, so the C half belongs in this PR.

(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: f8a24df, compared with a82a81d.

The previous lower-ceiling finding #6781 (comment) is fixed: lower-only policy changes preserve the applied target and ramp. The independent unapplied-target race #6781 (comment) is also addressed by rolling back before replacing the policy in both native bindings.

No new actionable bugs found in this delta. These focused state-preservation fixes are the right direction and include regression tests.

Verification: static inspection of both commits, controller/caller interactions and added tests; tests and shaped-uplink/OBS scenarios were not run.

@kixelated

Copy link
Copy Markdown
Collaborator Author

Landing summary:

  • moq_encode_video takes a moq_video_encode_options { bandwidth, lower } in place of the positional bandwidth. NULL or zeroed keeps the old unadapted behavior (maintainer decision).
  • The native part lands now. The quest is rewritten to what remains: the OBS per-encoder rung and the shaped-uplink resume proof. Its Plan now records the dependency on BBR3 aging an app-limited max_bw (moq-dev/moq#6635).
  • Both Codex findings are fixed with regression tests. A lower-only policy change keeps the applied target. A target dropped for a moved policy is taken back and retried.
  • The OpenAI review of f8a24df found nothing new. Local just check passed except one Dart RSS leak test that flakes under parallel load and passes alone.

(Written by Claude Opus 5.5)

kixelated and others added 2 commits October 25, 2026 20:50
# Conflicts:
#	rs/moq-c/src/video.rs
#	rs/moq-ffi/src/video.rs
Rate control holds a rung enabled unless a session probes for it, since
nothing else could raise the estimate to resume it.

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: def2ee5, compared with the last published review at 80ab074 and accounting for intervening main merges.

The independent probing-prerequisite documentation finding is addressed consistently across the native binding guides. This correctly makes the existing probing gate explicit rather than promising disable/resume on every transport. Earlier controller, rollback and lower-ceiling notification fixes remain intact.

No new actionable bugs found in this delta. The focused documentation correction is the right direction; the other changes come from main integration, including broadcast-child lifecycle handling and its C test adaptation.

Verification: static diff and affected native lifecycle-path inspection. Tests, OBS and shaped-uplink scenarios were not independently run.

@kixelated

Copy link
Copy Markdown
Collaborator Author

Re-landing after the queue dropped this PR for a merge_conflict. I merged main in with a merge commit.

  • moq-c and moq-ffi video: the conflicts came from main's broadcast-children lifecycle (moq-dev/moq#6740). Finished became Children, publish_finish now takes its handle id, and MoqVideoProducer is registered through children.insert/adopt. This PR's optional encoder, kio ceiling channel, lower and priority are kept on top.
  • New caller from main: a moq-c test passed the old bandwidth argument to moq_encode_video. It now passes null options.
  • CodeRabbit's doc finding: fixed in a separate commit. Every binding guide now says a rung only disables while the session probes.

Validation:

  • just check passes except for nix flake check, which can't run on this host because user namespaces are unavailable; the merge queue runs it.
  • The selected Rust tests pass: 10473 run, 0 failed.
  • quest check against origin/main passes.
  • The OpenAI review of def2ee5d00 found nothing new.

(Written by Claude Opus 5.5)

@kixelated
kixelated added this pull request to the merge queue Oct 26, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to no response for status checks Oct 26, 2026
@kixelated

Copy link
Copy Markdown
Collaborator Author

Re-landing after the merge queue dropped this PR on checks_timed_out (queue overload; the PR's own required checks pass).

  • No code changes. Head def2ee5d00 is unchanged and still merges cleanly with current main.
  • Verified locally against main at 8810d73651: quest check passes on the head and on the merged tree, and cargo check --all-targets of moq-net, moq-mux, moq-video, moq-ffi and moq-c passes on the merged tree (main's moq-net sealed segments and moq-video GPU export landed since the last merge).
  • Reviews: every Codex thread was fixed and replied to; CodeRabbit and the OpenAI review of def2ee5d00 found nothing new.

(Written by Claude Opus 5.5)

@kixelated
kixelated added this pull request to the merge queue Oct 26, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Oct 26, 2026
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated

Copy link
Copy Markdown
Collaborator Author

Merged origin/main (head 47f86d5) after the queue dropped this on a conflict. The only conflict was rs/moq-mux/MIGRATE.md: this PR's "Rate following can disable a simulcast rung" entry and main's "Repeated MSF track names and PMT PIDs keep the last entry" (#6827) both landed at the top of Unreleased; both are kept, this PR's first. No code changes.

Checks on the merged head: just check passes for every selected lane except check flake, which cannot build the github-runner image locally (unshare is refused in this sandbox); the merge queue covers it. Swift skipped on Linux. just test interop --all passes. Codex reviewed the new head with no findings, and every earlier finding is fixed and replied to.

(Written by Claude Opus 5.5)

@kixelated
kixelated added this pull request to the merge queue Oct 26, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Oct 27, 2026
Resolve moq-c and moq-ffi MIGRATE.md Unreleased entries by keeping both,
newest first, and regenerate the Dart bindings with both the
MoqVideoProducer and MoqVideoRead optional converters.

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

Copy link
Copy Markdown
Collaborator Author

Requeued after the merge_conflict exit at 2026-10-27T01:01:26Z. Merged origin/main at 4b01197:

  • rs/moq-c/MIGRATE.md, rs/moq-ffi/MIGRATE.md: kept both Unreleased entries, this PR's first (newest), then main's decoder-read entries.
  • dart/moq_ffi/lib/src/moq.dart: regenerated with just generate, so it holds both FfiConverterOptionalMoqVideoProducer (this PR) and FfiConverterOptionalMoqVideoRead (main); the API checksums match the previous head.

Checks: just check passes (the check flake lane skips locally because unshare is refused; CI covers it). just test interop --all passes.

(Written by Claude Opus 5.5)

@kixelated
kixelated added this pull request to the merge queue Oct 27, 2026
Merged via the queue into main with commit 83d97be Oct 27, 2026
11 checks passed
@kixelated
kixelated deleted the quest/m1/simulcast-rung-disable branch October 27, 2026 03:12
kixelated added a commit that referenced this pull request Oct 27, 2026
Carry the renames into #6781 (simulcast rungs): MoqAllocator option types,
Reservation::rate()/consume(), moq_allocator_* in the C tests, and keep
both sides of the Unreleased MIGRATE entries. Rename main's new
track::Consumer::query() and JS writeGroup callers, and regenerate the Dart
bindings.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant