Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 2 additions & 6 deletions quest/m0/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,7 @@

## Goal

The work in flight now. Relay hardening: legal moq-transport input never fails
a session in current interop coverage, every resource a peer can make the
relay hold is bounded by what it sent or by a budget, and no peer input panics
the process. Alongside it: fixes for the `release` line, CI cost, and the
The work in flight now: fixes for the `release` line, CI cost, and the
recurring audits.

## Plan
Expand All @@ -14,8 +11,7 @@ The release API gates (#3829..#3878) and the release that followed them are
done.

Per-session request caps landed in #4820, idle fronts in #5054, and the
lost demand-poll wake in #5091. The rest of the 2026-09-29 DoS review remains
in m1 with relay session limits (status refreshed in the 2026-10-10 audit).
lost demand-poll wake in #5091.

Routing: Wildcard landed in #4403, so a service claims the prefix it could
serve instead of enumerating broadcasts. Serving the relay's ingested-only
Expand Down
11 changes: 7 additions & 4 deletions quest/m0/ci/nightly-ffi-reuse.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@

## Goal

Condition: the first `moq-ffi-v*` tag whose commit carries
`.github/workflows/release-shared-ffi.yml` has run `Release FFI`, and a
Backport `.github/workflows/release-shared-ffi.yml` to `release` now as
release-line maintenance (decided 2026-10-22, maintainer), so the next
`moq-ffi-v*` tag carries it. Condition: that tag has run `Release FFI`, and a
Nightly's `Shipping sizes` job has run since
[#5549](https://github.com/moq-dev/moq/pull/5549). Check the tag with
`git ls-tree <tag> .github/workflows/` and its runs with
Expand All @@ -15,8 +16,10 @@ quest.
## Plan

`moq-ffi-v0.4.16` (2026-10-16) was cut from a `release` without #5549, so it
ran the per-language workflows and verified nothing here. The Linux release
toolchain now links; verify `Shipping sizes` on the next scheduled Nightly.
ran the per-language workflows and verified nothing here; `moq-ffi-v0.4.17`
was likewise cut without it. `Shipping sizes` has run (Nightly
[39779729461](https://github.com/moq-dev/moq/actions/runs/39779729461),
2026-10-22): check its Go keys below, so only the tag condition remains.

The first scheduled Nightly after the change (run 38897397428, 2026-10-16)
already verified the dry-run side: the nested job names match the publisher
Expand Down
5 changes: 3 additions & 2 deletions quest/m0/ci/release-gates.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@

## Goal

Condition: the next cut carries `.github/workflows/release-gate.yml` to
`release`. Check with `git show origin/release:.github/workflows/release-gate.yml`.
`release` carries `.github/workflows/release-gate.yml`, backported now as
release-line maintenance rather than waiting for the next cut (decided
2026-10-22, maintainer). Check with `git show origin/release:.github/workflows/release-gate.yml`.

Then the maintainer adds `Release gate` from the GitHub Actions integration
(15368) to release ruleset 24392632, beside `Check`, so PRs into `release`
Expand Down
2 changes: 1 addition & 1 deletion quest/m1/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ Binding durations wait on Duration support in the generated C.
- [fMP4 edit lists](/quest/m1/fmp4-edit-lists.md) - the fMP4 importer applies edit lists to frame timestamps, so the interop AAC tone passes the phase check
- [A smaller, safer API than release](/quest/m1/api-audit/README.md) - every surface added since release has a consumer or is gone, overlapping operations are collapsed, names mirror across Rust, JS, and the bindings, and every break says how to migrate
- [moq-quic's API improves on quinn's](/quest/m1/quic-api/README.md) - moq-quic and both QUIC drivers ship one mirrored API: `send::`/`recv::` namespaces, one error per direction, consuming terminal operations, plain configs, no quinn baggage
- [Drop web-transport-trait](/quest/m1/drop-web-transport-trait.md) - qmux, iroh, wasm, and ffi implement moq-net's `transport::poll` traits, and the remaining `web_transport_trait` adapters are deleted
- [Drop web-transport-trait](/quest/m1/drop-web-transport-trait.md) - iroh, wasm, and ffi implement moq-net's `transport::poll` traits, and the remaining `web_transport_trait` adapters are deleted
- [JavaScript FETCH](/quest/m1/js-fetch.md) - browser publishers answer IETF FETCH through the JS ranges request surface
- [IETF fill timeout](/quest/m1/ietf-fill-timeout.md) - native FILL_TIMEOUT bounds upstream waiting on drafts 18-22, alongside local content-age enforcement
- [Rust identity enforcement](/quest/m1/catalog-identity-rs.md) - `moq-mux` refuses a redefined rendition, and every Rust publisher mints a new rendition name for a decoder identity change and updates everything else in place
Expand Down
4 changes: 4 additions & 0 deletions quest/m1/api-audit/container-format.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,7 @@ passthrough, and `ts::Passthrough` is unreachable from `ContainerFormat`.
`Result` like `Track`'s.

Public API: breaking in moq-mux, moq-ffi, moq-c, and wrappers. Wire: none.

## Required

- [Generated C bindings](/quest/m1/c/README.md) - this changes the C API, so its C half lands on the generated package and C users break once (decided 2026-10-22, maintainer)
9 changes: 4 additions & 5 deletions quest/m1/api-audit/media-trim.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,10 @@ Decided 2026-10-22 (API audit). Make `pub(crate)` or delete:
- moq-video capture `Control`/`Driver` (only `publish_capture` is used),
`DmaBuf::new`, `DmaBufLayout` (until
[OBS Linux GPU](/quest/m3/obs-linux-gpu.md)).
- moq-hls `pub mod master`, range playlists, and `history`: the CLI never
sets history, so `?start=` always answers 416 while `doc/bin/hls.md`
documents it. Remove the docs with it; see
[history floor](/quest/m1/archive/history-floor.md).
- moq-archive `segment::*`, `Key`, and most of `Store`.
- moq-hls `pub mod master`. History mode and range playlists stay public:
the archive line ([history floor](/quest/m1/archive/history-floor.md),
[catalog HLS](/quest/m1/archive/catalog-hls.md)) is their consumer
(decided 2026-10-22, maintainer).
- moq-json `window::Checkpoint`, `Encoder::resume`, `Producer::{resume, cut}`
and `moq_mux::timeline::Producer::resume`, reached only by tests, unless
the [archive consumer](/quest/m1/archive/consumer.md) needs them.
Expand Down
4 changes: 3 additions & 1 deletion quest/m1/api-audit/net-exports.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ Decided 2026-10-23 (API audit follow-up, maintainer):

Kept, so the next audit skips them: `transport::memory` stays public and
ungated, since an in-process transport is real API that other crates' tests
use.
use. `Route::{auth, with_auth}` stay public, since `doc/concept/standard.md`
documents them and [auth issuer](/quest/m1/auth/issuer.md) extends them
(decided 2026-10-22, maintainer).

Public API: removals and renames in moq-net and `@moq/net`. Wire: none.
6 changes: 3 additions & 3 deletions quest/m1/api-audit/transport-config.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@ Decided 2026-10-22 (API audit):
path (`[listen.lb]`).
- moq-quic's unused features, `rustls` alias, and crate docs moved to
[quic-api trim](/quest/m1/quic-api/trim.md) (2026-10-23).
- Public only for tests: `lease::Producer::{due, failed}` and `Due` go
`pub(crate)` (drop the `tokio` feature), `connect::Config.quic` and
- Public only for tests: moq-auth `lease::Producer::{due, failed}` and `Due`
go `pub(crate)` (drop moq-auth's `tokio` feature), `connect::Config.quic` and
`listen::Config.quic` (read only by `deprecated()`) go `pub(crate)`, and
moq-uring `manual` and kio `sim` are renamed `_manual`/`_sim` or gated.

Public API: moq-tokio breaking. Wire: none.
Public API: moq-tokio, moq-auth breaking. Wire: none.
3 changes: 1 addition & 2 deletions quest/m1/audio-jitter-target/capped-budgets.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,7 @@ from before the one-ring removal also carry `-isolated` rows; grade only the
Decided 2026-10-22 (maintainer): the Opus near-zero budgets quest folded in
here, so one pass over the same seven nightlies covers both. The cap
([#6164](https://github.com/moq-dev/moq/pull/6164)) merged 2026-10-22T00:10Z,
after the build flush, so post-cap nightlies are also post-flush; none had run
yet.
after the build flush, so post-cap nightlies are also post-flush.

The first post-cap scheduled run, [2026-10-22 nightly](https://github.com/moq-dev/moq/actions/runs/39779729461),
failed only the browser Opus `wide` target ceilings: `isolated` p95 was
Expand Down
4 changes: 2 additions & 2 deletions quest/m1/drop-web-transport-trait.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

moq-tokio, moq-uring, moq-relay, moq-ffi and moq-wasm no longer depend on
`web-transport-trait`. Native QUIC already implements moq-net's traits
([native WebTransport](/quest/m1/quic-api/native-web.md)); the qmux, iroh, wasm and ffi backends implement moq-net's
([native WebTransport](/quest/m1/quic-api/native-web.md)); the iroh, wasm and ffi backends implement moq-net's
`transport::poll` traits, either directly or through a thin adapter per
backend. The generic adapters over `web_transport_trait` are deleted:
moq-tokio's `transport::Session<S>` with its async-to-poll emulation, and
Expand All @@ -21,7 +21,7 @@ sealed the adapters' bound to the crate's own backends, so a foreign
`web_transport_trait::Session` no longer fits them. This quest removes the
layer instead of reopening it.

- qmux and iroh get their own impls. Flat backends use `Ungrouped`.
- iroh gets its own impl. Flat backends use `Ungrouped`.
- The browser backend in moq-wasm and the ffi backend implement the traits
directly. Their adapters already clamp priorities themselves.
- Report the public API impact per crate: deleted generic `Session<S>`
Expand Down
11 changes: 7 additions & 4 deletions quest/m1/interop-coverage/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,13 @@ existing cases for those features.

Boundaries:

- Only what moq-net can do. PUBLISH (push), subgroups other than 0,
outbound forward=0, rendezvous, and per-request authorization tokens are
not exposed, so they are out of scope, and runner cells that need them
stay red by design.
- Only what moq-net can do. Subgroups other than 0, rendezvous, and
per-request authorization tokens are not exposed, so they are out of
scope, and runner cells that need them stay red by design. PUBLISH (push)
and outbound forward=0 join coverage now that SUBSCRIBE_TRACKS outbound
([#6280](https://github.com/moq-dev/moq/pull/6280)) and IETF subscribe
pause ([#6299](https://github.com/moq-dev/moq/pull/6299)) have landed
(decided 2026-10-22, maintainer).
- Media stays hang. No MSF catalog in our runner clients.
- New cases live in-tree (`test/interop`), not in the runner's spec.
- Not covered: mid-subscription updates (`Subscription::update` in Rust and
Expand Down
19 changes: 9 additions & 10 deletions quest/m1/lite07-finalize.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,10 @@ stability. Both are additive and, per the freeze policy, target whichever lite
wip is current when they land.

Decided 2026-10-08: Restart and AUTH join Required, since both change the
lite-07 wire. Decided 2026-10-17: compressed tracks join too, so lite-07
ships with them. SUBSCRIBE_OK carrying live media time was dropped: no reader
lite-07 wire. Compressed tracks joined on 2026-10-17 and landed
([#5928](https://github.com/moq-dev/moq/pull/5928),
[#6228](https://github.com/moq-dev/moq/pull/6228),
[#6230](https://github.com/moq-dev/moq/pull/6230)). SUBSCRIBE_OK carrying live media time was dropped: no reader
was named, and `set_live` covers it.

The cut:
Expand All @@ -65,16 +67,13 @@ Required, because it adds `Max Age` to lite-07's SUBSCRIBE_DROP. Only
line, because it is that line's lite-07 wire work; the rest is API work that
does not block the rename.

Decided 2026-10-17: the archive line's discovery request joins Required, so
lite-07 ships what the archive and the IETF SUBSCRIBE_TRACKS mapping need.
On 2026-10-19 TRACKS, a per-broadcast track listing, replaced SUBSCRIBE_ALL
and kept that slot.
The archive line's TRACKS request (a per-broadcast track listing that
replaced SUBSCRIBE_ALL) landed in [#6158](https://github.com/moq-dev/moq/pull/6158)
and [#6167](https://github.com/moq-dev/moq/pull/6167), and the padding stream
type for the m2 browser [padding probes](/quest/m2/probe/padding.md) landed in
[#6233](https://github.com/moq-dev/moq/pull/6233).
The `Time(pts)` range end rides in Subscribe ranges, already Required.

Decided 2026-10-20: the padding stream type joins Required, so the m2
browser [padding probes](/quest/m2/probe/padding.md) can use lite-07 without
a new version.

Rust's lite-07 varints already carry the full 64 bits the draft specifies,
so no codec work waits on the cut.

Expand Down
10 changes: 5 additions & 5 deletions quest/m1/read-backfill.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,9 @@ delivers a group that arrives below the cursor as a late backfill; Rust
`largest()`, sparse moq-transport groups break the arithmetic, and a later
coalesced largest isn't this request's resolution. SUBSCRIBE_OK's `Group`
isn't it either, since the lite draft lets a group between the requested
start and it arrive later. If the wire doesn't carry the resolved start,
add it to lite-07 through [Lite-07 ranges](/quest/m1/subscribe-ranges/lite.md);
settle the moq-transport equivalent or keep today's first-arrival cursor
start and it arrive later. Lite-07 SUBSCRIBE_OK carries the resolved start
for a relative range start (decided 2026-10-22 in
[Lite-07 ranges](/quest/m1/subscribe-ranges/lite.md)); settle the moq-transport equivalent or keep today's first-arrival cursor
there.
- The cursor is range-aware, not just floored: with disjoint ranges it skips
straight across an unrequested gap (group 1, then 10 onward) instead of
Expand All @@ -54,8 +54,8 @@ delivers a group that arrives below the cursor as a late backfill; Rust
API instead.

Public API: no type change; the ordered read changes in Rust and JS (the
floor comes from reported bounds, and JS drops backfill). Wire: possibly a
resolved start on lite-07 SUBSCRIBE_OK, through Lite-07 ranges.
floor comes from reported bounds, and JS drops backfill). Wire: the resolved
start on lite-07 SUBSCRIBE_OK, through Lite-07 ranges.

## Required

Expand Down
12 changes: 10 additions & 2 deletions quest/m1/release-audit/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ server state after final drop, idle Dart stream cancellation, empty expiry
indexes, JS IETF timestamp changes, JS datagram range violations, and OBS
reordered-frame timestamps and missing EOF output. Each owning quest records
the reproduction's limits. JS reader and publisher datagram paths now enforce
subscription bounds; the OBS quest retains ownership of its findings.
subscription bounds; the OBS defects moved to an m1 child (2026-10-22, maintainer).
Go reservation disposal remains an investigation.
No platform-wide binding parity, full OBS runtime, fuzzing campaign, or
network-impairment performance result is implied by these checks.
Expand All @@ -85,10 +85,18 @@ The 2026-10-22 binding and OBS audit at main
rate recovery child. Its two OBS findings went to m2 next to the other OBS
work, because obs-moq ships on its own schedule.

## Required

The entries comprise reproduced or source-confirmed findings
and contract/lifetime investigations. Each
child records whether its behavior is new on main or inherited from release.

- [OBS decode timing](/quest/m1/release-audit/obs-decode-timing.md) - the shipping OBS source stamps each reordered picture with its own timestamp and drains at clean EOF

## Related

- [JS subscription ranges](/quest/m1/subscribe-ranges/js.md) - range lists and frame offsets build on the bounds fixed here
- [OBS video source](/quest/m2/obs-moq-video/source.md) - reproduced inherited timing and EOF defects remain with the decoder replacement owner
- [OBS video source](/quest/m2/obs-moq-video/source.md) - the decoder replacement keeps the timing and EOF behavior fixed here
- [Compressed tracks](/quest/m1/compress/README.md) - mid-group widening and application migration have existing owners
- [Archive consumer](/quest/m1/archive/consumer.md) - current producer and CLI reader still need the new-format roundtrip
- [Measured release performance](/quest/m1/release-perf/README.md) - existing paired benchmark regressions and their confirmation runs
Expand Down
26 changes: 26 additions & 0 deletions quest/m1/release-audit/obs-decode-timing.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# [S] The OBS source keeps decoded timestamps and drains at EOF

## Goal

On the current FFmpeg path in `cpp/obs/src/moq-source.cpp`, each decoded
picture carries its own presentation timestamp, not the input packet's, and
a clean media EOF drains the decoder's delayed pictures. A reordered H.264
stream with B-frames plays every picture in order with correct timestamps.

## Plan

Split into m1 from the [OBS video source](/quest/m2/obs-moq-video/source.md)
replacement on 2026-10-22 (maintainer), so the cut does not ship the two
defects the release audit reproduced: `moq_source_decode_frame` assigns the
current packet's timestamp to an older reordered picture, and the clean EOF
callback returns without draining (about `moq-source.cpp:217` and `:634` at
1d43c096e0). The audit's libavcodec reproduction (12 B-frames, 10 pictures
all mis-stamped, two lost at EOF) is the regression test to automate.

Use the decoder's output timestamp (`best_effort_timestamp` or the frame's
`pts`). On clean EOF, send a flush packet and call `avcodec_receive_frame`
until it returns `AVERROR_EOF`, emitting every picture; the regression
asserts all 12 pictures and their timestamps. Keep the fix inside the
current path; the GPU replacement keeps the same behavior.

Public API: none. Wire: none.
3 changes: 1 addition & 2 deletions quest/m1/subscribe-ranges/lite.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,7 @@ list.

Update `drafts/draft-lcurley-moq-lite.md` in the same PR: the SUBSCRIBE and
SUBSCRIBE_UPDATE fields, the Group Order section (the order is now a field),
the removal of FETCH, and the lite-07 changelog. Fix the stale "offset by 1"
sentence on Group Start while there. This quest also owns the Order row of
the removal of FETCH, and the lite-07 changelog. This quest also owns the Order row of
the priority table in `doc/concept/moq-lite.md`: it now describes the field
(decided 2026-10-08, since subscribe ranges owns group order). Published versions (lite-03..06) keep
FETCH, answered through the model's ranges. Run `just drafts check` and
Expand Down
4 changes: 2 additions & 2 deletions quest/m1/ts-reliability/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,8 @@ absorbs the release audit's export-reorder quest, and the shared parser lands
before the open stream-routes and PAT drafts, which rebase onto it.

PMT fragmentation (#5220), initial mux-rate measurement (#5287), and
decoder-time admission (#5306) have landed; PSI runs and catalog linger
remain with their current quests.
decoder-time admission (#5306) have landed, as have PSI runs (#5606) and
catalog linger (#5305).

## Required

Expand Down
Loading
Loading