Skip to content

fix(migrate)!: align guides with released APIs - #6624

Merged
kixelated merged 4 commits into
mainfrom
quest/m1/api-audit/migrate
Oct 24, 2026
Merged

kixelated merged 4 commits into
mainfrom
quest/m1/api-audit/migrate

Conversation

@kixelated

@kixelated kixelated commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator

Takes over the stale quest/m1/api-audit/migrate branch: its last push was 2026-10-22 and its PR moq-dev/moq#6443 was closed without comment. Builds on its commits (merge only, no rewrite). Implements and deletes quest/m1/api-audit/migrate.md.

Problem

Migration guides mixed released APIs with intermediate main-only shapes, omitted real breaks, and gave contradictory broadcast-finish advice, so a reader upgrading from release could not follow them.

Approach

Every ## Unreleased entry the quest named was checked against origin/release (and the published tag where it mattered), then rewritten as the direct upgrade from release.

From the stale branch (570fb39b57), kept:

  • Bindings: async shutdown in rs/moq-ffi and the py, go, kt, and dart wrappers; init track moving to MoqMediaTarget::Named; raw tracks now untimed by default, against release's microsecond default.
  • Generated binding guides (go/ffi, py/moq-ffi, kt/moq-ffi, swift/ffi, dart/moq_ffi) point at rs/moq-ffi/MIGRATE.md instead of a partial copy. cpp/moq (never tagged) and @moq/clock (an unpublished example on release) get a first-release note.
  • rs/moq-net track-end positions and transport-error mapping; rs/hang and js/hang per-track timelines and Container.Read; rs/moq-archive version 1 to 3 and the Key::Groups removal; rs/moq-hls tagged segments; rs/moq-video frame import names; opt-in iroh in rs/moq-cli; dropped the main-only Writer, Info::epoch, Config::timebase, and JS Encoder.cut() stories.
  • The moq_transcode::Rung::size to short_side rename and its entry.

Added in this takeover:

  • Merged 167 commits of main. The generated-binding pointers replace the per-language copies of entries main added since (all present in rs/moq-ffi); the Dart-generator-only future cancellation entry stays in dart/moq_ffi.
  • Broadcast finish entries no longer document the linger handle, per the quest's updated plan. Release's finish() was a deprecated alias for close() (end() in Kotlin), so each entry says to call that instead. That advice stays correct once stateless broadcasts deletes finish.
  • Dropped the stale branch's rs/moq-cli "non-restartable exports refuse linger" entry: release, and the published moq-cli 0.14.8, already refused a nonzero --linger outside export ts. The quest's claim was wrong.
  • Dropped intermediate rs/moq-video stories: encode::Control did not exist on release, so "Control::cut is not rate limited" and "Control::cut returns a Result" go, and the capture entry stops describing Control::new. Kept the capture refresh advertisement and the publish_capture signature change.
  • Dropped rs/moq-archive's "Recording is driven by a broadcast producer": Producer is new since release, so nothing migrates.
  • HLS segment URIs: noted that the tag goes after any generation prefix.
  • Following moq-dev/moq#6610, PRs no longer write entries. So quest/m1/broadcast-lifecycle/stateless.md, which will reshape the finish entries, now says its Impact bullet supersedes them, for the cut to collapse. This uses the same pattern docs: write MIGRATE.md at the breaking cut, not per PR #6610 used for container-format.
  • Merged main again (fc6f5cded7). moq-dev/moq#6436 made binding shutdown() a synchronous drain request and rewrote this quest's shutdown gap, so the rs/moq-ffi, py/moq-rs, go/wrapper, kt/moq, dart/moq, and swift shutdown entries now describe the net change from release's shutdown() (an alias for cancel(0)): shutdown() returns at once and requests a drain, closed() reports its result, and cancel(0) keeps the old immediate close. The FFI, Python, Kotlin, and Swift entries map the release line's planned async drain() onto shutdown() plus closed(). Also dropped the js/publish "BroadcastInput has a linger input" entry, since moq-dev/moq#6522 removed that never-released input, and the rs/moq-net refactor(net)!: public ingest #6111 entry now names the abort error moq-dev/moq#6482 left (Error::Stream(StreamError::Session(SessionError::Cancel))).

The convention in #6610 keeps the ## Unreleased entries as the cut's starting draft, and quest/m0/migrate-at-cut.md said this PR "lands as planned". The two don't conflict.

Impact

  • Breaking Rust API: moq_transcode::Rung::size is short_side, and ladder::Error::{Empty, Unordered} fields are short_side / below_short_side. The rs/moq-transcode entry describes release's height becoming short_side (the short side, the width for portrait output). Construction, validation, and output geometry are unchanged.
  • No wire, FFI, or binding API change. Everything else is docs.

Validation

  • quest check --base origin/main: passed.
  • nix develop --command just check: passed. Rust 8,447 passed / 64 skipped, plus the js, py, kt, go, dart, cpp, OBS compile, markdown, and shell modules. Swift was skipped because this Linux host has no Swift toolchain.
  • After the fc6f5cded7 merge: nix develop --command just check passed again.
  • An earlier run failed once in dart/moq_ffi leak_test.dart ("a non-null optional argument is released": RSS 50.9 MB against a 32.8 MB bound, on a busy host). It passed on the run before and the final one. This PR touches no Dart code.

Follow-ups

  • The quest's known-gaps list held one false claim (CLI linger), so the migration audit should verify every entry against the published tag, not against release's branch head alone. Its Plan already says so.
  • Entries not on the quest's list were not re-audited. rs/moq-video showed more intermediate history (Control) than the list named, so other crates likely carry some too. That falls to the migration audit at the cut.

