Repository navigation
quest: plan follow-ups from the 2026-11-02 /quest-complete round #7640
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
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 |
|---|---|---|
| @@ -0,0 +1,17 @@ | ||
| # [S] Binary release publishers run on their tag | ||
|
|
||
| ## Goal | ||
|
|
||
| `release-brew`, `release-go` and `release-swift-lib` run as their release tag, | ||
| not through `workflow_run` on `main`, like the publishers | ||
| [Release credentials off main](/quest/m0/ci/publish-release-only.md) moves. | ||
|
|
||
| ## Plan | ||
|
|
||
| Planned 2026-11-02 (maintainer, follow-up planning after the 2026-11-02 /quest-complete run), from [moq-dev/moq#7431](https://github.com/moq-dev/moq/pull/7431). They use | ||
| the `bot` Environment today, which admits `main`; moving them needs `bot` to | ||
| admit the binary release tags, a maintainer action to list in the PR. | ||
|
|
||
| ## Required | ||
|
|
||
| - [Release credentials off main](/quest/m0/ci/publish-release-only.md) - the same move for the `publish` jobs lands first |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,15 @@ | ||
| # [XS] The flake lane skips hosts that can't map user namespaces | ||
|
|
||
| ## Goal | ||
|
|
||
| `check flake` skips with a clear note, instead of failing, on a host whose | ||
| sandbox can't write `/proc/self/uid_map`, as it already does when user | ||
| namespaces are unavailable. | ||
|
|
||
| ## Plan | ||
|
|
||
| Planned 2026-11-02 (maintainer, follow-up planning after the 2026-11-02 /quest-complete run), from [moq-dev/moq#7461](https://github.com/moq-dev/moq/pull/7461), whose | ||
| local gate failed `check flake` building nixpkgs' `github-runner` with | ||
| `unshare: write failed /proc/self/uid_map`. `MOQ_USERNS_UNAVAILABLE` in | ||
| `sh/dispatch.sh` does not catch this case; probe the write itself. CI hosts | ||
| that can map namespaces must still run the lane. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,29 @@ | ||
| # [XS] moq-c's gated callback test frees nothing early | ||
|
|
||
| ## Goal | ||
|
|
||
| `rs/moq-c/src/test.rs`'s `gated_callback` never touches `user_data` after the | ||
| test may have dropped it, so the moq-c tests stop aborting under load with | ||
| `corrupted size vs. prev_size` (SIGABRT). The fix is at the cause, never a | ||
| retry or a sleep. | ||
|
|
||
| ## Plan | ||
|
|
||
| Planned 2026-11-02 (maintainer, follow-up planning after the 2026-11-02 /quest-complete run), from the SIGABRT in | ||
| [moq-dev/moq#7461](https://github.com/moq-dev/moq/pull/7461)'s Check run | ||
| (`moq-c test::follow_delivers_the_instance_again_after_an_end`). | ||
|
|
||
| - Cause: `gated_callback` sends `code` and only then locks `gate.hold`. | ||
| Cancelling the follow is asynchronous, so after the terminal `0` arrives the | ||
| test drops `gate` while the callback thread may still reach the freed | ||
| `Box<Gate>`. The API guarantees `user_data` only until the terminal callback | ||
| (`rs/moq-c/src/api.rs`, around line 2384). Introduced by | ||
| [moq-dev/moq#5886](https://github.com/moq-dev/moq/pull/5886). | ||
| - Fix: take `gate.hold` before `gate.tx.send(code)`, so the test cannot free | ||
| the gate while the callback still holds it. It is the only test callback that | ||
| touches `user_data` after sending. | ||
| - Reproduce first: a temporary sleep between the send and the lock makes | ||
| valgrind report the invalid write; keep a regression that fails without the | ||
| fix if one is practical. | ||
|
|
||
| Follow the rules in [More tests under load](/quest/m0/test-flakes-2/README.md). |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,26 @@ | ||
| # [S] A resume more than one group behind never hangs | ||
|
|
||
| ## Goal | ||
|
|
||
| A resumed read that starts more than one group behind the latest one gets | ||
| every group or a drop for it on every wire version, never a hang. The fix is | ||
| the simplest one that works; moq-transport FETCH/SUBSCRIBE edge cases are not | ||
| worth draft-specific fallbacks. | ||
|
|
||
| ## Plan | ||
|
|
||
| Planned 2026-11-02 (maintainer, follow-up planning after the 2026-11-02 /quest-complete run), from [moq-dev/moq#7631](https://github.com/moq-dev/moq/pull/7631), which | ||
| found it and kept its two direct bounded-resume tests on draft 22 only. | ||
|
|
||
| - It hangs on `main` too, even with an open-ended range, over a draft-18 | ||
| upstream. Two causes: our moq-transport publisher answers only one-group | ||
| FETCHes, so the fill for the missing run never arrives (a one-group range | ||
| works); and the live join can skip a group that is already cached | ||
| (`TrackState::answered` in `rs/moq-net/src/model/track.rs`). | ||
| - Also check whether the moq-lite publisher has the same wait when it serves a | ||
| bounded SUBSCRIBE from a moq-transport copy that was only fetched. | ||
| - Multi-group past reads between our own moq-transport nodes are refused until | ||
| hole markers land (decided on | ||
| [moq-dev/moq#7625](https://github.com/moq-dev/moq/pull/7625)); a refused run | ||
| must come back as dropped, not hang. | ||
| - Enable the draft-18 cases of #7631's bounded-resume tests as the regression. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,38 @@ | ||
| # [M] moq-crypto replaces moq-sign and moq-e2ee | ||
|
|
||
| ## Goal | ||
|
|
||
| One crate, `moq-crypto`, and one JS package, `@moq/crypto`, hold MoQ's | ||
| content signing and end-to-end encryption, replacing `moq-sign`/`@moq/sign` | ||
| and `moq-e2ee`/`@moq/e2ee` before `main` is next cut into `release`. Both | ||
| halves share one timestamp check with moq-net, so they cannot drift from it. | ||
|
|
||
| ## Plan | ||
|
|
||
| Planned 2026-11-02 (maintainer, follow-up planning after the 2026-11-02 /quest-complete run). The follow-up started from | ||
| [moq-dev/moq#7614](https://github.com/moq-dev/moq/pull/7614), which made | ||
| `moq_net::group::on_track` public; the maintainer asked to combine the two | ||
| packages instead of only deduplicating the check. | ||
|
|
||
| Decisions: | ||
|
|
||
| - ✅ Name it `moq-crypto` (Rust) and `@moq/crypto` (JS). Not chosen: | ||
| `moq-secure`; keeping `moq-e2ee` and absorbing signing into it. | ||
| - ✅ Merge JS too, for parity. `@moq/sign` and `@moq/e2ee` are private and | ||
| unpublished, so the rename costs nothing outside the repository. Not chosen: | ||
| Rust only. | ||
| - ✅ Plain `sign` and `e2ee` modules, always built. Not chosen: Cargo features | ||
| per half. | ||
| - ✅ `moq-e2ee` 0.0.19 is already on crates.io: at the cut, publish a final | ||
| `moq-e2ee` whose README points at `moq-crypto`. No yank. Not chosen: | ||
| leaving it as is; yanking it. Version levels stay with the maintainer. | ||
| - Both halves call `moq_net::group::on_track` instead of their own copies | ||
| (for example `rs/moq-sign/src/group.rs:48`). | ||
|
|
||
| Keep the crate independent of hang and codec-specific publisher policy, as the | ||
| [E2EE epic](/quest/m2/e2ee/README.md) requires. Update every crate, package, | ||
| doc, binding, and quest that names the old packages, including the m2 E2EE | ||
| quests. | ||
|
|
||
| Public API: the crate and package names and their import paths change. | ||
| Wire: none. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| # [S] moq-quic's idle connections keep no burst-sized state | ||
|
|
||
| ## Goal | ||
|
|
||
| A moq-quic connection's per-stream "readable" event queue stays bounded by the | ||
| number of streams with unread data, not by the size of a burst, and a quiet | ||
| connection keeps no per-stream bytes for streams it no longer has. | ||
|
|
||
| ## Plan | ||
|
|
||
| Planned 2026-11-02 (maintainer, follow-up planning after the 2026-11-02 /quest-complete run), from [moq-dev/moq#7528](https://github.com/moq-dev/moq/pull/7528), which | ||
| stopped recycling freed receive state. | ||
|
|
||
| - Deduplicate the per-stream readable events the connection queues; today the | ||
| queue can grow to the size of a burst. | ||
| - Trace the roughly 70 to 90 bytes per peak concurrent stream that a quiet | ||
| connection still keeps after #7528. The stream maps holding their peak | ||
| capacity are the likely part; release or shrink them at rest. | ||
| - Measure retained bytes after a burst with #7528's `receive_bursts` bench. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,15 @@ | ||
| # [XS] Stats name the route instance's epoch with a type | ||
|
|
||
| ## Goal | ||
|
|
||
| `moq_stats::GroupFrame::epoch` carries a dedicated type rather than a bare | ||
|
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.
|
||
| integer, and the routing contract tests stop labelling the instance's value | ||
| `epoch` where they mean the instance, so the public stats API matches the | ||
| instance/epoch naming before the cut. | ||
|
|
||
| ## Plan | ||
|
|
||
| Planned 2026-11-02 (maintainer, follow-up planning after the 2026-11-02 /quest-complete run), leftovers from [moq-dev/moq#7489](https://github.com/moq-dev/moq/pull/7489) | ||
| (routes carry an instance and a per-instance epoch). | ||
|
|
||
| Public API: the `GroupFrame` field's type changes. | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,13 @@ | ||
| # [XS] The relay bench reports io_uring pool size and RSS | ||
|
|
||
| ## Goal | ||
|
|
||
| The `bench/` relay summary reports each run's io_uring buffer pool gauges | ||
| (receive and send, total and in use) and the relay's RSS, so a regression in | ||
| pool growth shows up in normal bench runs. | ||
|
|
||
| ## Plan | ||
|
|
||
| Planned 2026-11-02 (maintainer, follow-up planning after the 2026-11-02 /quest-complete run), from [moq-dev/moq#7233](https://github.com/moq-dev/moq/pull/7233), which | ||
| added the gauges to `/metrics` and measured them with a throwaway script. | ||
| Read them from the relay's `/metrics` at the end of each workload. |
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.
This note tells the reader to substitute "18, 20, and 22" manually, but line 42 still opens
Drafts 18 and 22 only, nightly:and line 43 linksmoq-transport 18 and 22 only(whose title is now "moq-transport 18, 20, and 22 only"). AGENTS asks stale text be fixed inline, so editing those two spots removes both the contradiction and the override note.