From 196e4f81262f71d1477c7b2c5e14e0e241c12125 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Mon, 2 Nov 2026 19:51:32 -0800 Subject: [PATCH 1/9] chore(quest): claim quest/m0/ci/five-minutes.md Quest-Claim: 18c0b3a3fd42aca1 From e6afdcca3210962b7ee34896fc0cff87cfeec186 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Mon, 2 Nov 2026 20:31:38 -0800 Subject: [PATCH 2/9] fix(ci): query installed pkg-config files directly Co-Authored-By: GPT-6.1 Sol --- nix/overlay.nix | 2 +- sh/c/check.sh | 3 +-- sh/cpp/check.sh | 6 +++--- sh/obs/qlog.sh | 6 +++--- sh/obs/unit.sh | 6 +++--- test/smoke/smoke.sh | 6 +++--- 6 files changed, 14 insertions(+), 15 deletions(-) diff --git a/nix/overlay.nix b/nix/overlay.nix index 6c98ce53217..f9fb696ab09 100644 --- a/nix/overlay.nix +++ b/nix/overlay.nix @@ -179,7 +179,7 @@ let # Resolve the paths the way a consumer's pkg-config will, so a template # whose libdir or includedir misses what this prefix ships fails here. for check in libdir:libmoq.a includedir:moq.h; do - dir=$(PKG_CONFIG_PATH=$out/lib/pkgconfig pkg-config --variable="''${check%%:*}" moq-c) + dir=$(pkg-config --variable="''${check%%:*}" "$pc") if [ ! -f "$dir/''${check#*:}" ]; then echo "moq-c.pc ''${check%%:*} $dir has no ''${check#*:}" >&2 exit 1 diff --git a/sh/c/check.sh b/sh/c/check.sh index 2786faa9c21..ad2c4e7e9e2 100755 --- a/sh/c/check.sh +++ b/sh/c/check.sh @@ -114,9 +114,8 @@ if [[ "$(uname -s)" == MINGW* || "$(uname -s)" == MSYS* ]]; then fi if command -v pkg-config >/dev/null 2>&1; then - export PKG_CONFIG_PATH="$prefix/$libdir/pkgconfig" # Assigned first: set -e ignores a failing substitution inside a command's arguments. - flags=$(pkg-config --cflags --libs moq-c) + flags=$(pkg-config --cflags --libs "$prefix/$libdir/pkgconfig/moq-c.pc") mkdir -p "$build/pkg-config" # shellcheck disable=SC2086 # flags is a flag list. "${CC:-cc}" -std=c11 -Wall -Wextra -Werror -pedantic-errors -o "$build/pkg-config/probe" moq/test/probe.c $flags diff --git a/sh/cpp/check.sh b/sh/cpp/check.sh index 69d1a5288a3..9da31fe9f10 100755 --- a/sh/cpp/check.sh +++ b/sh/cpp/check.sh @@ -96,10 +96,10 @@ bash ../doc/lib/samples.sh cpp ../doc/lib/cpp/index.md >"$build/doc-samples.cpp" "${CXX:-c++}" -std=c++20 -fsyntax-only -Wall -Werror -I"$prefix/include" moq/bench/main.cpp if command -v pkg-config >/dev/null 2>&1; then - export PKG_CONFIG_PATH="$prefix/lib/pkgconfig" + pc="$prefix/lib/pkgconfig/moq-cpp.pc" # Assigned first: set -e ignores a failing substitution inside a command's arguments. - sources=$(pkg-config --variable=sources moq-cpp) - flags=$(pkg-config --cflags --libs moq-cpp) + sources=$(pkg-config --variable=sources "$pc") + flags=$(pkg-config --cflags --libs "$pc") # Those sources already compiled at C++17 with these flags in test-17, so the probe links # that library instead of compiling them again. if [[ ! -f "$sources" ]]; then diff --git a/sh/obs/qlog.sh b/sh/obs/qlog.sh index 0ca64f07e87..d120bf7ca00 100755 --- a/sh/obs/qlog.sh +++ b/sh/obs/qlog.sh @@ -10,10 +10,10 @@ fi here=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) moq_prefix=$("$here/moq.sh" qlog) -export PKG_CONFIG_PATH="$moq_prefix/lib/pkgconfig" +moq_pc="$moq_prefix/lib/pkgconfig/moq-cpp.pc" # Assigned first: set -e ignores a failing substitution inside a command's arguments. -moq_sources=$(pkg-config --variable=sources moq-cpp) -moq_flags=$(pkg-config --cflags --libs moq-cpp) +moq_sources=$(pkg-config --variable=sources "$moq_pc") +moq_flags=$(pkg-config --cflags --libs "$moq_pc") out=$(mktemp -d) trap 'rm -rf "$out"' EXIT diff --git a/sh/obs/unit.sh b/sh/obs/unit.sh index 6a21fb5e4a9..82d929c4d9a 100755 --- a/sh/obs/unit.sh +++ b/sh/obs/unit.sh @@ -35,9 +35,9 @@ ffmpeg=$(pkg-config --cflags libavcodec libavutil libswscale) # The output and source tests run against the real moq-ffi, over a server in # the same process. The bindings compile here, with the tests' flags. moq_prefix=$("$here/moq.sh") -export PKG_CONFIG_PATH="$moq_prefix/lib/pkgconfig" -moq_sources=$(pkg-config --variable=sources moq-cpp) -moq_libs=$(pkg-config --libs moq-cpp) +moq_pc="$moq_prefix/lib/pkgconfig/moq-cpp.pc" +moq_sources=$(pkg-config --variable=sources "$moq_pc") +moq_libs=$(pkg-config --libs "$moq_pc") flags=(-std=c++17 -g -O0 -pthread -Werror) if [ "$mode" = "tsan" ]; then diff --git a/test/smoke/smoke.sh b/test/smoke/smoke.sh index 85299283bd2..76f479c6b0b 100755 --- a/test/smoke/smoke.sh +++ b/test/smoke/smoke.sh @@ -296,12 +296,12 @@ c_build_pkgconfig() { echo "pkg-config not on PATH (apt install pkg-config / brew install pkgconf)" >&2 return 1 } - export PKG_CONFIG_PATH="$LIBMOQ_ROOT/lib/pkgconfig" - cflags=$(pkg-config --cflags moq) || { + local pc="$LIBMOQ_ROOT/lib/pkgconfig/moq.pc" + cflags=$(pkg-config --cflags "$pc") || { echo "pkg-config --cflags moq failed" >&2 return 1 } - libs=$(pkg-config --static --libs moq) || { + libs=$(pkg-config --static --libs "$pc") || { echo "pkg-config --static --libs moq failed" >&2 return 1 } From 2bce00b7f04e2b53dab3ff529cca68bd78b388c6 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Mon, 2 Nov 2026 20:40:09 -0800 Subject: [PATCH 3/9] chore(ci): record warm diff-gate measurements and remaining waits Co-Authored-By: GPT-6.1 Sol --- quest/m0/ci/five-minutes.md | 114 +++++++++++++++++++++++++++--------- 1 file changed, 86 insertions(+), 28 deletions(-) diff --git a/quest/m0/ci/five-minutes.md b/quest/m0/ci/five-minutes.md index 5684d83b5df..6676adfb07c 100644 --- a/quest/m0/ci/five-minutes.md +++ b/quest/m0/ci/five-minutes.md @@ -50,41 +50,99 @@ dependent at both feature extremes in 981 s (52%); tokio-features and media-features, selected only as dependents, took 294 s; `cargo doc` 159 s; the release loom compile 112 s. -Landed in [moq-dev/moq#7282](https://github.com/moq-dev/moq/pull/7282): the -local `just check` runs `feature-shapes` and the net, QUIC, tokio, and media +The first reduction landed in [moq-dev/moq#7282](https://github.com/moq-dev/moq/pull/7282): the +local `just check` ran `feature-shapes` and the net, QUIC, tokio, and media feature contracts for the crates the diff changed, while the landing worker's `just ci` -keeps their dependents; the gate compiles the loom models in the dev profile +kept their dependents; the gate compiled the loom models in the dev profile (46 s against release's 146 s after a moq-net edit). The same lint then took 319 s at load near 30, with `feature-shapes` at 29 s. The whole `just check` for a moq-net edit took 547 s with load falling from 24 to 8: `check rs` 230 s and `test rs` 317 s, run one after the other in the rs lane. The test phase is a 206 s build of moq-net's dependents and a 110 s run of 9,049 tests. -What remains for a moq-net edit, largest first: - -- The test build recompiles every dependent after a moq-net edit. Candidates - are the epic's [hakari](/quest/m0/ci/hakari.md) lever (the BTree thin-generics - lever was measured at about 30 ms of CPU per build and dropped), or running the rs lint beside the - test build in a second target directory, which trades CPU for wall time - against the epic's CPU measure. Decided 2026-10-30 (user): defer that - parallel lint; measure it after the hakari quest lands (slow-tests landed in - [moq-dev/moq#6987](https://github.com/moq-dev/moq/pull/6987)). -- The lint's remaining 230 s: the dev loom compile and `cargo doc`. Decided - 2026-10-31 (maintainer, see the [epic](/quest/m0/ci/README.md)): the gate - drops the loom compile, the Send-depth check (now its own Nightly job), the - feature shapes, and the feature contracts (net-features's 62 s among them), - and tests the relay's io_uring runtime in the one test build instead of a - separate clippy pass. -- Measure the other routes the same way: a moq-ffi edit, which selects every - binding's lane under `CHECK_JOBS=3`, and a JS-only edit. -- `just test` has no root recipe: bare `just test` lists the cross-language - suites. Name which command the `just test` baseline above counts before - measuring it. -- Prefer the epic's levers, such as [hakari](/quest/m0/ci/hakari.md) and cache - hits, and tighter diff selection, - over moving coverage. Move a check to the queue or nightly only under the - epic's rule: evidence and an explicit coverage tradeoff for each. -- Split any large single lever into its own quest. +The settled gate changes have since landed: + +- [moq-dev/moq#7472](https://github.com/moq-dev/moq/pull/7472) removed the + feature shapes and contracts from the shared local and landing gate. The + Features workflow retains the matrix nightly and on release PRs. The + relay's io_uring tests join the default test build on Linux. +- [moq-dev/moq#7473](https://github.com/moq-dev/moq/pull/7473) removed the loom + compile and moved Send-depth to its own Nightly job. + +Measured 2026-11-02 on the desktop (x86_64, Rust 1.98.1, Bun 1.4.2, +mbx 1.25.0), with other agents running. Each row is one observation after a +successful preparation run, not a controlled comparison with the historical +samples or proof of the bound for every diff. A comment-only source edit +invalidated the package again after preparation. The temporary edits were +restored after measuring. + +`bench/local.py --checkout . --workers 4 --jobs 3 --samples 1 --cache ... -- +just check HEAD` admits the whole command once, separates admission from work, +and records child CPU time. `HEAD` makes the edited source the entire measured +diff. The net and JS runs used `196e4f8126`; the FFI run used `e6afdcca32` with +the installed pkg-config lookup fix. Logs remain in the checkout's +`.tmp/local-bench/`. + +| Edited source | Admission (s) | Work (s) | Total (s) | CPU (s) | Starting load (1 min) | +| --- | ---: | ---: | ---: | ---: | ---: | +| `rs/moq-net/src/lib.rs` | 88.2 | 227.1 | 315.3 | 1,048.0 | 31.4 | +| `js/net/src/index.ts` | 0.2 | 228.9 | 229.0 | 352.4 | 12.5 | +| `rs/moq-ffi/src/lib.rs`, explicit Gradle executable | 0.2 | 101.1 | 101.2 | 219.8 | 9.7 | + +The net lane was 34 s of lint and docs, then 193 s of tests: a 68 s build +and 122 s running 9,529 tests (all passed). The JS lane was 115 s checking, +54 s testing, then the shared Markdown and tooling checks. The FFI route ran +the Rust, Python, C, C++, Kotlin, Go, OBS compile, and Dart lanes with +`CHECK_JOBS=3`; Swift skipped because this Linux host has no Swift toolchain. + +The first FFI attempt exposed two base-branch failures: + +- C and C++ installed and ran their CMake probes, then failed to find their + pkg-config packages. Nix's pkg-config wrapper replaces `PKG_CONFIG_PATH` + with its target-specific value. Passing the installed `.pc` file directly + fixes the lookup without changing the wrapper's dependency search. The + same explicit-prefix queries in OBS, Nix packaging, and published smoke + validation now use their `.pc` file too. C and C++ passed in both subsequent + configured FFI runs. +- Kotlin recursively called its own Gradle wrapper because `command -v gradle` + selected Nix's exported function. The attempt was cancelled and its child + processes stopped. [moq-dev/moq#7632](https://github.com/moq-dev/moq/pull/7632) + already owns this fix. Both subsequent FFI runs used the supported + `GRADLE_CMD` override set to the dev shell's absolute Gradle executable; + the table is conditional on that configuration, not a passing default run. + +What remains: + +- Admission still makes the measured net route exceed 5 minutes despite its + command taking 227 s. The 2026-10-29 admission decision above remains with + moq-dev/quest. +- Repeat the default FFI route after the Gradle fix lands, without the override. +- Name the test command in the goal before measuring it. The historical + `just test` row has no reproducible command selection attached to it. + Bare `just test` lists the cross-language suites and exits successfully; + `just check` already runs each selected module's unit tests. Do not compare + that row with a newly chosen suite. +- Keep the dependency-build and cache work with + [hakari](/quest/m0/ci/hakari.md). Decided 2026-10-30 (user): defer parallel + Rust lint until that quest lands, then measure it. The slow-tests reduction + landed in [moq-dev/moq#6987](https://github.com/moq-dev/moq/pull/6987); the + BTree thin-generics lever measured about 30 ms of CPU per build and was dropped. +- Prefer the epic's levers and tighter diff selection over moving coverage. + Moving a check to the queue or nightly still needs evidence and an explicit + coverage tradeoff. Split a large independent lever into its own quest. + +## Waiting + +- Maintainer: name the command covered by the `just test` goal. Recommended: + replace "`just check` and `just test` each" with "`just check`, including its + selected modules' test phases," because that is the diff-scoped gate. + Alternatively name the cross-language suites that also need the bound. + The historical test row's command selection has not been recovered. + +- moq-dev/quest: admission must keep the whole gate inside the worker's cache + window; repeat the net measurement after its admission work lands. +- moq-dev/moq: [moq-dev/moq#7632](https://github.com/moq-dev/moq/pull/7632) + must land before repeating the default FFI measurement without `GRADLE_CMD`. ## Related From a3e10bb0964fba11b7182d024144e407c3e8fbf9 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Mon, 2 Nov 2026 20:41:04 -0800 Subject: [PATCH 4/9] docs(ci): link the measured gate revisions Co-Authored-By: GPT-6.1 Sol --- quest/m0/ci/five-minutes.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/quest/m0/ci/five-minutes.md b/quest/m0/ci/five-minutes.md index 6676adfb07c..68fa6380fb0 100644 --- a/quest/m0/ci/five-minutes.md +++ b/quest/m0/ci/five-minutes.md @@ -79,8 +79,11 @@ restored after measuring. `bench/local.py --checkout . --workers 4 --jobs 3 --samples 1 --cache ... -- just check HEAD` admits the whole command once, separates admission from work, and records child CPU time. `HEAD` makes the edited source the entire measured -diff. The net and JS runs used `196e4f8126`; the FFI run used `e6afdcca32` with -the installed pkg-config lookup fix. Logs remain in the checkout's +diff. The net and JS runs used +[196e4f8126](https://github.com/moq-dev/moq/commit/196e4f81262f71d1477c7b2c5e14e0e241c12125); +the FFI run used +[e6afdcca32](https://github.com/moq-dev/moq/commit/e6afdcca3210962b7ee34896fc0cff87cfeec186) +with the installed pkg-config lookup fix. Logs remain in the checkout's `.tmp/local-bench/`. | Edited source | Admission (s) | Work (s) | Total (s) | CPU (s) | Starting load (1 min) | From 813bbe6f2ffdb735b60ecd7718ca45a120643f3f Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Mon, 2 Nov 2026 20:52:59 -0800 Subject: [PATCH 5/9] fix(ci): preserve published smoke's name-based package lookup Co-Authored-By: GPT-6.1 Sol --- quest/m0/ci/five-minutes.md | 5 +++-- test/smoke/smoke.sh | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/quest/m0/ci/five-minutes.md b/quest/m0/ci/five-minutes.md index 68fa6380fb0..71cc598671f 100644 --- a/quest/m0/ci/five-minutes.md +++ b/quest/m0/ci/five-minutes.md @@ -104,8 +104,9 @@ The first FFI attempt exposed two base-branch failures: pkg-config packages. Nix's pkg-config wrapper replaces `PKG_CONFIG_PATH` with its target-specific value. Passing the installed `.pc` file directly fixes the lookup without changing the wrapper's dependency search. The - same explicit-prefix queries in OBS, Nix packaging, and published smoke - validation now use their `.pc` file too. C and C++ passed in both subsequent + same explicit-prefix queries in OBS and Nix packaging now use their `.pc` + file too. Published smoke keeps its name-based lookup to test consumer + resolution. C and C++ passed in both subsequent configured FFI runs. - Kotlin recursively called its own Gradle wrapper because `command -v gradle` selected Nix's exported function. The attempt was cancelled and its child diff --git a/test/smoke/smoke.sh b/test/smoke/smoke.sh index 76f479c6b0b..85299283bd2 100755 --- a/test/smoke/smoke.sh +++ b/test/smoke/smoke.sh @@ -296,12 +296,12 @@ c_build_pkgconfig() { echo "pkg-config not on PATH (apt install pkg-config / brew install pkgconf)" >&2 return 1 } - local pc="$LIBMOQ_ROOT/lib/pkgconfig/moq.pc" - cflags=$(pkg-config --cflags "$pc") || { + export PKG_CONFIG_PATH="$LIBMOQ_ROOT/lib/pkgconfig" + cflags=$(pkg-config --cflags moq) || { echo "pkg-config --cflags moq failed" >&2 return 1 } - libs=$(pkg-config --static --libs "$pc") || { + libs=$(pkg-config --static --libs moq) || { echo "pkg-config --static --libs moq failed" >&2 return 1 } From 33fdb04ff688133be510cc8ae738fc96536cc1c1 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Mon, 2 Nov 2026 20:56:44 -0800 Subject: [PATCH 6/9] fix(ci): keep transient build output out of the namespace probe Co-Authored-By: GPT-6.1 Sol --- nix/runner/userns-probe.nix | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nix/runner/userns-probe.nix b/nix/runner/userns-probe.nix index 482918e7618..5f20667db7d 100644 --- a/nix/runner/userns-probe.nix +++ b/nix/runner/userns-probe.nix @@ -1,6 +1,7 @@ { nonce }: let - flake = builtins.getFlake (toString ../..); + # Other lanes rewrite ignored build output while this probe evaluates. + flake = builtins.getFlake "git+file://${toString ../..}"; pkgs = import flake.inputs.nixpkgs { system = builtins.currentSystem; }; in pkgs.runCommand "moq-userns-probe-${nonce}" From 1c21964f614cae69b90d408f53f932d12420fc14 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Mon, 2 Nov 2026 20:57:36 -0800 Subject: [PATCH 7/9] docs(ci): record the namespace probe validation fix Co-Authored-By: GPT-6.1 Sol --- quest/m0/ci/five-minutes.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/quest/m0/ci/five-minutes.md b/quest/m0/ci/five-minutes.md index 71cc598671f..b74c3a81d47 100644 --- a/quest/m0/ci/five-minutes.md +++ b/quest/m0/ci/five-minutes.md @@ -115,6 +115,12 @@ The first FFI attempt exposed two base-branch failures: `GRADLE_CMD` override set to the dev shell's absolute Gradle executable; the table is conditional on that configuration, not a passing default run. +Final local validation also reproduced a namespace-probe race: a raw path +flake copied ignored CMake output while another lane replaced a generated +`render` file. The probe now uses Git's tracked source selection, excluding +build output. It still reports the host builder's namespace failure, allowing +the existing local skip; strict CI continues to require a capable builder. + What remains: - Admission still makes the measured net route exceed 5 minutes despite its From a5dbd0bfd37e87f53d588f4e4184a94f6bbdd382 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Mon, 2 Nov 2026 21:03:51 -0800 Subject: [PATCH 8/9] refactor(ci): load only locked nixpkgs for the namespace probe Co-Authored-By: GPT-6.1 Sol --- nix/runner/userns-probe.nix | 7 ++++--- quest/m0/ci/five-minutes.md | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/nix/runner/userns-probe.nix b/nix/runner/userns-probe.nix index 5f20667db7d..a1ef40864ba 100644 --- a/nix/runner/userns-probe.nix +++ b/nix/runner/userns-probe.nix @@ -1,8 +1,9 @@ { nonce }: let - # Other lanes rewrite ignored build output while this probe evaluates. - flake = builtins.getFlake "git+file://${toString ../..}"; - pkgs = import flake.inputs.nixpkgs { system = builtins.currentSystem; }; + # The capability probe needs only the pinned nixpkgs, independent of build output. + lock = builtins.fromJSON (builtins.readFile ../../flake.lock); + nixpkgs = builtins.fetchTree lock.nodes.${lock.nodes.root.inputs.nixpkgs}.locked; + pkgs = import nixpkgs.outPath { system = builtins.currentSystem; }; in pkgs.runCommand "moq-userns-probe-${nonce}" { diff --git a/quest/m0/ci/five-minutes.md b/quest/m0/ci/five-minutes.md index b74c3a81d47..c8c1a2facb1 100644 --- a/quest/m0/ci/five-minutes.md +++ b/quest/m0/ci/five-minutes.md @@ -117,9 +117,10 @@ The first FFI attempt exposed two base-branch failures: Final local validation also reproduced a namespace-probe race: a raw path flake copied ignored CMake output while another lane replaced a generated -`render` file. The probe now uses Git's tracked source selection, excluding -build output. It still reports the host builder's namespace failure, allowing -the existing local skip; strict CI continues to require a capable builder. +`render` file. The probe now reads `flake.lock` and fetches its pinned nixpkgs +directly, without copying the checkout. It still reports the host builder's +namespace failure, allowing the existing local skip; strict CI continues to +require a capable builder. What remains: From 16d960098cd30b2ff2b9877608df85331bc7773c Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Tue, 3 Nov 2026 15:31:43 -0800 Subject: [PATCH 9/9] docs(quest): bound just check with its test phases The maintainer settled the goal's test command on 2026-11-03: the five-minute bound covers `just check`, including its selected modules' test phases. Co-Authored-By: Claude Opus 5.5 --- quest/m0/ci/README.md | 2 +- quest/m0/ci/five-minutes.md | 24 ++++++++++-------------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/quest/m0/ci/README.md b/quest/m0/ci/README.md index 8c47322eee4..1a932fd1616 100644 --- a/quest/m0/ci/README.md +++ b/quest/m0/ci/README.md @@ -155,7 +155,7 @@ The historical samples locate candidates; they are not controlled benchmarks. - [Land main through GitHub's merge queue](/quest/m0/ci/land.md) - one PR at a time on the self-hosted runner; the host's Codex fixer fixes and re-enqueues every dropped PR - [A cache error is a miss](/quest/m0/ci/nix-cache-5xx.md) - a transient `nix.moq.dev` 5xx no longer fails `just ci` - [Cheap checks skip the queue](/quest/m0/ci/gate-quick.md) - condition: quest ships `quest gate --quick`; then cheap modules wait at most a minute -- [Gate each diff in under five minutes](/quest/m0/ci/five-minutes.md) - `just check` and `just test` each finish within a worker's 5-minute prompt cache, admission wait included +- [Gate each diff in under five minutes](/quest/m0/ci/five-minutes.md) - `just check`, test phases included, finishes within a worker's 5-minute prompt cache, admission wait included - [Measure the parallel frontend](/quest/m0/ci/nightly-levers.md) - a pinned nightly's parallel frontend, adopted only if the numbers beat its risks; Cranelift is ruled out - [Verify the R2 Rust cache](/quest/m0/ci/mbx-r2-verify.md) - confirm the hosted Nightly jobs reuse the previous Nightly, then measure restore time and expiry - [Verify the Nix cache](/quest/m0/ci/nix-cache-verify.md) - confirm releases use `nix.moq.dev`, check its bucket sizes, and retire Cachix diff --git a/quest/m0/ci/five-minutes.md b/quest/m0/ci/five-minutes.md index c8c1a2facb1..876139dccb4 100644 --- a/quest/m0/ci/five-minutes.md +++ b/quest/m0/ci/five-minutes.md @@ -2,15 +2,22 @@ ## Goal -`just check` and `just test` each finish in under 5 minutes of wall time for -every diff-scoped run on the desktop with warm caches, counting time queued in -`quest gate` admission. A worker agent then runs its own gate inside its +`just check`, including its selected modules' test phases, finishes in under +5 minutes of wall time for every diff-scoped run on the desktop with warm +caches, counting time queued in `quest gate` admission. A worker agent then runs its own gate inside its 5-minute prompt-cache window. Explicit full runs (`--all`, nightly, release) are exempt; work moved out of the diff-scoped gate goes to the merge queue or nightly with its coverage kept. ## Plan +Decided 2026-11-03 (maintainer): the bound covers "`just check`, including its +selected modules' test phases" ✅, not bare `just test` or a separately named +set of cross-language suites. `just check` is the diff-scoped gate and already +runs each selected module's tests; bare `just test` only lists the +cross-language suites. The historical `just test` baseline row below is not +compared with new measurements. + Decided 2026-10-29 (user): sub-agents run with a 5-minute prompt cache and the coordinating session with a 1-hour one ([kixelated/quest#276](https://github.com/kixelated/quest/pull/276)). A worker @@ -128,11 +135,6 @@ What remains: command taking 227 s. The 2026-10-29 admission decision above remains with moq-dev/quest. - Repeat the default FFI route after the Gradle fix lands, without the override. -- Name the test command in the goal before measuring it. The historical - `just test` row has no reproducible command selection attached to it. - Bare `just test` lists the cross-language suites and exits successfully; - `just check` already runs each selected module's unit tests. Do not compare - that row with a newly chosen suite. - Keep the dependency-build and cache work with [hakari](/quest/m0/ci/hakari.md). Decided 2026-10-30 (user): defer parallel Rust lint until that quest lands, then measure it. The slow-tests reduction @@ -144,12 +146,6 @@ What remains: ## Waiting -- Maintainer: name the command covered by the `just test` goal. Recommended: - replace "`just check` and `just test` each" with "`just check`, including its - selected modules' test phases," because that is the diff-scoped gate. - Alternatively name the cross-language suites that also need the bound. - The historical test row's command selection has not been recovered. - - moq-dev/quest: admission must keep the whole gate inside the worker's cache window; repeat the net measurement after its admission work lands. - moq-dev/moq: [moq-dev/moq#7632](https://github.com/moq-dev/moq/pull/7632)