-
-
Notifications
You must be signed in to change notification settings - Fork 248
quest: plan the follow-ups from PRs merged since 09-24 #4307
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
461bd0e
1b25f1a
e89c315
6a50b34
7f58a04
f007f99
c3aec8c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -25,6 +25,20 @@ additive and target `main`: the native knob is a new field on a | |
| `#[non_exhaustive]` struct, and the browser estimator is a new module plus a | ||
| new `spread` observation. | ||
|
|
||
| Decided for landing: the line merges to `main`, not `dev`, with a changelog | ||
| note for two behavior changes treated as fixes. `@moq/watch` `Sync` takes a | ||
| numeric delay literally instead of adding the rendition delay on top | ||
| ([#3954](https://github.com/moq-dev/moq/pull/3954)), and `moq play --delay` | ||
| defaults to `auto` instead of `100ms` | ||
| ([#3967](https://github.com/moq-dev/moq/pull/3967)). The old additive delay | ||
| was wrong, and both compile unchanged for existing callers. The line branch is | ||
| about 200 commits behind `main` with conflicts in `js/watch/src/sync.ts` and | ||
| `rs/moq-cli`; merge `main` in (never rebase the shared branch) before | ||
| finishing the watch quest. The raw #3477 traces are gone, so record fresh | ||
| traces with the [audio quality | ||
| harness](/quest/m0/audio-quality-harness/README.md) instead of asking the | ||
| reporter; they replace the #3477 traces wherever the quests name them. | ||
|
Comment on lines
+37
to
+40
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
This new decision says the #3477 traces are gone, but the moved harness plan still says to upstream the released AGENTS.md reference: AGENTS.md:L28-L28 Useful? React with 👍 / 👎.
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fixed in the latest push. (Written by Opus 5.5) |
||
|
|
||
| The algorithm is written down at `doc/concept/audio-jitter.md`, with a | ||
| conformance corpus beside it that both implementations will read. | ||
|
|
||
|
|
@@ -71,6 +85,6 @@ buffer against uneven arrivals. | |
|
|
||
| ## Related | ||
|
|
||
| - [Audio quality harness](/quest/m1/audio-quality-harness/README.md) - the automated proof, built on its own schedule | ||
| - [Audio quality harness](/quest/m0/audio-quality-harness/README.md) - the automated proof, and the recorder of the traces the watch quest replays | ||
| - [Time stretch](/quest/m1/watch-audio-time-stretch.md) - inaudible convergence, on top of this | ||
| - [Plan: A/V clock](/quest/m0/plan-av-clock.md) - the clock this target eventually feeds | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -39,6 +39,15 @@ Recommendations for the implementation: | |
| - The text renderer is the third track: it reads `sync.now()` | ||
| (`js/watch/src/text/renderer.ts:261`) to drive the cue clock and prune cues | ||
| at `:263-265`. | ||
| - Close the player gaps [#4170](https://github.com/moq-dev/moq/pull/4170) | ||
| left, since the handles own them. `Sync.received` only ever lowers its | ||
| reference, so after the earliest subscribed track leaves, playback stays | ||
| anchored to it; a track's handle going away must release its part of the | ||
| reference, the same expiry the jitter target's arrival minimum has. Text | ||
| renditions register no floor with `Sync`, so their catalog `delay` is | ||
| ignored; the text handle registers one like audio and video. The MSF | ||
| catalog schema (`js/msf/src/catalog.ts`) accepts a negative `delay` and | ||
| folds it into absent; refuse it on decode instead. | ||
|
Comment on lines
+49
to
+50
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win 🔎 Supported by static analysis🏁 Script executed: rg -n -C 6 '\bdelay\b' jsRepository: moq-dev/moq Length of output: 42701 🏁 Script executed: #!/bin/bash
set -eu
printf '%s\n' '--- js/msf/src/catalog.ts ---'
cat -n js/msf/src/catalog.ts | sed -n '1,180p'
printf '%s\n' '--- quest/m0/plan-av-clock.md ---'
cat -n quest/m0/plan-av-clock.md | sed -n '40,56p'Repository: moq-dev/moq Length of output: 10141 🏁 Script executed: set -eu
cat -n js/msf/src/catalog.ts | sed -n '1,130p'
printf '%s\n' '--- plan ---'
cat -n quest/m0/plan-av-clock.md | sed -n '44,53p'Repository: moq-dev/moq Length of output: 7049 Correct the
🤖 Prompt for AI Agents |
||
|
|
||
| ## Required | ||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -17,6 +17,7 @@ transport, benchmark tooling); worktrees isolate commits, not semantics. | |
|
|
||
| ## Quests | ||
|
|
||
| - [Drill sensitivity](/quest/m1/drill-sensitivity.md) - the nightly drill-sensitivity job passes: the subscriber-leaks-broadcasts mutation applies to the current lite subscriber again | ||
| - [BBR classic ECN](/quest/m1/bbr-classic-ecn.md) - Startup and bandwidth probing respond to CE marks before the bottleneck drops packets | ||
| - [lite-07 count settle](/quest/m1/lite-count-settle.md) - moq-lite-07 subscribers stop waiting for a subscription's tail once SUBSCRIBE_END's stream count is reached | ||
| - [Dropped sources](/quest/m1/dropped-sources.md) - track consumers see the producer's real error on every end path, never `Dropped` | ||
|
|
@@ -41,6 +42,36 @@ transport, benchmark tooling); worktrees isolate commits, not semantics. | |
| - [Bindings caught up](/quest/m1/announce-live-bindings.md) - moq-ffi, libmoq, and every wrapper yield the same flat announce event, `Live` included | ||
| - [Optional max age](/quest/m1/ietf-max-age.md) - max age is optional, set only by the publisher, and crosses moq-transport as MAX_CACHE_DURATION | ||
| - [IETF announce count](/quest/m1/ietf-announce-count.md) - an opt-in moq-transport extension carries the replay count, so IETF announce consumers go live without a timer | ||
| - [kio waiter overflow](/quest/m1/kio-waiter-lost.md) - a retained `Waiter` past 8 lists stops adding a duplicate entry to lists it already recorded | ||
| - [moqsink keyframe latch](/quest/m1/moqsink-keyframe-latch.md) - a header-only buffer after a break no longer permanently invalidates a moqsink video pad | ||
| - [Capture re-anchor](/quest/m1/capture-reanchor.md) - a repeating or restarting device clock never rewinds native capture during a fast backlog drain | ||
| - [Splice edge cases](/quest/m1/splice-edges.md) - an unstamped successor, a pruned segment's boundary group, and a warm head during a takeover are each handled correctly | ||
| - [Track tail hardening](/quest/m1/track-tail-hardening.md) - Rust and JS wait out a track's tail by the same rules, with the known hang, count, truncation, grace, and memory holes closed | ||
| - [Session death parity](/quest/m1/session-death.md) - a local close ends tracks cleanly in both languages, and JS group readers see the session's error on session death | ||
| - [JS scoped routes](/quest/m1/js-scoped-routes.md) - a scoped JS origin reader announces the preferred route among those in its scope, like Rust, with the fan-out benchmarked | ||
| - [JS subtree at max depth](/quest/m1/js-pattern-depth.md) - `Pattern.subtree` returns the literal path at 32 segments like Rust, pinned by a shared pattern.json vector | ||
| - [moq play decode schedule](/quest/m1/play-decode-schedule.md) - `moq play` video keeps valid pictures across rewinds, reordering deeper than 100 ms, and decoder batches larger than three | ||
| - [moqsrc stop](/quest/m1/moqsrc-stop.md) - moqsrc's stop blocks until its session ends, without deadlocking on a blocked pad push | ||
| - [More tests under load](/quest/m1/test-flakes-2.md) - the second round of load-only failures, fixed at the cause | ||
| - [UnknownSession log flood](/quest/m1/unknown-session-logs.md) - streams reset before their WebTransport header stop being reported as UnknownSession at WARN | ||
| - [Merge queue](/quest/m1/merge-queue.md) - the required checks run on `merge_group`, so a stale green check can no longer break main | ||
| - [Wire compatibility](/quest/m1/wire-compat.md) - a nightly run tests this checkout against the last published release for tokens, session wire, and catalog/container | ||
| - [Accept-side flags](/quest/m1/cli-given-flags.md) - dial-only and local verbs refuse every `--listen-*` flag instead of ignoring it | ||
| - [JS catalog path](/quest/m1/js-catalog-path.md) - `@moq/net` broadcast consumers expose their path and `Catalog.watch` rejects escaping references, like Rust | ||
| - [Full codec string](/quest/m1/publish-codec-string.md) - browser-published video carries the encoder's full RFC 6381 codec string, so native players decode it | ||
| - [TS export jitter](/quest/m1/ts-export-jitter.md) - the video reorder bound follows later catalogs and observed reordering, so a late B-frame never reorders TS output | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Fresh evidence after the earlier jitter review is this parent entry's unconditional outcome: AGENTS.md reference: quest/AGENTS.md:L41-L44 Useful? React with 👍 / 👎. |
||
| - [TS import shared shift](/quest/m1/ts-import-shared-shift.md) - unflagged loop wraps move audio and video by one shift, so A/V sync holds across wraps | ||
| - [PipeWire duplicate cameras](/quest/m1/pipewire-dup-cameras.md) - a webcam lists once with PipeWire enabled | ||
| - [Catalog wall clock](/quest/m1/catalog-wall-clock.md) - `Clock::wall_clock` keeps the catalog's full precision instead of truncating to milliseconds | ||
| - [Capture control](/quest/m1/capture-control.md) - on dev, `encode::Capture` replaces `CaptureOptions`, an unsupported `cut()` errors, and dropping the last `Control` cancels in-flight opens | ||
| - [Video surface](/quest/m1/video-surface.md) - on dev, moq-ffi's `native` becomes `surface`, refused on platforms with no surface | ||
| - [HLS discontinuity sequence](/quest/m1/hls-discontinuity-sequence.md) - on dev, `Segment::discontinuity` is the absolute sequence, so every cursor agrees | ||
| - [Strict Redirect::resolve](/quest/m1/redirect-resolve.md) - on dev, `Redirect::resolve` can no longer quietly turn a refused redirect into a redial | ||
| - [RTMP TLS only](/quest/m1/rtmp-tls-only.md) - an RTMP listener configured for TLS can refuse plaintext instead of sniffing and serving it | ||
| - [HLS linger](/quest/m1/hls-linger.md) - `moq_hls::Server` serves an ended broadcast for its playlist window plus grace, so the moq.pro edge drops its own pool | ||
| - [Gateway live clock](/quest/m1/gateway-live-clock.md) - moq-srt, moq-rtmp, and HLS import publish on the broadcast clock, so encoder reconnects don't restart timestamps | ||
| - [iroh versions](/quest/m1/iroh-lite-wip.md) - `iroh://` negotiates the configured versions, so `moq-lite-07-wip` can be opted into | ||
| - [Go and Dart doc samples](/quest/m1/doc-samples-go-dart.md) - Go and Dart doc samples compile against their wrappers | ||
|
|
||
| - [Data jitter](/quest/m1/data-jitter.md) - JSON and binary tracks with a capture time advertise a detected `delay` and `jitter` | ||
| - [Data capture in bindings](/quest/m1/data-capture-bindings.md) - moq-ffi and every wrapper pass a data frame's capture time, and the JSON window producer takes one | ||
|
|
@@ -92,7 +123,6 @@ transport, benchmark tooling); worktrees isolate commits, not semantics. | |
| - [Perf](/quest/m1/perf/README.md) - eliminate measured hot-path costs across moq-uring, kio, and the moq-net model | ||
| - [#2924](/quest/m1/2924-moq-relay-tls-rotation-is-not-atomic-across-thread-per.md) - every listener on both runtimes shares one reloadable served identity, so rotation is atomic and generate works with workers | ||
| - [#2964](/quest/m1/2964-quic-workers-dropping-one-split-server-resizes-the.md) - integrate the dev worker owner with hardened socket-group formation | ||
| - [Audio quality harness](/quest/m1/audio-quality-harness/README.md) - a playout latency regression fails a run instead of arriving as a bug report | ||
| - [Benchmark regressions in CI](/quest/m1/bench-ci.md) - PRs get a non-blocking comparison of the Criterion benches they affect, and a nightly trend on main alerts on regressions | ||
| - [Benchmark comparisons](/quest/m1/performance-comparisons.md) - retained evidence, repeated paired runs, and uncertainty for performance claims | ||
| - [#3126](/quest/m1/3126-moq-bench-every-readme-example-fails-to-parse-and.md) - moq-bench reports per-interval latency percentiles so the ramp leaves the steady state | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,26 @@ | ||
| # [XS] The opening-snapshot test waits for real enrollment | ||
|
|
||
| ## Goal | ||
|
|
||
| `archive::tests::an_opening_snapshot_records_every_rendition` in | ||
| `rs/moq-cli/src/archive.rs` passes under load. It fails with "writer closed" | ||
| because it treats a rendition's `.info` file as proof the export enrolled | ||
| that track, then finishes the tracks and the catalog; under load the writer | ||
| can still be subscribing when the tracks end. Seen while landing | ||
| [#4169](https://github.com/moq-dev/moq/pull/4169). | ||
|
|
||
| ## Plan | ||
|
|
||
| - Wait on the signal enrollment actually produces (the subscription reaching | ||
| the publisher, or an explicit event from the exporter), not a file that | ||
| appears earlier. No longer timeout and no retry. | ||
| - If the exporter can genuinely lose a rendition that ends right after it | ||
| appears in the catalog, that is a bug in the exporter, not the test; fix it | ||
| there. | ||
|
|
||
| Public API: none. Wire: none. | ||
|
|
||
| ## Related | ||
|
|
||
| - [More tests hold up under load](/quest/m1/test-flakes-2.md) - the same | ||
| round of load-only failures on `main` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Scope labeling to issues under
Closes.“these issues” refers to the unlabeled input set, which can include issues cited only under
Related. Labeling a context-only issue makes later planning skip it.quest/AGENTS.mdLines 82–85 saysRelatedissues get no label. Based on learnings, apply the label only to issues underCloses.🤖 Prompt for AI Agents
Source: Learnings