diff --git a/quest/m0/ci/README.md b/quest/m0/ci/README.md index 54451fb5dda..280f1c33386 100644 --- a/quest/m0/ci/README.md +++ b/quest/m0/ci/README.md @@ -62,6 +62,7 @@ The historical samples locate candidates; they are not controlled benchmarks. ## Required +- [Cargo.lock pins wasm-bindgen](/quest/m0/ci/wasm-bindgen-pin.md) - the dev shell's wasm-bindgen CLI follows `Cargo.lock`, so a nixpkgs bump cannot break WASM on `main` - [Pin Quest's gate](/quest/m0/ci/quest-gate-pin.md) - make shared command admission available - [Share local check capacity](/quest/m0/ci/local-gate.md) - gate expensive phases and bound internal fanout - [Require platform gates](/quest/m0/ci/platform-queue.md) - activate the consolidated platform checks in the main and release rulesets after the workflow lands diff --git a/quest/m0/ci/wasm-bindgen-pin.md b/quest/m0/ci/wasm-bindgen-pin.md new file mode 100644 index 00000000000..04f03fcfc71 --- /dev/null +++ b/quest/m0/ci/wasm-bindgen-pin.md @@ -0,0 +1,30 @@ +# [XS] Cargo.lock pins wasm-bindgen + +## Goal + +`Cargo.lock` is the only pin for wasm-bindgen: the Nix dev shell's +`wasm-bindgen-cli` follows the locked `wasm-bindgen` crate version, so a +nixpkgs bump can no longer move the CLI away from the crate. A locked version +nixpkgs does not package fails loudly at Nix eval. + +## Plan + +Why: [#5896](https://github.com/moq-dev/moq/pull/5896) changed only +`flake.lock`, which moved the CLI to 0.2.129 while the crates were still +`=0.2.127`. Dependabot auto-merged it on the required Check and Test while +WASM was red, and [#5911](https://github.com/moq-dev/moq/pull/5911) re-pinned. +Any nixpkgs bump can repeat it. + +- `flake.nix` reads the `wasm-bindgen` version from `Cargo.lock` + (`builtins.fromTOML`) and selects nixpkgs' versioned + `wasm-bindgen-cli_0_2_`. The pinned nixpkgs (8edc0c72) carries + `wasm-bindgen-cli_0_2_93` through `_0_2_129`. +- Update the comments beside `wasm-bindgen-cli` in `flake.nix` and beside the + `wasm-bindgen` pin in `rs/moq-wasm/Cargo.toml`, which today say to bump + both together. + +Decided 2026-10-19 (maintainer): `Cargo.lock` selects the CLI. Rejected: a CI +step comparing the two versions, which detects drift instead of removing it, +and making Dependabot's auto-merge wait for WASM. + +Public API: none. Wire: none. diff --git a/quest/m1/test-flakes-2/README.md b/quest/m1/test-flakes-2/README.md index 2315abc6b6d..e9c11d41c55 100644 --- a/quest/m1/test-flakes-2/README.md +++ b/quest/m1/test-flakes-2/README.md @@ -1,4 +1,4 @@ -# [S] More tests hold up under load +# More tests hold up under load ## Goal @@ -31,8 +31,17 @@ times on a loaded machine, as the first round did. moq-tokio's `a_subscription_cut_by_the_publisher_disconnecting_does_not_end_clean` is a known exception, tracked by [SUBSCRIBE_DROP](/quest/m1/subscribe-drop.md). +Added 2026-10-19 (maintainer): three more, the redial pair first since CI +hit it. + Public API: none. Wire: none. +## Required + +- [moq-tokio redial tests](/quest/m1/test-flakes-2/tokio-redial.md) - the two redial tests stop assuming a dropped port stays free and stop racing 10 s deadlines +- [moq-ffi cancel during connect](/quest/m1/test-flakes-2/ffi-cancel-connect.md) - `client_cancel_aborts_a_pending_connect` orders its cancel deterministically, fixing the code if the race is real +- [Flapping-peer reorder seed](/quest/m1/test-flakes-2/flapping-peer-reorder.md) - replay one drill seed on current main, and fix it or delete the quest + ## Related - [Controlled time](/quest/m1/time/README.md) - the systemic fix these rules ask for: every crate on a controlled clock diff --git a/quest/m1/test-flakes-2/ffi-cancel-connect.md b/quest/m1/test-flakes-2/ffi-cancel-connect.md new file mode 100644 index 00000000000..c464ab21238 --- /dev/null +++ b/quest/m1/test-flakes-2/ffi-cancel-connect.md @@ -0,0 +1,20 @@ +# [XS] moq-ffi cancel reliably aborts a pending connect + +## Goal + +The moq-ffi test `client_cancel_aborts_a_pending_connect` +(`rs/moq-ffi/src/test.rs`) passes reliably under load. It fails with +`assertion failed: matches!(connect_err, Err(MoqError::Cancelled))`, locally +2 of 960 runs under load; no CI hit was found. + +## Plan + +Hypothesis, unconfirmed: `spawn_parked` only guarantees one poll, not that the +connect reached `established()`, so the dial can resolve before `cancel()`. + +- Confirm the race first. +- Order the cancel deterministically: in the test, or in the code if a cancel + can lose to a completing connect in production. +- On failure, print the value the connect actually returned. + +Public API: none, unless the race is a product bug. Wire: none. diff --git a/quest/m1/test-flakes-2/flapping-peer-reorder.md b/quest/m1/test-flakes-2/flapping-peer-reorder.md new file mode 100644 index 00000000000..64076725e78 --- /dev/null +++ b/quest/m1/test-flakes-2/flapping-peer-reorder.md @@ -0,0 +1,19 @@ +# [XS] Replay the flapping-peer reorder seed + +## Goal + +The drill `bursts_cross_a_flapping_peer::impaired` (`rs/moq-relay/tests/drills.rs`) +passes for seed `783778834340462316`, which failed with "the profile never +applied reorder" in run +[39292063137](https://github.com/moq-dev/moq/actions/runs/39292063137) before +[#5943](https://github.com/moq-dev/moq/pull/5943) merged. + +## Plan + +- Replay the seed on current main with `MOQ_SHAPER_SEED=783778834340462316`. +- If it no longer fails, record the replay in the PR and delete this quest. +- Otherwise fix it at the cause: either the profile should have applied + reorder on that seed, or the shaper's impairment check is wrong for this + drill. + +Public API: none. Wire: none. diff --git a/quest/m1/test-flakes-2/tokio-redial.md b/quest/m1/test-flakes-2/tokio-redial.md new file mode 100644 index 00000000000..f18ad9b77fd --- /dev/null +++ b/quest/m1/test-flakes-2/tokio-redial.md @@ -0,0 +1,27 @@ +# [S] moq-tokio redial tests hold up under load + +## Goal + +The moq-tokio tests `a_failing_redial_reports_why_until_it_connects` and +`a_fleet_drain_redials_through_a_fresh_resolve` (`rs/moq-tokio/src/connection.rs`) +pass reliably under a loaded `just check` and in CI. + +## Plan + +Seen in [CI](https://github.com/moq-dev/moq/actions/runs/39097647984/job/117587545922). +Locally they failed 5 of 240 runs under load, with several different messages. + +Suspected cause: the first test binds a port, drops it, and assumes nothing +listens there afterwards. Under parallel load another process takes the port, +the same pattern [#5873](https://github.com/moq-dev/moq/pull/5873) fixed in +the GStreamer tests. The 10 s deadlines add to it. + +- Remove the port-reuse assumption, for example with a listener that refuses + connections or a socket the test keeps holding. +- Assert on events instead of 10 s deadlines. +- Per the epic's rules, a paused tokio clock fights real sockets, so mocking + time alone is not the fix. +- Confirm the second test's cause on its own; it may share the fixture or + fail for a reason of its own. + +Public API: none. Wire: none. diff --git a/quest/m2/README.md b/quest/m2/README.md index 978ae902389..901d791b0c9 100644 --- a/quest/m2/README.md +++ b/quest/m2/README.md @@ -93,6 +93,7 @@ ranked just below deterministic TS legs, which it requires. - [moqsrc A/V sync](/quest/m2/moqsrc-av-sync.md) - a nightly test measures A/V skew from `moqsrc` through clock-synced sinks - [MP4 export](/quest/m2/mp4-export.md) - `moq export mp4 --output` records crash-safe fragments, then finishes a regular MP4 with moov at the end - [fMP4 edit lists](/quest/m2/fmp4-edit-lists.md) - the fMP4 importer applies edit lists to frame timestamps +- [MKV import refuses out-of-range values](/quest/m2/mkv-dimension-overflow.md) - the Matroska importer errors on a dimension, channel count, or sample rate that would truncate - [Linux decoded frames](/quest/m2/obs-decode-linux.md) - present supported native decoded surfaces with visible CPU fallback - [Windows decoded frames](/quest/m2/obs-decode-windows.md) - present decoded D3D11 surfaces in OBS without CPU readback - [macOS GPU input](/quest/m2/obs-macos.md) - feed the encoder from the OBS compositor without CPU readback diff --git a/quest/m2/mkv-dimension-overflow.md b/quest/m2/mkv-dimension-overflow.md new file mode 100644 index 00000000000..fe47d86a2c3 --- /dev/null +++ b/quest/m2/mkv-dimension-overflow.md @@ -0,0 +1,20 @@ +# [XS] MKV import refuses out-of-range values + +## Goal + +The Matroska importer (`rs/moq-mux/src/container/mkv/import.rs`) refuses a +pixel width or height, channel count, or sampling frequency that does not fit +its catalog field with an import error, instead of truncating it with +`as u32`. Regression tests cover each field. + +## Plan + +From the [#5893](https://github.com/moq-dev/moq/pull/5893) follow-ups. +Today `coded_width` and `coded_height` come from the track's pixel width and +height through `as u32`, and `Channels` and `SamplingFrequency` the same way. + +Decided 2026-10-19 (maintainer): truncation only. Dropped: matching the SPS +aspect ratio 1:1, since FFmpeg prefers the container SAR and we follow +FFmpeg; and a catalog crop field, since nothing needs one. + +Public API: none beyond a new import error case. Wire: none.