🤖 Generated with Claude Code

(Written by Claude Opus 5.5)

kixelated and others added 3 commits October 22, 2026 19:06
Co-Authored-By: GPT-6 <codex@openai.com>
…grate

# Conflicts:
#	cpp/moq/MIGRATE.md
#	dart/moq/MIGRATE.md
#	dart/moq_ffi/MIGRATE.md
#	go/ffi/MIGRATE.md
#	go/wrapper/MIGRATE.md
#	js/clock/MIGRATE.md
#	kt/moq-ffi/MIGRATE.md
#	kt/moq/MIGRATE.md
#	py/moq-ffi/MIGRATE.md
#	py/moq-rs/MIGRATE.md
#	quest/m1/api-audit/migrate.md
#	rs/hang/MIGRATE.md
#	rs/moq-cli/MIGRATE.md
#	rs/moq-ffi/MIGRATE.md
#	rs/moq-hls/MIGRATE.md
#	rs/moq-net/MIGRATE.md
#	rs/moq-video/MIGRATE.md
#	swift/MIGRATE.md
#	swift/ffi/MIGRATE.md
@kixelated
kixelated marked this pull request as ready for review October 24, 2026 07:24
@coderabbitai

coderabbitai Bot commented Oct 24, 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 15 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: 80d82d84-a4f6-40ef-a034-c9a38c6915a2
Commits

Reviewing files that changed from the base of the PR and between 9b3afb6 and fc6f5cd.

Files selected for processing: 27
  • cpp/moq/MIGRATE.md
  • dart/moq/MIGRATE.md
  • dart/moq_ffi/MIGRATE.md
  • go/ffi/MIGRATE.md
  • go/wrapper/MIGRATE.md
  • js/clock/MIGRATE.md
  • js/hang/MIGRATE.md
  • js/publish/MIGRATE.md
  • kt/moq-ffi/MIGRATE.md
  • kt/moq/MIGRATE.md
  • py/moq-ffi/MIGRATE.md
  • py/moq-rs/MIGRATE.md
  • quest/m1/api-audit/README.md
  • quest/m1/api-audit/migrate.md
  • quest/m1/broadcast-lifecycle/stateless.md
  • rs/hang/MIGRATE.md
  • rs/moq-archive/MIGRATE.md
  • rs/moq-cli/MIGRATE.md
  • rs/moq-ffi/MIGRATE.md
  • rs/moq-hls/MIGRATE.md
  • rs/moq-net/MIGRATE.md
  • rs/moq-transcode/MIGRATE.md
  • rs/moq-transcode/src/catalog.rs
  • rs/moq-transcode/src/ladder.rs
  • rs/moq-video/MIGRATE.md
  • swift/MIGRATE.md
  • swift/ffi/MIGRATE.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 24, 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-24T15:18:44.282969Z fc6f5cd 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.

@kixelated

Copy link
Copy Markdown
Collaborator Author

Outcome: the quest is implemented and its file removed. This takes over the stale branch from moq-dev/moq#6443, merges 167 commits of main, and corrects it against release and the published tags.

Corrections beyond the stale branch:

  • The broadcast finish entries say to call close() (end() in Kotlin), not to use the linger handle.
  • The CLI linger entry is dropped, because published moq-cli 0.14.8 already refused a nonzero --linger.
  • Intermediate encode::Control stories are dropped from moq-video, and the additive archive Producer story is dropped.
  • The shutdown and stateless quests now say their Impact bullet supersedes these entries, for the cut to collapse.

Codex reviewed head 364473a with no findings (thumbs-up), and CI is green. CodeRabbit was rate limited. Locally, just check and quest check --base origin/main passed; Swift was not run (no toolchain on Linux).

(Written by Claude Opus 5.5)

…grate

Keeps this PR's deletion of quest/m1/api-audit/migrate.md and main's
deletion of quest/m1/ffi-shutdown-sync.md (finished by #6436).

Main's #6436 made binding shutdown a synchronous drain request again, so
the shutdown entries now describe the net change from release's
cancel(0): shutdown() drains, closed() reports the result, cancel(0)
closes at once. Also drops the js/publish linger entry #6522 made moot
and names the abort error #6482 left behind.

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

Copy link
Copy Markdown
Collaborator Author

Merged main at fc6f5cded7 and landing it.

  • Conflicts: kept this PR's deletion of quest/m1/api-audit/migrate.md and main's deletion of quest/m1/ffi-shutdown-sync.md (finished by moq-dev/moq#6436).
  • moq-dev/moq#6436 rewrote the quest's shutdown gap, so the binding shutdown entries (rs/moq-ffi, py/moq-rs, go/wrapper, kt/moq, dart/moq, swift) now describe the net change from release, where shutdown() was cancel(0): it returns at once and requests a drain, closed() reports the result, and cancel(0) keeps the immediate close.
  • Dropped the js/publish linger entry that moq-dev/moq#6522 made moot, and updated the rs/moq-net refactor(net)!: public ingest #6111 abort error after moq-dev/moq#6482.
  • just check and quest check --base origin/main pass. Codex approved the new head.

(Written by Claude Opus 5.5)

@kixelated
kixelated added this pull request to the merge queue Oct 24, 2026
Merged via the queue into main with commit 89492e3 Oct 24, 2026
11 checks passed
@kixelated
kixelated deleted the quest/m1/api-audit/migrate branch October 24, 2026 16:25
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