Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
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 .claude/skills/quest-audit/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
name: quest-audit
description: Audit outstanding quests for disagreements, conflicts, misaligned priorities, and stale plans, then resolve them with /quest-plan. Use when the user invokes /quest-audit or asks to check the quest tree for consistency.
description: Audit and fix outstanding quests for disagreements, conflicts, misaligned priorities, and stale plans. Use when the user invokes /quest-audit or asks to audit and fix the quest tree.
---

Run `quest skill audit` and follow its output.
Expand Down
8 changes: 4 additions & 4 deletions flake.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
# The quest CLI, which also serves the quest guide and skills the stubs in
# .claude/skills call. Bump the rev to upgrade them.
quest = {
url = "github:kixelated/quest/b7027a3ded4b0a36505f40eb7ed788c1023e7a49";
url = "github:kixelated/quest/fa5f1fc9b49c8e7f5dd85af1aabead22f681ec01";
inputs.nixpkgs.follows = "nixpkgs";
inputs.flake-utils.follows = "flake-utils";
};
Expand Down
6 changes: 3 additions & 3 deletions quest/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ Critical fixes continue to reach the existing release through backports.

## Required

- [m0: immediate priorities](/quest/m0/README.md) - everything in flight now: relay hardening and the IETF interop fixes for Seattle, and broadcast epochs
- [m1: next wave](/quest/m1/README.md) - reliability, capabilities, performance, and the planning that settles their contracts
- [m2: later work](/quest/m2/README.md) - deferred features, design studies, and experiments
- [m0: immediate priorities](/quest/m0/README.md) - urgent correctness fixes and maintenance of the current release
- [m1: next wave](/quest/m1/README.md) - the agreed next breaking cut, with its required correctness and validation
- [m2: later work](/quest/m2/README.md) - release execution first, then deferred features, optimization, and design studies
- [m3: deferred](/quest/m3/README.md) - gated on the outside world (hardware, a partner, a consumer, a provider's offer, or an upstream release), or speculative with no named consumer
13 changes: 11 additions & 2 deletions quest/m0/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,10 +77,19 @@ have fixes on `main`: macOS tests (#5335), drill-sensitivity (#5338), loom

## Required

- [Stitcher public relay smoke](/quest/m0/smoke-stitcher.md) - the first-party deployment is tested under an anonymous namespace and only on transports it serves

- [qmux 0.5 upstream](/quest/m0/qmux-credit-backport-upstream.md) - old-release publication, independent of the main fix

- [qmux release backport](/quest/m0/qmux-credit-backport.md) - adopt the 0.5 fix independently of the next breaking cut
Comment thread
kixelated marked this conversation as resolved.

- [Lite SETUP backport](/quest/m0/lite-setup-backport.md) - `release` closes a moq-lite session on a repeated SETUP parameter or a second Setup Stream, in a later 0.14.x patch (#5521)
- [Kotlin wrapper POM release](/quest/m0/kt-ffi-pom.md) - `dev.moq:moq` 0.5.2 ships from `release`, its POMs naming moq-ffi at `[0.4.3,0.5)`

- [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 a patch with draft-20+ FETCH and the unset-clock and quiet-edge fixes
- [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
- [web-transport releases the qmux fixes](/quest/m0/qmux-credit-upstream.md) - waiting on moq-dev/web-transport#412 and #413 to merge and ship, which qmux credit bumps to
- [qmux credit](/quest/m0/qmux-credit.md) - qmux returns connection credit for dropped and stopped streams and delivers its close frame, on both lines
- [web-transport releases the qmux fixes](/quest/m0/qmux-credit-upstream.md) - waiting on #412 to publish the patched 0.6.x that main adopts
- [qmux credit](/quest/m0/qmux-credit.md) - main adopts qmux 0.6 credit and close fixes; the 0.5 backport is independent
- [Broadcast epochs](/quest/m0/broadcast-epoch/README.md) - every first-party publisher that can restart mints a fresh route epoch, the newest wins a path, and only routes with the same epoch resume a subscription
23 changes: 13 additions & 10 deletions quest/m0/broadcast-epoch/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,11 +65,11 @@ Decided:
the lite-07 cut, not this release. It replaces the response-only claim-epoch
proposal: an independent route explicitly continues the same served
instance, rather than inferring continuity from an epochless claim.
- Decided in the 2026-10-10 resume audit: a catalog reference pins its first
resolved sibling for the catalog instance's lifetime in players and
exporters. Optional reference epochs constrain the first resolution on
epoch-aware transports; on epochless transports they remain best effort.
This supersedes following the newest sibling by name. The
- Decided 2026-10-14: announcement-following readers handle a referenced
sibling's replacement as Restart; other readers pin their first resolution
for the catalog instance's lifetime. Optional reference epochs constrain
resolution on epoch-aware transports and remain best effort on epochless
transports. Following never turns a replacement into seamless resume. The
[catalog references quest](/quest/m0/broadcast-epoch/catalog-references.md)
owns the schemas, readers, and compatibility documentation.
- Every first-party publisher that can restart mints its own: the apps,
Expand Down Expand Up @@ -108,22 +108,25 @@ maintainer's pre-release merge of `release` into `main` keeps `main`'s
The 2026-10-10 resume audit adds release gates for newly issued requests
through retired handles and for late duplicate delivery after same-epoch
handover. Keep existing reads sticky; stopping new unpinned wire work is a
separate boundary. The catalog-reference work applies the same pinning
policy to players and exporters. Wall-clock expiry, live DROP dispositions,
separate boundary. Catalog references apply the same identity policy to
players and exporters, distinguishing announcement followers from readers
that retain lifetime pins. Wall-clock expiry, live DROP dispositions,
FETCH budgets, seamless JS handover, and the IETF extension remain m1.

Extend the line's relay/media tests to hold catalog and media from A while B
replaces it, exercise later metadata/subscription/FETCH operations, and prove
that following the replacement starts a fresh catalog with fresh pins. Check
that replacing the catalog starts fresh pins. A followed sibling replacement
restarts that sibling while preserving the catalog's explicit epoch
constraints; it never mixes instances through an old handle. Check
exact and covering routes, matching/different/absent epochs, and legacy
End+Start. The child quests own their focused regressions.

## Required

- [Catalog references](/quest/m0/broadcast-epoch/catalog-references.md) - players and exporters pin siblings consistently, with optional reference epochs and documented legacy best effort
- [Catalog references](/quest/m0/broadcast-epoch/catalog-references.md) - announcement followers restart replaced siblings; other readers retain pins, with optional epochs and legacy best effort

## Related

- [JS consume identity](https://github.com/moq-dev/moq/pull/5254) - requests carry the serving prefix's epoch and new winners cannot reuse an old cached broadcast

- [Stats prefix tracks](/quest/m1/stats-prefix-tracks.md) - remains in the breaking release with QoS, independently of epoch correctness
- [Stats prefix tracks](/quest/m2/stats-prefix-tracks.md) - deferred with QoS to m2; neither gates epoch correctness or the next cut
33 changes: 18 additions & 15 deletions quest/m0/broadcast-epoch/catalog-references.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,21 @@

## Goal

Catalog, media, and data requests use the same pinned broadcast instance
in players and exporters. Each sibling stays on its first resolved
instance for the catalog instance's lifetime. Optional catalog epochs let
a reference name its intended sibling before that first resolution.
Catalog, media, and data requests use the same broadcast identity in players
and exporters. Announcement-following readers follow a referenced sibling's
Start, End, and Restart; readers without announcement following pin their
first resolution for the catalog's lifetime. Optional reference epochs
constrain the intended identity in either case.

## Plan

Decided in the 2026-10-10 resume audit:

- Apply the same pinning policy to players and exporters. This replaces
the earlier rule that a named sibling follows the newest epoch, including
`@moq/watch`'s test that follows a republished rendition independently of
its catalog. A sibling replacement does not silently retarget the old
catalog's reference. A new catalog instance or explicit export stitch
starts fresh pins; same-epoch recovery preserves identity.
- Apply the same identity policy to players and exporters. Per the
2026-10-14 decision below, announcement-following readers handle a sibling
replacement as Restart, never as seamless same-epoch resume. Readers that
follow no announcements keep their first pin until a new catalog instance
or explicit export stitch. Same-epoch recovery preserves identity.
- Add optional `epoch` beside every catalog broadcast reference: video,
audio, text, JSON, and binary configs, plus the archive replay reference.
Reuse the canonical UUIDv7 representation and validation from MoQ epochs.
Expand All @@ -31,11 +31,13 @@ Decided in the 2026-10-10 resume audit:
- Lazy work has no anticipated epoch: leave it out of unresolved contribution
references. Once a worker accepts a job it advertises a concrete path with
a unique epoch. A proven Takeover preserves the same pinned instance; a
replacement requires a new catalog instance. An epoch-bound request on an
replacement follows Restart for announcement-following readers and requires
a new catalog instance for other readers. An epoch-bound request on an
epoch-capable link requires a matching advertised epoch, not merely an
epoch returned from an epochless claim.
- Omission remains compatible with existing catalogs: pin the first
resolved instance, with no promise about an unresolved sibling's past.
- Omission remains compatible with existing catalogs: bind the first
resolved instance, then follow announcements only where the reader opts
into that lifecycle. Make no promise about an unresolved sibling's past.
- On epochless transports, explicit catalog epochs are best effort
(maintainer choice). Keep the requested identity in the reference, use
whatever identity the route can verify, and pin the resolved handle.
Expand All @@ -46,8 +48,9 @@ Decided in the 2026-10-10 resume audit:

Decided by the maintainer, 2026-10-14 (from #5500's Codex review): readers
follow a referenced broadcast's announcements, since announcement is the
online/offline signal and `@moq/watch` already behaves this way. The "no
retarget" rule above applies only to readers that follow no announcement.
online/offline signal. The "no retarget" rule applies only to readers that
follow no announcement. An explicit epoch still constrains every resolution;
following does not authorize substituting a different requested epoch.

- `moqsrc`: Start binds the rendition, End idles its pad, and Restart
restarts its pump.
Expand Down
File renamed without changes.
File renamed without changes.
12 changes: 12 additions & 0 deletions quest/m0/qmux-credit-backport-upstream.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# [XS] web-transport releases the qmux 0.5 credit and close fixes

## Goal

Waiting on moq-dev/web-transport: #413 merges into qmux-v0.5.x and ships in
a qmux 0.5.x release after 0.5.2. Check
`gh pr view 413 -R moq-dev/web-transport` and crates.io. Delete this condition
once shipped; the 0.6 publication can complete independently.

## Related

- [Release pin](/quest/m0/qmux-credit-backport.md) - adopts the published fix
22 changes: 22 additions & 0 deletions quest/m0/qmux-credit-backport.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# [XS] Backport the qmux credit and close pin

## Goal

The current release uses a patched qmux 0.5.x that returns unread stream
credit and delivers its close frame. It stays on web-transport-trait 0.4.

## Plan

Once the upstream 0.5 fix ships, update the release-line pin and run the
WebSocket and TLS transport checks. Follow the backport workflow. This is
independent of the 0.6 main pin and does not gate the next breaking cut.

Public API: none. Wire: none.

## Required

- [qmux 0.5 publication](/quest/m0/qmux-credit-backport-upstream.md) - the release-line patch is available

## Related

- [qmux credit](/quest/m0/qmux-credit.md) - shared diagnosis and the main pin
14 changes: 6 additions & 8 deletions quest/m0/qmux-credit-upstream.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
# [XS] web-transport releases the qmux credit and close fixes
# [XS] web-transport releases the qmux 0.6 credit and close fixes

## Goal

Waiting on moq-dev/web-transport: the qmux credit and close fixes merge and
ship in a 0.6.x release after 0.6.2 and a 0.5.x release after 0.5.2. Check with
`gh pr view 412 -R moq-dev/web-transport` (0.6, targets `main`), the same for
413 (0.5, targets `qmux-v0.5.x`), and the published `qmux` versions on
crates.io. Advance it by pushing the upstream review along. Delete this quest
once both releases are out.
Waiting on moq-dev/web-transport: #412 merges and ships in a qmux 0.6.x
release after 0.6.2. Check `gh pr view 412 -R moq-dev/web-transport` and
the published qmux versions on crates.io. Delete this condition once shipped.
The independent 0.5 publication does not block this condition.

## Related

- [qmux credit](/quest/m0/qmux-credit.md) - bumps `main` and `release` once these ship
- [qmux credit](/quest/m0/qmux-credit.md) - bumps main after publication
14 changes: 7 additions & 7 deletions quest/m0/qmux-credit.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ whether the app reads it, drops the stream unread, or it arrives after
STOP_SENDING, so a long-lived session never stalls on MAX_DATA. `close()`
delivers its APPLICATION_CLOSE frame before the transport drops, so a TCP or
WebSocket peer sees the close code whenever the transport stays writable
within the close bound. Both hold on the 0.5 line that
`release` pins and the 0.6 line `main` uses.
within the close bound. This quest updates the 0.6 line `main` uses; the
0.5 release-line backport is independent.

## Plan

Expand Down Expand Up @@ -43,10 +43,10 @@ targets `qmux-v0.5.x`):
delivering past its initial window, and a peer reads the close code after a
close issued mid-write.

Remaining here, once both ship: bump `main` to that 0.6.x and backport
`release`'s pin to that 0.5.x. `release` stays on 0.5: 0.6 needs web-transport-trait 0.5, a
breaking change. Sized XS (2026-10-08), since the fixes live upstream and only
the pin bumps remain here.
Remaining here: bump `main` once the patched 0.6.x ships. The independent
[release backport](/quest/m0/qmux-credit-backport.md) stays on 0.5 because
0.6 needs web-transport-trait 0.5, a breaking change. The old-line publication
is not a prerequisite of m1. Sized XS: only the pin bump remains here.

Why m0: the WebSocket fallback, moq.pro's Voice, and the edge-to-core
`tls://` links (#4816) that moq.pro's cluster sessions move to all run on
Expand All @@ -56,7 +56,7 @@ Public API: none. Wire: none.

## Required

- [web-transport releases the fixes](/quest/m0/qmux-credit-upstream.md) - #412 and #413 merge and ship as patched 0.6.x and 0.5.x
- [web-transport releases the fixes](/quest/m0/qmux-credit-upstream.md) - #412 merges and ships as a patched 0.6.x

## Related

Expand Down
File renamed without changes.
Loading
Loading