diff --git a/quest/m1/README.md b/quest/m1/README.md index 53c6e6ef69f..9655102d79e 100644 --- a/quest/m1/README.md +++ b/quest/m1/README.md @@ -108,7 +108,6 @@ lite-07 stream type here. - [Recovery verdicts](/quest/m1/recovery-verdicts.md) - group recovery refetches only on errors a new copy can fix, so a repeating error ends the group instead of looping - [Rust resume holds a declared end](/quest/m1/resume-rust-end.md) - a resumed Rust track keeps a declared end across copies, dedupes flapping copies, and judges retention inside the reader's window - [WebGPU on Safari](/quest/m1/webgpu-safari.md) - the WebGPU renderer is verified on Safari 26 for macOS and iOS -- [Binding linger](/quest/m1/linger-ffi.md) - `moq-ffi` and every binding finish a broadcast cleanly, so subscribers drain it until its media is stale - [Interop finish](/quest/m1/interop-finish.md) - the interop matrix proves a clean broadcast finish across implementations - [Exporters follow a rendition to a new track](/quest/m1/export-rendition-rebind.md) - the fMP4, TS, MKV and FLV exporters rebuild a rendition whose resolved `track` or `broadcast` changes under the same ID - [fMP4 import unwraps to Legacy](/quest/m1/fmp4-import-unwrap.md) - fMP4 and HLS imports publish per-sample `Legacy` frames unless `--passthrough` asks for CMAF, and no first-party producer defaults to CMAF diff --git a/quest/m1/c/README.md b/quest/m1/c/README.md index 21f89be52cf..4fff85ea948 100644 --- a/quest/m1/c/README.md +++ b/quest/m1/c/README.md @@ -53,7 +53,6 @@ That change owns its C tests and `MIGRATE.md` entries; other API reshaping stays Decided 2026-10-20 (maintainer): m1 quests that change the C API ([exact binding timestamps](/quest/m1/binding-timestamps.md), [scope track priority](/quest/m1/track-priority-scope.md), -[binding linger](/quest/m1/linger-ffi.md), [Rust identity enforcement](/quest/m1/catalog-identity-rs.md), and [dynamic subscribe ranges](/quest/m1/subscribe-ranges/dynamic.md)) Require this line and land their C half on the generated package, so C users break once. diff --git a/quest/m1/interop-finish.md b/quest/m1/interop-finish.md index 45d2713d575..d10b4c092b9 100644 --- a/quest/m1/interop-finish.md +++ b/quest/m1/interop-finish.md @@ -9,15 +9,11 @@ in any implementation's linger shows up as a red cell. ## Plan -From [moq-dev/moq#6151](https://github.com/moq-dev/moq/pull/6151), which -gave js/net `Broadcast.Producer.finish()`. Rust, JS, and the bindings each -have a finish once their linger quests land. Drive it from the existing +Rust, JS ([moq-dev/moq#6151](https://github.com/moq-dev/moq/pull/6151)), +and the bindings ([moq-dev/moq#6157](https://github.com/moq-dev/moq/pull/6157)) +each have a finish. Drive it from the existing interop clients rather than adding a new harness, and assert both halves: the late tail arrives and the end is clean. The new case's cells show up in the nightly report at . Public API: none. Wire: none. - -## Required - -- [Binding linger](/quest/m1/linger-ffi.md) - bindings finish a broadcast, so the binding interop clients can diff --git a/quest/m1/linger-ffi.md b/quest/m1/linger-ffi.md deleted file mode 100644 index 5f2e783ac17..00000000000 --- a/quest/m1/linger-ffi.md +++ /dev/null @@ -1,45 +0,0 @@ -# [L] Bindings finish a broadcast cleanly - -## Goal - -A binding app whose input ended cleanly can finish its broadcast through -`moq-ffi` and every binding, so subscribers still catching up drain the -finished tracks until their media is stale. An interrupt ends the wait early. -`close` keeps its abrupt meaning. - -## Plan - -Decided (2026-10-16), mirroring the Rust library: - -- `finish()` consumes the broadcast producer and returns a finish handle, - as `broadcast::Producer::finish` returns `broadcast::Finish` in Rust. The - handle holds the finished tracks and keeps the broadcast announced; it - exposes `linger()` (how long to keep it) and an async `wait()` that - closes after the linger. Closing or dropping the handle is the interrupt - and closes at once. Rejected: a linger helper that each app holds and - sleeps on, because every publisher would repeat the hold, and an - origin-held linger, because it ties the session to what the origin holds. -- Tracks without a max-age add nothing to the wait. The alternative, - `cache_duration`, defaults to `MAX` and would linger forever. - -Expose the handle as a `moq-ffi` object with `linger()`, async `wait()` and -`close()`, and map cancelling `wait()` to each language's idiom (a dropped -future, a cancelled task or coroutine). The C ABI has no futures, but it -needs none: a C caller keeps the handle for `linger()` on its own clock and -then closes it. Report the API shape across languages before landing. - -Follow the Cross-Package Sync row for `rs/moq-ffi`: hand-written wrappers -in py, swift, kt, go, dart, c and cpp, plus the `doc/lib` pages. Check -whether `cpp/obs` should finish on a clean stop. - -Test in `moq-ffi` with a mocked clock: a late subscriber within max-age gets -the media, the broadcast closes once it passes, and cancelling closes early. -Each binding needs at least a smoke test that the call exists and returns. - -Decided 2026-10-20 (maintainer): the moq-c half lands on the -[generated C package](/quest/m1/c/README.md), not the frozen hand-written -ABI, so C users break once. - -## Required - -- [Generated C bindings](/quest/m1/c/README.md) - the finish handle reaches C through the generated package, not the frozen hand-written ABI diff --git a/quest/m2/go-first-dial-failure.md b/quest/m2/go-first-dial-failure.md index 7fe5983f016..a161c12cf42 100644 --- a/quest/m2/go-first-dial-failure.md +++ b/quest/m2/go-first-dial-failure.md @@ -19,7 +19,3 @@ while their examples only use `Moq.connect`, which never hands back a binding PRs that also touch those pages have landed. Public API: Go additive. Wire: none. - -## Required - -- [Binding linger](/quest/m1/linger-ffi.md) - touches the same binding docs