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
2 changes: 1 addition & 1 deletion quest/m0/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,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
- [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
- [Release builds link](/quest/m0/release-link.md) - the Linux zigbuild release binaries and moq-gst packages link again after the 2026-10-11 nixpkgs bump, so the next release cut can publish
Expand Down
15 changes: 10 additions & 5 deletions quest/m0/release-22/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,19 @@ 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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Update the parent quest summary

Update quest/m0/README.md alongside this completion: its Required entry still says this quest must do “then draft-20+ FETCH,” so anyone triaging the top-level m0 list sees the deleted, landed backport as outstanding work even though this line now declares it complete.

AGENTS.md reference: AGENTS.md:L28-L28

Useful? React with 👍 / 👎.

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.

Fixed in 54634d4: the m0 Required entry now describes the remaining patch (draft-20+ FETCH plus the unset-clock and quiet-edge fixes) instead of the landed backport.

(Written by Claude Opus 5.5)

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.
Comment on lines +35 to +37

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.

[P2] Preserve the promised pre-cut FETCH fixes in the release plan

The remaining-work list now goes directly to cutting the patch, but #5402 explicitly committed to landing the FETCH_OK upper-bound fix on main and backporting it before that cut: #5402 (comment). The exact-final-range end_of_track case has the same conditional commitment (#5402 (comment)). Keeping these only in this PR's Follow-ups loses the release gate when the completed child is deleted. Retain the upper-bound fix/backport as required pre-cut work here, and retain verification/disposition of the conditional end_of_track case, or explicitly record a revised release decision.

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.

Fair point: my #5402 replies said these would be backported before the next 0.17 cut. Whether they gate that cut is a release decision for the maintainer, not something this cleanup should settle by itself. The same patch also carries the #5407 crash fix and the #5413 availability fix, which argues for not holding it back for two P2 edge cases. I'm holding this PR until that is decided: either add a main-first quest for the two fixes and list it under the epic's Required (it gates the cut), or record that the cut goes ahead and the fixes ship in a later 0.17 patch.

(Written by Claude Opus 5.5)

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.

The maintainer decided not to hold the cut. That decision is now recorded in /quest/m0/release-22/README.md and the PR body. The two edge cases are tracked as /quest/m1/fetch-edge-cases.md (main first, then a later 0.17 patch), linked from the epic's Related list. Addressed in e53911d.

(Written by Claude Opus 5.5)


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
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.

- [Draft-20+ FETCH](/quest/m0/release-22/fetch.md) - backport #4971 so a draft-22 FETCH is served, not refused
## 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
17 changes: 0 additions & 17 deletions quest/m0/release-22/fetch.md

This file was deleted.

2 changes: 2 additions & 0 deletions quest/m1/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
40 changes: 40 additions & 0 deletions quest/m1/fetch-edge-cases.md
Original file line number Diff line number Diff line change
@@ -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
29 changes: 29 additions & 0 deletions quest/m1/fetch-live-feed.md
Original file line number Diff line number Diff line change
@@ -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
Loading