diff --git a/.github/workflows/queue.yml b/.github/workflows/queue.yml index ff77c49ed29..01a48e9e3a8 100644 --- a/.github/workflows/queue.yml +++ b/.github/workflows/queue.yml @@ -3,7 +3,8 @@ name: Queue # GitHub's merge queue tests each picked PR on top of main, one at a time, on # the host's self-hosted runner, and merges exactly the tree it tested. When the # queue drops a PR, moq-dev/quest's queue watcher on the host runs the land -# fixer and re-enqueues it (quest/m0/ci/land.md). +# fixer and re-enqueues it +# (https://github.com/moq-dev/moq/blob/17a81d6c64/quest/m0/ci/land.md). # # `main`'s ruleset requires this job's `Queue` context. GitHub admits a PR to # the queue only once its required checks pass on the PR itself, so the job diff --git a/quest/m0/README.md b/quest/m0/README.md index bcb70f6c79d..858523054fd 100644 --- a/quest/m0/README.md +++ b/quest/m0/README.md @@ -31,7 +31,7 @@ edge, which embeds moq-relay; it moved there on 2026-09-28. - [Backport audio groupDuration](/quest/m0/backport-audio-group-duration.md) - `@moq/publish` 0.5.4 on `release` can pack several Opus frames per group, making Cloudflare's relay drop audio less often - [Backport the SETUP-path and iroh-key fixes](/quest/m0/backport-security-fixes.md) - `release` refuses a conflicting SETUP Path and keeps persisted iroh keys private, in one patch release - [Backport the joined-head FETCH race fix](/quest/m0/backport-fill-head-race.md) - a `release` relay stops FETCHing a group head its own SUBSCRIBE is bringing, which left live readers hanging -- [CI cost and latency](/quest/m0/ci/README.md) - cloud CI runs only in a batched merge gate as one `just ci` pass per batch, expensive checks run nightly and gate `release`, caches move to R2, and runners are chosen last +- [CI cost and latency](/quest/m0/ci/README.md) - cloud CI runs only in GitHub's merge queue, one tested entry at a time, expensive checks run nightly and gate `release`, caches move to R2, and runners are chosen last - [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 fails a whole batch - [Benchmark sessions can't overlap on a host](/quest/m0/bench-host-lock.md) - a host-level lock keeps a second benchmark or profile session from measuring under the first's load - [A waiter's record limit changes no behavior](/quest/m0/kio-waiter-records.md) - two moq-net tests stop failing when kio's waiters remember 16 lists, and the limit becomes a tuning knob worth 3.9% per delivered group diff --git a/quest/m0/ci/README.md b/quest/m0/ci/README.md index 37e314b41e1..72e2fcaf392 100644 --- a/quest/m0/ci/README.md +++ b/quest/m0/ci/README.md @@ -3,7 +3,7 @@ ## Goal Pull requests are validated locally with `just ci` and get their cloud verdict -from the [merge queue](/quest/m0/ci/land.md) without waiting behind the +from the [merge queue](https://github.com/moq-dev/moq/blob/17a81d6c64/quest/m0/ci/land.md) without waiting behind the hosted runner limits, and every job spends its minutes on the work its diff selected rather than on setup, cold caches, or repeated builds. Concurrent local agents share expensive-command capacity, and retained tests earn their cost through useful @@ -71,13 +71,23 @@ Decided 2026-10-26 (maintainer), from 414 queue merges over 2026-10-23 to (about 1 minute per merge), with a median of 18 entries ahead and 12.7% of runs failing. GitHub's merge queue cannot test several PRs in one run, so a batched gate replaces it: `quest land`, shared through moq-dev/quest, lands -a tested chain of squash commits ([land](/quest/m0/ci/land.md)). Decided +a tested chain of squash commits ([land](https://github.com/moq-dev/moq/blob/17a81d6c64/quest/m0/ci/land.md)). Decided 2026-10-30 (maintainer): it runs as a daemon on the maintainer's host, not as a workflow on the self-hosted runner. This supersedes concurrent queue entries on a second runner. Batching gains most when failures are rare, so the [flake epic](/quest/m0/test-flakes-2/README.md) moved to m0 and `MIGRATE.md` Unreleased sections, a top source of conflicts, stop being -written per PR. +written per PR. The batched gate was superseded 2026-11-01, below. + +Decided 2026-11-01 (maintainer), reversing 2026-10-26: moq serializes +through GitHub's merge queue again, one entry at a time on the self-hosted +runner, and moq-dev/quest's queue watcher resolves dropped PRs' conflicts and +re-enqueues them. Batching and pre-checks are dropped, and the host gate is +frozen. The landing quest closed 2026-11-04 with busy hours merging a median +11.0 PRs against the queue baseline's 6.0 (its +[last version](https://github.com/moq-dev/moq/blob/17a81d6c64/quest/m0/ci/land.md) +holds the cutover record); a second concurrent entry is a +[measured trial](/quest/m0/ci/queue-concurrency.md). Decided 2026-10-23 (maintainer), to speed up the serial queue: structural changes first (concurrent entries, parallel modules, one test build), then a @@ -152,7 +162,6 @@ The historical samples locate candidates; they are not controlled benchmarks. ## Required - [Read-only pull-request CI](/quest/m0/ci/read-only-secrets.md) - write secrets and publisher identities reach only protected branches and tags, never a pushed branch -- [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` - [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 @@ -165,3 +174,5 @@ The historical samples locate candidates; they are not controlled benchmarks. - [The workspace-hack refuses trybuild edges and spares non-media builds](/quest/m0/ci/hakari-followups.md) - `hakari.py` refuses trybuild dev-dependency edges, and non-media Linux test builds stop needing libpipewire and libclang - [A release merge opens no stale release PR](/quest/m0/ci/release-pr-after-release.md) - `just rs release` publishes before it proposes, so a merged release isn't re-proposed - [Renovate keeps the workspace-hack generated](/quest/m0/ci/dependabot-workspace-hack.md) - a protected scheduled Renovate runs `cargo hakari generate` in cargo update PRs, replacing Dependabot's cargo updates +- [Build two queue entries at once if it helps](/quest/m0/ci/queue-concurrency.md) - a measured trial of `maximumEntriesToBuild: 2` against the serial lane's burst latency +- [CI never downloads libav's sources](/quest/m0/ci/libav-sources.md) - `moq-libav` substitutes from `nix.moq.dev`, so an upstream mirror can't fail Check diff --git a/quest/m0/ci/five-minutes.md b/quest/m0/ci/five-minutes.md index 876139dccb4..abefcb69674 100644 --- a/quest/m0/ci/five-minutes.md +++ b/quest/m0/ci/five-minutes.md @@ -154,4 +154,3 @@ What remains: ## Related - [Unify dependency features](/quest/m0/ci/hakari.md) - cache hits across feature shapes -- [Land main through GitHub's merge queue](/quest/m0/ci/land.md) - the queue gate that keeps checks moved out of the local gate diff --git a/quest/m0/ci/land.md b/quest/m0/ci/land.md deleted file mode 100644 index 1f4897d06c9..00000000000 --- a/quest/m0/ci/land.md +++ /dev/null @@ -1,165 +0,0 @@ -# [M] Land main through GitHub's merge queue with an async fixer - -## Goal - -`main` changes only through GitHub's merge queue, one PR at a time. Each -`merge_group` build runs `just ci` on the host's self-hosted runner (label -`moq-queue`), and the queue merges exactly the tree it tested. When the -queue drops a PR for a failure or a conflict, moq-dev/quest's queue watcher -on the host runs the Codex land fixer in the background and re-enqueues the -PR. Only a decision the fixer can't make reaches a person. The host -`quest land` gate stops landing moq. Merged PRs per hour on a busy day match -or beat both baselines below. - -## Plan - -Decided 2026-11-01 (maintainer, /quest-plan), reversing the 2026-10-26 -choice of a batched gate: - -- ✅ Serialize through GitHub's merge queue again. The 2026-10-26 reason to - leave it, conflicts GitHub cannot resolve (71% of 246 removals touched - `quest/`), is now absorbed by the async fixer, which resolves them with the - quest merge driver and re-enqueues. Batching and pre-checks are dropped: - on moq a useful pre-check must compile, which is most of a check. -- ✅ moq moves first; moq-dev/quest, moq.pro, rust2 and rind stay on the - host gate until moq proves this. -- ✅ `merge_group` builds run on the self-hosted runner on nixos (warm caches, - no GitHub minutes), with build concurrency 1. Try 2 only with measured data. -- ✅ Host-gate work is frozen apart from what this switch needs. -- The watcher and fixer are implemented in moq-dev/quest. Historical - cutover evidence and the remaining verification are below. -- Superseded designs are in git history: the 2026-10-26 three-phase - `land.yml` and the 2026-10-30 host daemon (`quest land serve`). - -Baselines: - -- GitHub's merge queue, measured 2026-10-26 over 2026-10-23 to 10-26 (414 - queue merges, 76.7 h): - - - Throughput: 5.5 merged PRs per hour overall, and a median of 6.0 in the - hours the queue never emptied. One PR at a time caps it at about 11. - - Latency: from the final enqueue to merged, a median of 87 minutes and a - p90 of 162. Waiting behind other entries is 98% of that. GitHub adds about - 1 minute per merge, and a job is a median of 4.7 minutes (p90 15.1). - - Depth: a new entry found a median of 18 entries ahead of it. - - Failures: 60 of about 470 runs failed (12.7%): - - 25 semantic conflicts with PRs that landed ahead. A PR's base was a - median of 22 commits behind the queue's. - - 10 flaky tests, since fixed or tracked in the - [flake epic](/quest/m0/test-flakes-2/README.md). - - 8 lint failures and 9 failures from the PR's own tests or compile - errors. A local `just ci` would have caught about 14 of these 17. - - 8 infra failures, from mbx cache eviction before - [moq-dev/moq#6709](https://github.com/moq-dev/moq/pull/6709). - - Conflicts: 246 merge-conflict removals. 71% touched `quest/` and 41 - touched a `MIGRATE.md` Unreleased section. - - A simulation of one-runner batching with bisection gave 1.25 merged PRs per - CI run at a 12.7% failure rate (best batch near 4), against 0.88 serial. At - 5% it gave about 2.4. The failure rate is the lever, which is why the flake - epic moved to m0 and migration notes stay in PR Impact sections until the - [release migration audit](/quest/m2/release/migrate-audit.md). - -- The host gate, measured 2026-11-01: about 4-6 merged PRs per hour at a 23% - per-PR failure rate, with batches shrinking to one PR and 10-17 minute - checks ([moq-dev/quest#376](https://github.com/moq-dev/quest/pull/376)). - -Cutover recheck, 2026-11-03 (read-only): - -- **Ruleset verified.** REST `GET /repos/moq-dev/moq/rulesets/2420853` - reports active enforcement, only `Queue` required (GitHub Actions - integration 15368), and a `SQUASH` merge queue with - `max_entries_to_build=1` and `max_entries_to_merge=1`. Only the - administrator role bypass remains; `quest land` is no longer required. - [Live ruleset](https://github.com/moq-dev/moq/rules/2420853). -- **Runner and watcher evidence.** The repository runner metadata reports - `nixos-moq-ci` online with `self-hosted` and `moq-queue` labels. The - [first successful Queue job](https://github.com/moq-dev/moq/actions/runs/41404569287) - ran there on 2026-11-02, 07:10-07:19 UTC. The host source at - [kixelated/nixos@a788bea](https://github.com/kixelated/nixos/blob/a788bea07f456d55cd3bbd8bfd60145fdac5256d/hosts/nixos/default.nix#L35) - enables moq's watcher; its module selects `watch` instead of `serve`, - retaining the user, state and fixer. Historical activity confirms more - than configuration intent: the watcher - [published a fixed head and armed auto-merge](https://github.com/moq-dev/moq/pull/7222#issuecomment-6590060984), - and [resolved a conflict and armed auto-merge](https://github.com/moq-dev/moq/pull/7501#issuecomment-6597514578) - at 2026-11-03 07:01 UTC; the latter PR merged at 07:57:56 UTC. -- **Fixer permissions.** A - [historical workflow re-enqueue refusal](https://github.com/moq-dev/moq/pull/7431#issuecomment-6594966849) - at 2026-11-03 03:49 UTC must not be mistaken for a current installation - permission check. Organization installation metadata now lists moq-bot's - `workflows`, `contents` and `merge_queues` permissions as `write`. The - deployed watcher mints installation tokens from that App (1039466), so - workflow-touching fixes and re-enqueues have the scope they need. -- **Organization secrets verified absent.** Paginated - `GET /orgs/moq-dev/actions/secrets?per_page=100` returned one page, - `total_count=1`, and one name, neither `APP_CLIENT_ID` nor - `APP_PRIVATE_KEY`; page 1 had no next link and an explicit page 2 was - empty with the same total. The organization-copy removal condition is - satisfied at this observation; no secret values were read. Repository - copies are also absent (18 repository names, no next page); `bot` and - `publish` each list both names. Other CI credentials remain tracked by - [read-only CI](/quest/m0/ci/read-only-secrets.md). -- **Open PRs.** `queue.yml` now also offers a dispatch that reports the - skipped `Queue` context on an old PR head. A pre-workflow PR can still - need that report; see its workflow comments. No PR was enqueued and no - workflow dispatched for this recheck. - -Host check, 2026-11-03 about 23:14 UTC (read-only SSH to `nixos`, no secret -values read): - -- ✅ Recorded as verified (maintainer, 2026-11-03): the deployed watcher - matches the configuration above, and no moq `serve` gate remains. -- `quest-land-moq.service` ("moq-dev/moq merge queue watcher") is active. - Its main process started 2026-11-02 06:48:41 PST, and - `NeedDaemonReload=no`, so it runs the deployed unit file. The system - generation is `nixos-system-nixos-26.11.20261014.55bfb4d`, switched - 2026-11-03 09:54 PST. -- It runs `quest land watch --app-id 1039466 --fixer ` - from quest 0.1.0 under bun, as user `quest-land-moq`, with the App key - passed by `LoadCredential=github-app-key:...`. -- Retained state is in `/var/lib/quest-land-moq` (mode 0700): `checkout/` - and the live `moq-dev-moq/`. -- `quest-land-fixer.socket` is listening, and an ephemeral - `quest-land-fixer@` container was running during the check. -- The only remaining host gate unit is `quest-land-moq-pro.service`, for - moq.pro. moq-dev/moq has only the watcher. Watchers for quest, rind and - rust2 are also active. -- Housekeeping, not a separate quest: the state directory still holds - `codex-repro-*` and `fixer-verified-*` directories left from 2026-10-30, - which can be deleted. - -Completed busy-day measurement: **2026-11-02 08:00 UTC to 2026-11-03 08:00 -UTC**, a full 24-hour window following the first successful merge-group build. - -| Measure | Completed day | Earlier baseline | -| --- | --- | --- | -| Merged PRs / hour | 139 / 24 = **5.79** | Queue: 5.5 overall; host: about 4-6 | -| Final enqueue to merge, median | **46.6 min** | Queue: 87 min | -| Final enqueue to merge, p90 | **84.2 min** | Queue: 162 min | - -Method: paginate REST search for `repo:moq-dev/moq is:pr is:merged base:main -merged:2026-11-02..2026-11-03` (188 results at this recheck, no incomplete -results), then -paginate every result's `GET /repos/moq-dev/moq/issues/{number}/timeline`. -Select merges in the half-open 24-hour window above, and subtract each -PR's last `added_to_merge_queue` before its `merged` event. All 139 have an -enqueue event; use the median and nearest-rank p90. Examples at the window's -ends are [moq-dev/moq#7457](https://github.com/moq-dev/moq/pull/7457) and -[moq-dev/moq#7501](https://github.com/moq-dev/moq/pull/7501). - -Final-enqueue latency excludes earlier failed attempts, fixer time before -re-enqueue, and PRs that never merged, as in the queue baseline. No host -latency baseline was recorded. - -Performance acceptance (maintainer, 2026-11-03): - -- ✅ Keep performance verification open; 5.79 PRs/hour for this day does - not by itself meet the goal. -- Accept this day as meeting the approximate host range of 4-6 PRs/hour. - -Remaining work: reconstruct complete queue occupancy, including removed and -unmerged PRs, and compare the median merges in never-empty hours with the -queue baseline's 6.0. A 24-hour rate is not that statistic. Keep -concurrency 1 while gathering this evidence. - -Public API: none. Wire: none. diff --git a/quest/m0/ci/libav-sources.md b/quest/m0/ci/libav-sources.md new file mode 100644 index 00000000000..961fd9536a1 --- /dev/null +++ b/quest/m0/ci/libav-sources.md @@ -0,0 +1,26 @@ +# [XS] CI never downloads libav's sources from upstream mirrors + +## Goal + +A `just ci` run never fetches `@moq/libav`'s source tarballs from their +upstream sites: `moq-libav` (or at least its fixed-output sources) substitutes +from `nix.moq.dev`, so a flaky upstream mirror can't fail a check. Done when a +clean checkout's Check builds `moq-libav` with no request to `ffmpeg.org`, +`downloads.xiph.org` or GitHub archives. + +## Plan + +Planned 2026-11-04 with the maintainer. Check failed twice on 2026-11-03/04 +for this alone: [moq-dev/moq#7685](https://github.com/moq-dev/moq/pull/7685) +and [moq-dev/moq#7760](https://github.com/moq-dev/moq/pull/7760) (run +41777407147: "cannot download ffmpeg-9.0.tar.xz from any mirror", then +`moq-libav` and the `moq` postinstall failed). `js/libav/package.nix` +`fetchurl`s `ffmpeg-9.0.tar.xz`, `opus-1.6.1.tar.gz` and +`emfiberthreads-1.3.tar.gz` whenever `moq-libav` isn't substituted. + +Find why `moq-libav` was built at all: whether `sh/gh/cache.sh` pushes it (and +its sources) with the dev shell's build closure, or whether its derivation +changed without being pushed. Prefer pushing the built `moq-libav` and its +source fixed-output derivations to `nix-ci-moq-dev` over mirroring tarballs +by hand. Related: [A cache error is a miss](/quest/m0/ci/nix-cache-5xx.md) +covers `nix.moq.dev` errors, not upstream ones. diff --git a/quest/m0/ci/nightly-levers.md b/quest/m0/ci/nightly-levers.md index 2807dffd275..fc5e6aca51e 100644 --- a/quest/m0/ci/nightly-levers.md +++ b/quest/m0/ci/nightly-levers.md @@ -28,7 +28,3 @@ explanation of nightly incremental rebuilds costing near-full builds, before running the queue experiment. Public API: none. Wire: none. - -## Required - -- [Land main through GitHub's merge queue](/quest/m0/ci/land.md) - the structural baseline, replacing concurrent queue entries diff --git a/quest/m0/ci/queue-concurrency.md b/quest/m0/ci/queue-concurrency.md new file mode 100644 index 00000000000..b31532832de --- /dev/null +++ b/quest/m0/ci/queue-concurrency.md @@ -0,0 +1,33 @@ +# [S] The merge queue builds two entries at once if it measurably helps + +## Goal + +A measured trial decides whether moq's merge queue builds two entries at once +(`maximumEntriesToBuild: 2`) or stays at one. Done when the PR records both +settings' burst p90 enqueue-to-merge latency and median merges per +never-empty hour over comparable windows, and the maintainer keeps the winner +in the ruleset. + +## Plan + +Planned 2026-11-04 with the maintainer. The landing quest +([last version](https://github.com/moq-dev/moq/blob/17a81d6c64/quest/m0/ci/land.md)) +ran the queue at build concurrency 1 and said to try 2 only with measured +data. Its performance goal closed on that data (decided 2026-11-04 ✅): over +2026-11-03 06:47Z to 2026-11-04 06:47Z, the eight hours the queue was never +empty merged a median of 11.0 PRs against the queue baseline's 6.0. + +Why try 2: with a median queue build of 4.4 min, one lane tops out near 13 +merges an hour, and busy hours already run close to that. Bursts of 22-26 +entries on 2026-11-03 pushed p90 enqueue-to-merge to about 58 min (median +20.6 min), and waiting behind other entries was most of it. + +Method: occupancy comes from the PRs' `AddedToMergeQueue`, +`RemovedFromMergeQueue` and `Merged` timeline events (reconstruct removed and +unmerged entries too). Compare at least one busy day at each setting, and +count queue failures per build, since building two means a failure in the +first entry rebuilds the second. The ruleset change and revert are the +maintainer's actions (ruleset 2420853); the quest names the setting and +reports the numbers. The host runner must handle two builds at once without +the shared mbx cache or `quest gate` admission erasing the gain, so record +host load during the trial. diff --git a/quest/m0/ci/read-only-secrets.md b/quest/m0/ci/read-only-secrets.md index c213d3c7143..98e85036c3f 100644 --- a/quest/m0/ci/read-only-secrets.md +++ b/quest/m0/ci/read-only-secrets.md @@ -35,7 +35,7 @@ JSR's repository OIDC trust while the token is unset. The repository's `MBX_R2_*` pair is read-only: a branch's write to `mbx-moq-dev` is refused with AccessDenied. -Verified 2026-11-03 during the [landing recheck](/quest/m0/ci/land.md): +Verified 2026-11-03 during the [landing recheck](https://github.com/moq-dev/moq/blob/17a81d6c64/quest/m0/ci/land.md): complete paginated secret metadata lists neither `APP_CLIENT_ID` nor `APP_PRIVATE_KEY` at organization or repository scope. The `bot` and `publish` Environments each list both names. The App-copy removal is done; @@ -73,7 +73,3 @@ publish, since jobs that do not name `publish` still read it: publishing. 6. Verify with the throwaway branch in the Goal, which also confirms each Environment refuses the branch. - -## Related - -- [Land main through GitHub's merge queue](/quest/m0/ci/land.md) - its gate credential also belongs in a protected environment diff --git a/quest/m0/nightly/README.md b/quest/m0/nightly/README.md index 62bbcf9e76e..06874349e9b 100644 --- a/quest/m0/nightly/README.md +++ b/quest/m0/nightly/README.md @@ -27,8 +27,9 @@ This README's own work, after the children: - Confirm a scheduled run passes. Failures already owned elsewhere stay there: the audio near-zero p95 row belongs to [audio jitter target](/quest/m1/audio-jitter-target/README.md), the - macOS `receive_credit` timeout to - [test flakes](/quest/m0/test-flakes-2/README.md), and the paired bench + macOS `receive_credit` timeout has no owner since its quest was deleted in + [moq-dev/moq#6732](https://github.com/moq-dev/moq/pull/6732), so plan one under + [test flakes](/quest/m0/test-flakes-2/README.md) if it recurs, and the paired bench threshold to [bench CI](/quest/m1/bench-ci.md). Public API: none. Wire: none. diff --git a/quest/m0/test-flakes-2/README.md b/quest/m0/test-flakes-2/README.md index fbbb362b8b2..821b86926ea 100644 --- a/quest/m0/test-flakes-2/README.md +++ b/quest/m0/test-flakes-2/README.md @@ -37,7 +37,7 @@ Added 2026-10-21 and 2026-10-22 (maintainer): failures from the m0/m1 merge runs, one child each. Decided 2026-10-26 (maintainer): the epic moved from m1 to m0, since every -flake now fails a whole batch of the [batched merge gate](/quest/m0/ci/land.md) +flake now fails a whole batch of the [batched merge gate](https://github.com/moq-dev/moq/blob/17a81d6c64/quest/m0/ci/land.md) rather than one PR. The queue's recurring flakes from 2026-10-23 to 10-26 were already fixed (the moq-rtsp stall tests, the moq-gst pinned-instance and sibling-restart tests, the moq-mux missing-sequence test, diff --git a/quest/m1/README.md b/quest/m1/README.md index e283b59ca41..1920b675146 100644 --- a/quest/m1/README.md +++ b/quest/m1/README.md @@ -190,6 +190,7 @@ their end report, so an embedder's drain alert pages on real cuts. - [A hardware decoder's capability refusal is an unsupported config](/quest/m1/hw-decoder-refusal.md) - a GPU that can't decode a stream reports `UnsupportedConfig`, so callers fall back to another rendition - [A JS audio capture gap keeps the audio before it](/quest/m1/js-audio-gap-flush.md) - every capture gap flushes the `AudioEncoder` before restarting it, like a disable - [A draft-18 resume of a cached group under a finite max-age settles](/quest/m1/ietf18-resume-cached-start.md) - the read delivers the group or refuses at once, never hangs +- [Bot reviewers don't re-review every push](/quest/m1/review-bot-waves.md) - CodeRabbit and Pullfrog review on ready and on request, so fixes stop drawing new thread waves ## Related diff --git a/quest/m1/review-bot-waves.md b/quest/m1/review-bot-waves.md new file mode 100644 index 00000000000..bf2e9c75d0c --- /dev/null +++ b/quest/m1/review-bot-waves.md @@ -0,0 +1,32 @@ +# [S] Bot reviewers don't re-review every push + +## Goal + +CodeRabbit and Pullfrog review a PR when it's marked ready (and on request), +not on every push, so fixing review findings stops drawing a fresh wave of +threads that holds the PR out of the merge queue. Done when a PR iterated +through three or more pushes after ready gets a bot review when marked ready, +no new bot threads on the later pushes, and a new bot review when one is +requested, and the PR records the configuration and that PR as evidence. + +## Plan + +Planned 2026-11-04 with the maintainer. On 2026-11-03/04 each push to a ready +PR drew new bot threads, and agents only queue a PR with zero open threads, so +iterations looped: [moq-dev/moq#7652](https://github.com/moq-dev/moq/pull/7652) +collected 24 threads over six pushes, and +[moq-dev/moq#7752](https://github.com/moq-dev/moq/pull/7752) and +[moq-dev/moq#7729](https://github.com/moq-dev/moq/pull/7729) each lost a queue +slot to a thread that landed seconds after a push. Several were real bugs, so +the bots stay; the cadence changes. + +- **CodeRabbit:** the repo has no `.coderabbit.yaml`, so it runs the app + defaults (incremental reviews on every push). Add one that turns off + automatic incremental reviews and skips drafts, keeping the full review on + ready and `@coderabbitai review` on request. +- **Pullfrog:** its reviews are triggered by the app, not + `.github/workflows/pullfrog.yml` (dispatch-only). Find whether its trigger is + repo-configurable; if it's only in the Pullfrog console, the PR names the + exact setting for the maintainer to change. +- Keep the queue rule "no open threads" as is. Record in `AGENTS.md`, if + anywhere, how an agent requests a re-review after its last push. diff --git a/quest/m1/socket/README.md b/quest/m1/socket/README.md index 64d5b994365..b6bdb4f0136 100644 --- a/quest/m1/socket/README.md +++ b/quest/m1/socket/README.md @@ -160,11 +160,10 @@ standing where the 2026-11-04 decisions above don't replace it: Decided 2026-11-02 (maintainer, Kixel planning): the whole epic moves from m2 to m1, so the next cut publishes sockets in `@moq/net` and moq.pro's -relays carry them. Why: Kixel's T3 Code prototype -([moq-dev/kixel.ai T3 epic](https://github.com/moq-dev/kixel.ai/blob/main/quest/m0/t3/README.md)) -sends T3's commands over sockets, one group per message, in place of byte -streams. `@moq/net` publishes from `release`. Byte streams, fastest-reader -pacing, and the mesh libraries keep their own milestones. +relays carry them. Why: Kixel's T3 Code prototype (its T3 epic, in the +private kixel.ai repo) sends T3's commands over sockets, one group per message, +in place of byte streams. `@moq/net` publishes from `release`. Byte streams, +fastest-reader pacing, and the mesh libraries keep their own milestones. Decided 2026-11-01 with the maintainer (planning interview from moq.pro's TCP replacement arc), still standing: