From ce4aef1faa76590fffc10549279423a224b3bf47 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Tue, 13 Oct 2026 08:54:28 -0700 Subject: [PATCH 1/3] quest(m0): drop the landed release FETCH backport quest Co-Authored-By: Claude Opus 5.5 --- quest/m0/release-22/README.md | 11 ++++------- quest/m0/release-22/fetch.md | 17 ----------------- 2 files changed, 4 insertions(+), 24 deletions(-) delete mode 100644 quest/m0/release-22/fetch.md diff --git a/quest/m0/release-22/README.md b/quest/m0/release-22/README.md index adcd28536b9..ed38c194369 100644 --- a/quest/m0/release-22/README.md +++ b/quest/m0/release-22/README.md @@ -31,14 +31,11 @@ Decided 2026-10-08: The backports shipped in moq-relay 0.17.3 (#5119) and `@moq/net` 0.4.3 (refreshed 2026-10-12). Draft-22 interop on 2026-10-12 then found FETCH still -refused on draft-20+ sessions. This README's remaining work: once the children -land, cut the next 0.17 patch, `@moq/net`, and `@moq/publish` with them (`/bump`, then the -release-plz PR), and tell the testers and the reporters of #5407 and #5413. +refused on draft-20+ sessions; its backport landed on `release` in #5402. +This README's remaining work: cut the next 0.17 patch, `@moq/net`, and +`@moq/publish` with it (`/bump`, then the release-plz PR), and tell the testers +and the reporters of #5407 and #5413. Decided 2026-10-13: the same patch also carries two crash and availability fixes reported against the release line, an unset host clock and a quiet track's latest group lost after rejoin. - -## Required - -- [Draft-20+ FETCH](/quest/m0/release-22/fetch.md) - backport #4971 so a draft-22 FETCH is served, not refused diff --git a/quest/m0/release-22/fetch.md b/quest/m0/release-22/fetch.md deleted file mode 100644 index 1a39ceae487..00000000000 --- a/quest/m0/release-22/fetch.md +++ /dev/null @@ -1,17 +0,0 @@ -# [S] Draft-20+ FETCH on the 0.17 release line - -## Goal - -A 0.17.x moq-relay serves single-group FETCH on draft-20 and later sessions, -instead of refusing with "FETCH not supported on draft-20" on draft-22. - -## Plan - -Reported from draft-22 interop on 2026-10-12 against moq-relay 0.17.3. -`main` already serves it ([#4971](https://github.com/moq-dev/moq/pull/4971), -"serve draft-20 FETCH within one group"); `release` still refuses on -`Filter::is_draft20(version)`. - -Decided 2026-10-12: backport #4971 onto `release` as its own PR -(CONTRIBUTING), including its tests, then cut the next 0.17 patch with the -release-plz PR. Mirror the `@moq/net` side if #4971 touched `js/net`. From 54634d4281bcdc8c293384f4ab5c7a69724ee286 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Tue, 13 Oct 2026 14:17:35 -0700 Subject: [PATCH 2/3] quest(m0): describe the release line's remaining patch Co-Authored-By: Claude Opus 5.5 --- quest/m0/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quest/m0/README.md b/quest/m0/README.md index fa0d6b06f9b..e98f08c9924 100644 --- a/quest/m0/README.md +++ b/quest/m0/README.md @@ -77,7 +77,7 @@ have fixes on `main`: macOS tests (#5335), drill-sensitivity (#5338), loom ## Required - [CI cost and latency](/quest/m0/ci/README.md) - PRs stop queueing behind hosted runner caps: macOS and Windows move to the merge queue, caches move to R2, and setup is skipped when no work is selected -- [Draft-22 media on 0.17](/quest/m0/release-22/README.md) - a 0.17.x with the LOCATION_FILTER and FIRST_OBJECT fixes and moq-noq 1.3.5, then draft-20+ FETCH +- [Draft-22 media on 0.17](/quest/m0/release-22/README.md) - a 0.17.x with the LOCATION_FILTER and FIRST_OBJECT fixes and moq-noq 1.3.5, then a patch with draft-20+ FETCH and the unset-clock and quiet-edge fixes - [Upgrade restarts epochless broadcasts](/quest/m0/upgrade-unroutable.md) - a WebSocket-to-QUIC upgrade retires epochless handles only once their `Restart` is delivered, and first-party consumers follow it, fixing Interop's `unroutable` rounds - [Panic isolation](/quest/m0/panic-isolation.md) - unwind, ignore lock poison, and supervise every task, so a panic closes only its connection or exits on a long-lived task - [nixpkgs ships the lld fix](/quest/m0/nixpkgs-lld-fix.md) - waiting on NixOS/nixpkgs#568680 to reach `nixpkgs-unstable`, which the release build fix bumps to From e53911d3e5818f08dae6bb33d24a767dcad8fd15 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Tue, 13 Oct 2026 14:24:42 -0700 Subject: [PATCH 3/3] quest(m1): plan the #5402 FETCH follow-ups on main Co-Authored-By: Claude Opus 5.5 --- quest/m0/release-22/README.md | 8 +++++++ quest/m1/README.md | 2 ++ quest/m1/fetch-edge-cases.md | 40 +++++++++++++++++++++++++++++++++++ quest/m1/fetch-live-feed.md | 29 +++++++++++++++++++++++++ 4 files changed, 79 insertions(+) create mode 100644 quest/m1/fetch-edge-cases.md create mode 100644 quest/m1/fetch-live-feed.md diff --git a/quest/m0/release-22/README.md b/quest/m0/release-22/README.md index ed38c194369..2e3a5ceb2fe 100644 --- a/quest/m0/release-22/README.md +++ b/quest/m0/release-22/README.md @@ -39,3 +39,11 @@ and the reporters of #5407 and #5413. Decided 2026-10-13: the same patch also carries two crash and availability fixes reported against the release line, an unset host clock and a quiet track's latest group lost after rejoin. + +Decided 2026-10-13 (maintainer): the two draft-20 FETCH edge cases found on +#5402 do not hold this cut; they land on `main` first and ship in a later 0.17 +patch. + +## Related + +- [Draft-20 FETCH edge cases](/quest/m1/fetch-edge-cases.md) - the main-first fixes that follow this cut in a later 0.17 patch diff --git a/quest/m1/README.md b/quest/m1/README.md index 01a985a77c7..1de18655836 100644 --- a/quest/m1/README.md +++ b/quest/m1/README.md @@ -70,6 +70,8 @@ above them. - [One max_age meaning](/quest/m1/cache-max-age.md) - a superseded group goes stale on wall clock since its successor arrived or on media time, whichever is first, in Rust and js/net; fixes the untimed failover stall - [Quiet latest group test](/quest/m1/quiet-edge-test.md) - pins on `main` that a quiet track's latest group survives rejoin, expiry, and takeover - [FETCH max-delay](/quest/m1/fetch-max-delay.md) - historical readers obey publisher max-age and an optional tighter reader budget, including while holding a group +- [Draft-20 FETCH edge cases](/quest/m1/fetch-edge-cases.md) - an exact-final range reports End of Track and a FETCH_OK past the requested group closes the session, on main then release +- [Main live-feed check](/quest/m1/fetch-live-feed.md) - tests pin that a fetch-only or parked warm cache never supplies Largest Object on main, fixing it if it does - [Claim answer epochs](/quest/m1/claim-answer-epochs.md) - a claim answers each output by publishing it at its exact path under its own epoch, so a restarted output never reaches a returning reader as the old one's cache - [Untimed decisions](/quest/m1/untimed-decisions.md) - the maintainer decides whether moq-archive keeps refusing untimed tracks, and whether a malformed FETCH object ends its track - [Binding namespace feasibility](/quest/m1/ffi-crate-spike.md) - a measured generator go/no-go before the binding API freezes diff --git a/quest/m1/fetch-edge-cases.md b/quest/m1/fetch-edge-cases.md new file mode 100644 index 00000000000..c01dadafd50 --- /dev/null +++ b/quest/m1/fetch-edge-cases.md @@ -0,0 +1,40 @@ +# [S] Draft-20 FETCH edge cases, main first + +## Goal + +Two edge cases in the draft-20+ single-group FETCH from +[#4971](https://github.com/moq-dev/moq/pull/4971) are fixed on `main`, each +with a regression test that fails without its fix, and then backported to +`release` in a later 0.17 patch: + +- A range ending exactly at the final object of a finished track answers + FETCH_OK with End of Track set, so a relay handling it finishes its copy. +- A FETCH_OK whose End Location is past the requested group closes the + session with PROTOCOL_VIOLATION instead of being accepted, and never marks + that later group as the track's end. + +## Plan + +Found by Codex on the release backport +([#5402](https://github.com/moq-dev/moq/pull/5402#discussion_r4260963177) and +[#5402](https://github.com/moq-dev/moq/pull/5402#discussion_r4260963190)); the +same code is on `main`. + +- Publisher (`rs/moq-net/src/ietf/publisher.rs`): `read_fetch` stops at + `until` without seeing the group's end, so `group.complete` stays false. + Derive End of Track from the track's final sequence and the group's last + object rather than from having read the group's end. +- Subscriber (`rs/moq-net/src/ietf/subscriber.rs`, `run_group_fetch`): the + draft-20 check refuses an End Location before the start only. Also refuse + one whose group differs from the requested group. + +Decided 2026-10-13 (maintainer): this does not gate the next 0.17 cut on +[the release line](/quest/m0/release-22/README.md); the backport ships in a +later 0.17 patch. + +Public API: none. Wire: behavior only, within the existing draft-20 through +draft-22 FETCH form. + +## Related + +- [Main live-feed check](/quest/m1/fetch-live-feed.md) - the other follow-up from the same backport review diff --git a/quest/m1/fetch-live-feed.md b/quest/m1/fetch-live-feed.md new file mode 100644 index 00000000000..d34659878fa --- /dev/null +++ b/quest/m1/fetch-live-feed.md @@ -0,0 +1,29 @@ +# [S] Pin which caches count as a live feed on main + +## Goal + +On `main`, a draft-20+ FETCH takes the cache's newest object as Largest +Object only when the cache is fed live. A cache only fetches have filled, +never accepted, is not live, and neither is a parked warm cache with no copy +spliced after it. Tests pin both on `main`, and fix it there if either is +misclassified. + +## Plan + +The `release` backport ([#5402](https://github.com/moq-dev/moq/pull/5402)) +treated both as live, so a FETCH past the stale edge was refused +INVALID_RANGE or capped. It was fixed there in `track::Consumer::is_live` and +`resume::Consumer::is_live`, with `a_fetch_only_cache_is_not_live` and +`a_parked_warm_cache_is_not_live`. A review said `main`'s `Feed::Live` check +already tells them apart; nobody has verified that. + +Mirror those two tests against `main`'s live-feed check +(`track::Consumer::is_live` and its routes). If both pass, landing the tests +completes the quest. If either fails, fix the check at the source in the same +PR. + +Public API: none. Wire: behavior only, if a fix is needed. + +## Related + +- [Draft-20 FETCH edge cases](/quest/m1/fetch-edge-cases.md) - the other follow-up from the same backport review