diff --git a/quest/m0/README.md b/quest/m0/README.md index 9322d412..a829f363 100644 --- a/quest/m0/README.md +++ b/quest/m0/README.md @@ -45,6 +45,9 @@ ownership-manifest design: - [Accurate head_moved](/quest/m0/land-head-moved.md) - the gate's own base-merge push and batch-mate failures are not reported as a moved head - [Queue-time checks](/quest/m0/land-queue-checks.md) - queued PRs are checked against each other and `quest check` runs per PR before batching - [Drop emptied Required headings](/quest/m0/required-heading.md) - a clean driver merge that empties a `Required` list passes `quest check` +- [GitHub retries](/quest/m0/github-retry.md) - one 5xx or dropped connection no longer fails a command or land step +- [Current conflict reports](/quest/m0/land-conflicts-refresh.md) - a queued PR's conflict report updates when the queue ahead of it changes +- [Land checks at gate priority](/quest/m0/land-priority-sandbox.md) - `quest land serve` passes `QUEST_GATE_PRIORITY` to its sandbox - [Codex cloud off](/quest/m0/codex-cloud-off.md) - automatic Codex cloud reviews stop once no open PR relies on them - [Review handles expired and environment logins](/quest/m0/review-login.md) - `quest review` says to log in again instead of failing with a 401, and reviews with credentials from the environment - [Live sandbox test](/quest/m0/review-sandbox.md) - the real reviewer CLIs run nothing a reviewed head plants diff --git a/quest/m0/github-retry.md b/quest/m0/github-retry.md new file mode 100644 index 00000000..d7fe5f04 --- /dev/null +++ b/quest/m0/github-retry.md @@ -0,0 +1,21 @@ +# [S] GitHub requests retry transient failures + +## Goal + +One 5xx response or dropped connection no longer fails a quest command or a +land step. `GitHub.request` (`src/cli/github.ts`) retries 5xx, 429 and +network errors with bounded backoff, then fails with the last error. + +## Plan + +Decided 2026-10-31 (user, /quest-plan of the follow-ups from moq.pro's and rust2's cutover to the host gate and the fixer repairs [moq-dev/quest#320](https://github.com/moq-dev/quest/pull/320), [#325](https://github.com/moq-dev/quest/pull/325), [#327](https://github.com/moq-dev/quest/pull/327) and [#328](https://github.com/moq-dev/quest/pull/328)). + +- A 502 while the fixer handed back + [moq-dev/moq#7323](https://github.com/moq-dev/moq/pull/7323) replaced the + crash reason; [moq-dev/quest#320](https://github.com/moq-dev/quest/pull/320) + kept the original error but left the retry for this quest. +- Retry only idempotent reads and writes whose repeat is safe (GET, PUT, + DELETE, label and auto-merge mutations that check state first). A POST that + creates a comment or a merge must not run twice; check the effect before + repeating it. +- Honour `Retry-After` and the secondary rate limit. diff --git a/quest/m0/host-land/README.md b/quest/m0/host-land/README.md index a89f20d3..8ac54fa3 100644 --- a/quest/m0/host-land/README.md +++ b/quest/m0/host-land/README.md @@ -96,3 +96,4 @@ can hand off instead. - [Gate host](/quest/m0/host-land/host.md) - kixelated/nixos runs the daemon as its own user, checks in nspawn containers, and retires the Actions runner - [Fixer proxy access](/quest/m0/host-land/fixer.md) - connect the nixos fixer container to CLIProxyAPI with the gate client key and maintainer login - [Batch triage](/quest/m0/host-land/triage.md) - the fixer blames the failing PR before ejection, and a red base halts the queue +- [Daemon restart keeps its check](/quest/m0/host-land/reattach.md) - a deploy no longer reruns the batch it interrupted diff --git a/quest/m0/host-land/host.md b/quest/m0/host-land/host.md index ae8c6ccb..7f355a18 100644 --- a/quest/m0/host-land/host.md +++ b/quest/m0/host-land/host.md @@ -81,6 +81,16 @@ Deployed 2026-10-30 from - The `quest-land` Actions runner is retired, and the host pins quest at `49cd094`, whose checks get a standalone shallow clone. +Deployed 2026-10-31 for moq.pro and rust2 +([kixelated/nixos#16](https://github.com/kixelated/nixos/pull/16)): +`moq-pro` and `rust2` instances, remote-only daemon checkouts so private +repositories need no clone credential, check images that resolve +`*.localhost` through nsncd and ship the CI runners' `dejavu-fonts-minimal`, +check output written to a file instead of a shared non-blocking pipe, +`restartIfChanged = false` on check and fixer instances, submodules +initialized before the fixer's dev shell, and `KillMode=process` on the +daemons so a restart keeps detached fixers. + What remains: - Merge #16 once @@ -92,15 +102,12 @@ What remains: already rejects. - moq-bot's `organization_self_hosted_runners` write permission served only the retired runner; the maintainer may drop it. -- Keep fixers running across a deploy: set `KillMode=process` on each - `quest-land-.service` in `modules/quest-land.nix`. The default - `control-group` sends SIGTERM to the daemon's detached fixer supervisor - too, so a fixer running during a deploy ends with exit 143. On 2026-10-31 - that happened to moq's 23:22 batch - ([moq-dev/moq#7426](https://github.com/moq-dev/moq/pull/7426), - [moq-dev/moq#7084](https://github.com/moq-dev/moq/pull/7084)). The - daemon's in-flight check clients still exit on their next write to the - dead daemon's pipe. Check it by restarting the unit while a fixer runs: - the job should collect a result, not a handback naming SIGTERM. Keep - `ProcSubset=pid` off the unit: generation 45 had it, which hid - `/proc/sys/kernel/random/boot_id` from the daemon. +- The VM test's switch steps fail on about a third of runs with "Job for + quest-land-fixer.socket canceled" when several `*-socket-refresh` + services restart at once (user, 2026-10-31). Find the race and fix it, + without retrying the test. +- Once [moq-dev/quest#324](https://github.com/moq-dev/quest/pull/324) lands + (user, 2026-10-31): export `QUEST_GATE_PRIORITY=1` in the generated + `quest-land-check-command`, then bump the pinned quest, so a land check's + nested `quest gate` waits for memory but not load. Don't use + `QUEST_GATE_ADMITTED`, which also skips the memory check. diff --git a/quest/m0/host-land/reattach.md b/quest/m0/host-land/reattach.md new file mode 100644 index 00000000..154e439f --- /dev/null +++ b/quest/m0/host-land/reattach.md @@ -0,0 +1,28 @@ +# [M] A restarted land daemon keeps its in-flight check + +## Goal + +Restarting `quest land serve`, as every host deploy does, never discards a +running batch check. The new daemon picks up the check the old one started +and lands, ejects, or hands back from its result, so a deploy costs no +rerun of a 30-40 minute batch. + +## Plan + +Decided 2026-10-31 (user, /quest-plan of the follow-ups from moq.pro's and rust2's cutover to the host gate and the fixer repairs [moq-dev/quest#320](https://github.com/moq-dev/quest/pull/320), [#325](https://github.com/moq-dev/quest/pull/325), [#327](https://github.com/moq-dev/quest/pull/327) and [#328](https://github.com/moq-dev/quest/pull/328)). + +- On 2026-10-31 each of six deploys killed moq's and moq.pro's in-flight + checks: the check client is the daemon's child, and with + `KillMode=process` it still exits on its next write to the dead daemon's + pipe. No PR was ejected, but each batch reran from scratch. +- Fixers already survive this way: a detached supervisor records the job and + the next daemon collects it (`src/cli/land-fixer.ts`). Give a batch check + the same shape: a detached client that writes its log and exit status to + the state directory, and a daemon that resumes a recorded batch on start + instead of building a new one. +- The host side (the check launcher, `KillMode=process`) is the + [gate host](/quest/m0/host-land/host.md)'s. + +## Related + +- [Gate host](/quest/m0/host-land/host.md) - the units this runs under diff --git a/quest/m0/host-land/triage.md b/quest/m0/host-land/triage.md index af469dcf..e890fc92 100644 --- a/quest/m0/host-land/triage.md +++ b/quest/m0/host-land/triage.md @@ -48,6 +48,15 @@ wasting CI on bisection?" field beside `requeue`, `fixed`, and `handback` in `src/cli/land-fix.ts`. - Keep the fixer's untrusted-input rules: a PR's content cannot make the fixer blame another PR or skip the base check. +- A collateral ejection never counts as the PR's one fix attempt + (user, 2026-10-31). Today `handbackRepeated` (`src/cli/land-fixer.ts`) + hands back any PR whose pick or fixer requeue is unchanged, so a PR that + shared two broken batches in a row was handed back unexamined: + [moq-dev/moq#7257](https://github.com/moq-dev/moq/pull/7257), + [#7306](https://github.com/moq-dev/moq/pull/7306), + [#7284](https://github.com/moq-dev/moq/pull/7284) and + [#7312](https://github.com/moq-dev/moq/pull/7312). Only the blamed PR's + attempt is spent. ## Related diff --git a/quest/m0/kix/README.md b/quest/m0/kix/README.md index 504f6a8c..d826c845 100644 --- a/quest/m0/kix/README.md +++ b/quest/m0/kix/README.md @@ -136,3 +136,4 @@ fixes what it finds: - [Web execution](/quest/m0/kix/execution.md) - spawn and iterate through the UI, ending in contribution PRs - [Land review](/quest/m0/kix/land-review.md) - kix lands only heads with a review that counts on that exact head - [Onboarding guide](/quest/m0/kix/guide.md) - a complete maintainer path, from runner setup through a reviewed PR +- [Fast runner continuation test](/quest/m0/kix/runner-timeout.md) - the conflicted-continuation test passes on a loaded host without a longer timeout diff --git a/quest/m0/kix/runner-timeout.md b/quest/m0/kix/runner-timeout.md new file mode 100644 index 00000000..84913b0b --- /dev/null +++ b/quest/m0/kix/runner-timeout.md @@ -0,0 +1,17 @@ +# [XS] The kix runner's conflicted-continuation test is fast under load + +## Goal + +`test/runner.test.ts` "pauses a large conflicted continuation with a bounded +question and intact checkout" passes on a loaded host well inside vitest's +5-second limit, without raising the limit. + +## Plan + +Decided 2026-10-31 (user, /quest-plan of the follow-ups from moq.pro's and rust2's cutover to the host gate and the fixer repairs [moq-dev/quest#320](https://github.com/moq-dev/quest/pull/320), [#325](https://github.com/moq-dev/quest/pull/325), [#327](https://github.com/moq-dev/quest/pull/327) and [#328](https://github.com/moq-dev/quest/pull/328)). + +- It hit the 5-second timeout in quest's own land gate on 2026-10-31 and + ejected [moq-dev/quest#320](https://github.com/moq-dev/quest/pull/320), + which does not touch the runner. +- Find which step is slow (a large fixture write, git calls, or a wait) and + remove the cost; never retry the test or tune the timeout until it passes. diff --git a/quest/m0/land-conflicts-refresh.md b/quest/m0/land-conflicts-refresh.md new file mode 100644 index 00000000..2dd7447a --- /dev/null +++ b/quest/m0/land-conflicts-refresh.md @@ -0,0 +1,18 @@ +# [S] quest land reports queue conflicts again when the queue changes + +## Goal + +A queued PR's conflict report stays current: when a PR ahead of it lands, +is requeued, or changes head, `quest land` checks it against the queue again +and updates its single report, saying when a conflict has cleared. + +## Plan + +Decided 2026-10-31 (user, /quest-plan of the follow-ups from moq.pro's and rust2's cutover to the host gate and the fixer repairs [moq-dev/quest#320](https://github.com/moq-dev/quest/pull/320), [#325](https://github.com/moq-dev/quest/pull/325), [#327](https://github.com/moq-dev/quest/pull/327) and [#328](https://github.com/moq-dev/quest/pull/328)). + +- Starts once [moq-dev/quest#322](https://github.com/moq-dev/quest/pull/322) + lands. It reports a newly queued PR's conflicts with the PRs ahead of it, + once per queueing, so a PR behind a requeued or changed one is never + checked again. +- Edit the earlier report rather than adding comments, so a busy queue does + not flood a PR. diff --git a/quest/m0/land-priority-sandbox.md b/quest/m0/land-priority-sandbox.md new file mode 100644 index 00000000..a1b2d6e5 --- /dev/null +++ b/quest/m0/land-priority-sandbox.md @@ -0,0 +1,16 @@ +# [XS] Land checks run at gate priority + +## Goal + +`quest land serve` runs each batch check with `QUEST_GATE_PRIORITY=1`, so a +repository's nested `quest gate` calls admit the land check ahead of agent +load. + +## Plan + +Decided 2026-10-31 (user, /quest-plan of the follow-ups from moq.pro's and rust2's cutover to the host gate and the fixer repairs [moq-dev/quest#320](https://github.com/moq-dev/quest/pull/320), [#325](https://github.com/moq-dev/quest/pull/325), [#327](https://github.com/moq-dev/quest/pull/327) and [#328](https://github.com/moq-dev/quest/pull/328)). + +- Starts once [moq-dev/quest#324](https://github.com/moq-dev/quest/pull/324) + lands; it adds the variable. Pass it to the `--sandbox` command from + `src/cli/land-serve.ts`. The host also exports it in its check command, + which the [gate host](/quest/m0/host-land/host.md) owns. diff --git a/quest/m1/README.md b/quest/m1/README.md index 238d1cd7..757c9016 100644 --- a/quest/m1/README.md +++ b/quest/m1/README.md @@ -19,3 +19,4 @@ additional login providers. This milestone does not gate the first release. - [Worker dev setup](/quest/m1/worker-dev.md) - per-server cookies, seeded raw output, static assets, one fake GitHub, each test run alone - [Gate ownership everywhere](/quest/m1/gate-ownership.md) - delegated sub-cgroups for nested gates and Windows Job Objects - [Fewer git processes on Windows](/quest/m1/windows-git.md) - batched git lookups in the CLI and reused fixture repositories in tests +- [Delete the legacy hold labels](/quest/m1/legacy-labels.md) - condition: every gated repository pins quest past #326; then only `quest:active` and `quest:kix` are holds diff --git a/quest/m1/legacy-labels.md b/quest/m1/legacy-labels.md new file mode 100644 index 00000000..9ee87aef --- /dev/null +++ b/quest/m1/legacy-labels.md @@ -0,0 +1,18 @@ +# [XS] Delete the legacy hold labels + +## Goal + +Condition: quest, moq, moq.pro, rind and rust2 all pin a quest release that +includes [moq-dev/quest#326](https://github.com/moq-dev/quest/pull/326). +Then `LEGACY_IGNORED` in `src/core/hold.ts` and its notes in the README and +`quest iterate --help` are gone, and only `quest:active` and `quest:kix` +count as holds. + +## Plan + +Decided 2026-10-31 (user, /quest-plan of the follow-ups from moq.pro's and rust2's cutover to the host gate and the fixer repairs [moq-dev/quest#320](https://github.com/moq-dev/quest/pull/320), [#325](https://github.com/moq-dev/quest/pull/325), [#327](https://github.com/moq-dev/quest/pull/327) and [#328](https://github.com/moq-dev/quest/pull/328)). + +- Check the condition with each repository's quest pin (`flake.nix` or + `mise.toml`). +- Decide then whether any other `quest:*` label should still count as a + hold; recommend only the two.