diff --git a/quest/m0/README.md b/quest/m0/README.md index cd89717b08b..647308e68be 100644 --- a/quest/m0/README.md +++ b/quest/m0/README.md @@ -33,4 +33,5 @@ edge, which embeds moq-relay; it moved there on 2026-09-28. - [More tests under load](/quest/m0/test-flakes-2/README.md) - load-only and queue failures, one quest per flake, fixed at the cause, since each one drops a queued PR - [Tests can't wait on the real clock](/quest/m0/clock-guard/README.md) - a test whose real-clock timer fires fails every run, in JS and, if the spike holds, Rust - [A lite subscriber parks once only passive readers remain](/quest/m0/lite-passive-spin.md) - a datagram subscription left with only passive readers stops busy-looping +- [moq-net builds without async](/quest/m0/moq-net-no-async.md) - the no-async lib tests and doc links build, and CI checks them - [Agent build output can't fill the desktop's disk](/quest/m0/agent-disk-budget.md) - finished agent checkouts reclaim their mbx targets automatically, so parallel agent builds stop filling the root disk diff --git a/quest/m0/moq-net-no-async.md b/quest/m0/moq-net-no-async.md new file mode 100644 index 00000000000..cfe709a09d8 --- /dev/null +++ b/quest/m0/moq-net-no-async.md @@ -0,0 +1,20 @@ +# [XS] moq-net builds without async + +## Goal + +`moq-net` builds, tests, and documents without its `async` feature, and CI +checks that configuration so it stays that way. On main today (2026-11-06), +`cargo check -p moq-net --no-default-features --lib --tests` fails: +`track.rs`'s lib test calls `read_frame` on `group::Consumer`, which only +exists with `async`. The crate's no-async doc links are broken too +(reported by [moq-dev/moq#8023](https://github.com/moq-dev/moq/pull/8023)). + +## Plan + +Decided 2026-11-06 (maintainer, /quest-complete): ✅ m0, fix both and add the +no-async build to CI. Not chosen: m1; fixing it without a CI lane. + +Add the configuration to an existing check lane (such as `just check`'s rs +module) rather than a new job, and include the docs build. + +Public API: none. Wire: none. diff --git a/quest/m2/cluster-routing/routes/README.md b/quest/m2/cluster-routing/routes/README.md index f11c48a24d6..a3ef8969eaa 100644 --- a/quest/m2/cluster-routing/routes/README.md +++ b/quest/m2/cluster-routing/routes/README.md @@ -534,6 +534,8 @@ benchmarks. - [Route session integration](/quest/m2/cluster-routing/routes/session.md) - one router per origin node drives the origin and every lite-07 announce stream - [Announcement availability](/quest/m2/cluster-routing/routes/availability.md) - announcements report availability, and a let-go is offline rather than END, in Rust and JS - [js/net route layer](/quest/m2/cluster-routing/routes/js.md) - `js/net` encodes, decodes, and resolves the route layer +- [A declined lite-06 route is reconsidered when the lite-07 path fails](/quest/m2/cluster-routing/routes/lite06-failover.md) - a mixed-version relay fails over to the lite-06 route it declined +- [A covering predecessor's takeover shows under a mount](/quest/m2/cluster-routing/routes/mount-takeover.md) - lite-07 presents a takeover beneath a mount as lite-06 does - [Route layer acceptance](/quest/m2/cluster-routing/routes/acceptance.md) - forwarding fixtures ported and the model deleted, incident fixtures, end-to-end checks, and benchmarks ## Related diff --git a/quest/m2/cluster-routing/routes/lite06-failover.md b/quest/m2/cluster-routing/routes/lite06-failover.md new file mode 100644 index 00000000000..01e0ac1055e --- /dev/null +++ b/quest/m2/cluster-routing/routes/lite06-failover.md @@ -0,0 +1,23 @@ +# [M] A declined lite-06 route is reconsidered when the lite-07 path fails + +## Goal + +In a mixed-version cluster, a relay that declined an identity's lite-06 +route because it already knew that identity over lite-07 accepts the lite-06 +route again once the lite-07 path is gone, so the lite-06 path takes over +instead of leaving the broadcast unreachable. Today the relay declines it +once and never revisits it. + +## Plan + +Decided 2026-11-06 (maintainer, /quest-complete, a follow-up of +[moq-dev/moq#8023](https://github.com/moq-dev/moq/pull/8023)): ✅ m2, in this +epic, since the cut ships mixed-version clusters and this is a failover gap. +Not chosen: m3; m4. + +- Recognize known identities on lite-06 ingress, and keep the declined route + so it can be accepted again when the lite-07 route for that identity ends. +- Cover it with a mixed-version test: a relay with both paths to one + publisher loses the lite-07 one and keeps serving over lite-06. + +Starts once #8023 lands. Public API: none expected. Wire: none. diff --git a/quest/m2/cluster-routing/routes/mount-takeover.md b/quest/m2/cluster-routing/routes/mount-takeover.md new file mode 100644 index 00000000000..6e7fdcb571c --- /dev/null +++ b/quest/m2/cluster-routing/routes/mount-takeover.md @@ -0,0 +1,21 @@ +# [S] A covering predecessor's takeover shows under a mount + +## Goal + +Under a mounted grant (for example, tenant B seeing tenant A's `public` at +`shared`), a lite-07 claim whose predecessor covers the mount's target +arrives beneath the mount point as a takeover, as it does on lite-06. Today +it arrives as a start, because the predecessor has no name beneath the +mount point. + +## Plan + +Decided 2026-11-06 (maintainer, /quest-complete, a follow-up of +[moq-dev/moq#8023](https://github.com/moq-dev/moq/pull/8023)): ✅ m2, in this +epic, so lite-07 presents mounts as lite-06 does before the cut. Not chosen: +m3; m4. + +Extend `rs/moq-net/tests/integration/mount.rs`, which #8023 adds, with the +covering-predecessor case on both versions. + +Starts once #8023 lands. Public API: none. Wire: none. diff --git a/quest/m3/README.md b/quest/m3/README.md index e176efdea7e..204d4ff4383 100644 --- a/quest/m3/README.md +++ b/quest/m3/README.md @@ -46,6 +46,7 @@ federation) land. - [Vendored code has every upstream fix it needs](/quest/m3/vendor-sync/README.md) - the next cycle's vendor sync, which the cut moves under the m2 cut gate - [Release pull requests read the R2 Rust cache](/quest/m3/mbx-r2-release-cache.md) - after the cut brings the platform Rust cache to `release` - [Binary release publishers run on their tag](/quest/m3/release-tag-publishers.md) - after the cut brings the workflows to `release` +- [Relays split horizon per session](/quest/m3/route-split-horizon.md) - a relay never advertises a route back over the session it came from - [crates.io trusts the workflow](/quest/m3/crates-trusted-publisher.md) - maintainer action: the crates the cut first-publishes by token get a trusted publisher for `release-rs.yml` - [Rust releases publish through OIDC](/quest/m3/release-rs-oidc.md) - release-plz publishes with trusted publishing and `CARGO_REGISTRY_TOKEN` is revoked - [One policy for oversized container metadata](/quest/m3/import-metadata-policy.md) - fMP4 and MKV refuse or stream huge metadata by one documented rule diff --git a/quest/m3/route-split-horizon.md b/quest/m3/route-split-horizon.md new file mode 100644 index 00000000000..6a1978ba6f6 --- /dev/null +++ b/quest/m3/route-split-horizon.md @@ -0,0 +1,20 @@ +# [S] Relays split horizon per session + +## Goal + +A relay never advertises a route back over the session it learned it from. +Since [moq-dev/moq#8023](https://github.com/moq-dev/moq/pull/8023), each +neighbor holds two stream keys, so the router advertises a route back to its +source. That is loop-free by the feasibility condition, but it doubles route +traffic between every pair of relays. + +## Plan + +Decided 2026-11-06 (maintainer, /quest-complete, a follow-up of #8023): ✅ +m3: lite-07 routing ships correct in the cut, and this trims its traffic +afterward. Not chosen: m2; m4. + +Suppress the advertisement per session rather than per neighbor, and measure +route messages between two relays before and after. + +Public API: none. Wire: none; behavior only.