Repository navigation
docs(quest): plan follow-ups from the 2026-10-22 merge wave #195
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
Merged
Merged
Changes from all commits
Commits
Show all changes
3 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,25 @@ | ||
| # [XS] Measure gate headroom on an idle host | ||
|
|
||
| ## Goal | ||
|
|
||
| The gate's idle-host behaviour is measured: `scripts/gate-bench.sh gated 8` | ||
| and `ungated 8` run on an otherwise idle host, and the results are recorded | ||
| in a PR. A gated burst that starts together, close to the ungated makespan, | ||
| confirms headroom admission; anything else becomes a follow-up. | ||
|
|
||
| ## Plan | ||
|
|
||
| Decided 2026-10-22 (user) as a follow-up of | ||
| [kixelated/quest#189](https://github.com/kixelated/quest/pull/189), whose | ||
| benchmarks ran while other agents kept the host's load at 19-42 on 24 CPUs, | ||
| so they measured the busy-host path, not the idle burst the quest was for. | ||
| The earlier baseline, from | ||
| [kixelated/quest#177](https://github.com/kixelated/quest/pull/177), was 104 s | ||
| gated against 19 s ungated for a burst of 8. | ||
|
|
||
| - Run on a host with no other agents or builds; record the 1-minute load | ||
| before each run alongside the results. | ||
| - Delete this quest in the PR that records the results. | ||
| - Dropped (user): asking Bun upstream to make `os.userInfo().homedir` ignore | ||
| `$HOME` (the child-process lookup costs about 10 ms), and handling a macOS | ||
| hostname that changes with the network, until it is seen in practice. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,39 @@ | ||
| # [XS] Land squash merges, and review the final head | ||
|
|
||
| ## Goal | ||
|
|
||
| Pull requests in this repository land as squash merges, and no pull request | ||
| merges with changes no review covered, other than conflict-free merges from | ||
| its base or a reviewer's own suggested patch applied unchanged. | ||
|
|
||
| ## Plan | ||
|
|
||
| Decided 2026-10-22 (user) from a merge wave in which | ||
| [kixelated/quest#189](https://github.com/kixelated/quest/pull/189) landed as | ||
| a merge commit, and [#183](https://github.com/kixelated/quest/pull/183), | ||
| [#185](https://github.com/kixelated/quest/pull/185), | ||
| [#188](https://github.com/kixelated/quest/pull/188), | ||
| [#189](https://github.com/kixelated/quest/pull/189), and | ||
| [#190](https://github.com/kixelated/quest/pull/190) merged with fixes pushed | ||
| after their last review, up to about 150 lines and including #188's security | ||
| rework. The user asked for these root-instruction, guide, and setting changes | ||
| through this plan. | ||
|
|
||
| - **Squash (user).** Add a line to this repository's root `AGENTS.md` saying | ||
| pull requests land as squash merges; the merge skill picks | ||
| `quest merge --land --squash` from it. Also set the repository to allow | ||
| only squash merges (`allow_merge_commit` and `allow_rebase_merge` false, | ||
| through `gh api`), approved by the user on 2026-10-22, so a wrong method | ||
| fails instead of landing. Rejected: either one alone. | ||
| - **Re-review (user).** Tighten the guide's Reviews section in | ||
| `assets/AGENTS.md`: "trivial changes since the last review" means only | ||
| conflict-free merges from the base or a reviewer's suggested patch applied | ||
| unchanged. A base merge that needed a hand-resolved conflict is reviewed | ||
| like any other change (narrowed by the user from Codex's review of | ||
| [#195](https://github.com/kixelated/quest/pull/195)). Any other change | ||
| waits for a review of the head; if none arrives within the merge skill's | ||
| wait bound, the agent asks the user instead of merging. Rejected: | ||
| re-review on every head, exempting every base merge, and leaving | ||
| "trivial" to the agent. | ||
| - Ranked first in the epic: prose and one setting, and it stops unreviewed | ||
| merges now. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,20 @@ | ||
| # [XS] Show PR holds in quest status | ||
|
|
||
| ## Goal | ||
|
|
||
| `quest status <pr>` shows whether a `quest:*` hold is on the PR: its label, | ||
| how long ago it was taken, and the hold's timeline event, so `/quest-complete` | ||
| can skip PRs another session holds without a separate label read. | ||
|
|
||
| ## Plan | ||
|
|
||
| Decided 2026-10-22 (user) as a follow-up of | ||
| [kixelated/quest#185](https://github.com/kixelated/quest/pull/185), which | ||
| added the holds: | ||
|
|
||
| - Read the hold the same way the state commands do, through the shared | ||
| GitHub client, and report a draft its starter still holds the same way. | ||
| - Update the `complete` skill to read holds from `quest status`, and the | ||
| README's status example. | ||
| - Ranked after the [complete loop](/quest/m0/helpers/complete-loop.md), which | ||
| also edits `complete`. | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| # [S] Run publication end to end against the seeded fake GitHub | ||
|
|
||
| ## Goal | ||
|
|
||
| The seeded local server's fake GitHub (`cloudflare/dev/github.ts`) models | ||
| commits, fast-forward ref updates, and pull request creation, so the local | ||
| server can run a job's publication end to end, and publication tests use the | ||
| same fake instead of their own. | ||
|
|
||
| ## Plan | ||
|
|
||
| Decided 2026-10-22 (user) as a follow-up of | ||
| [kixelated/quest#190](https://github.com/kixelated/quest/pull/190): | ||
|
|
||
| - `cloudflare/test/publish.test.ts` keeps its own stateful GitHub fake, while | ||
| `dev/github.ts` models only what the inbox flows need. Merge the two into | ||
| `dev/github.ts` and delete the test-local copy. | ||
| - The epic's end-to-end test starts from the seeded fake before the live | ||
| rehearsal, so this ranks before the onboarding guide. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,34 @@ | ||
| # [S] Fix the runner's post-merge review findings | ||
|
|
||
| ## Goal | ||
|
|
||
| Two `quest runner` processes never work in the same runner home at once, and | ||
| the `context` tool returns every unresolved review thread of a pull request, | ||
| however many threads it has. | ||
|
|
||
| ## Plan | ||
|
|
||
| Decided 2026-10-22 (user) from Codex's post-merge review of | ||
| [kixelated/quest#188](https://github.com/kixelated/quest/pull/188) | ||
| ([review](https://github.com/kixelated/quest/pull/188#pullrequestreview-5618747276)), | ||
| which covered rework that merged without a review: | ||
|
|
||
| - **One runner per home (user).** `quest runner run` takes an exclusive lock | ||
| on its runner home and refuses to start while another process holds it. | ||
| The per-repository lock in `src/runner/workspace.ts` serializes only within | ||
| one process, so a second runner on the same home could reuse and modify a | ||
| job worktree while the first one's agents are still stopping after the hub | ||
| reassigns their jobs | ||
| ([P1](https://github.com/kixelated/quest/pull/188#discussion_r4351848499)). | ||
| Rejected: inter-process locks per repository and worktree, which allow | ||
| several runners per home at more complexity. The lock must release when its | ||
| holder dies, on Linux and macOS. | ||
| - **Page review threads.** The context query in | ||
| `cloudflare/src/github/service.ts` reads only the first 100 review threads | ||
| before filtering unresolved ones, so a newer unresolved thread on a busy PR | ||
| is silently omitted | ||
| ([P2](https://github.com/kixelated/quest/pull/188#discussion_r4351848505)). | ||
| Follow `pageInfo` cursors until every thread is examined. | ||
| - Ranked first in the epic, since both fix merged code. Test a second runner | ||
| refused on a held home, a lock released after a crash, and a pull request | ||
| with more than 100 review threads. |
This file was deleted.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,30 @@ | ||
| # [S] Stop the lifecycle CI jobs failing at random | ||
|
|
||
| ## Goal | ||
|
|
||
| The lifecycle CI jobs fail only when the code under test is broken: the | ||
| Windows check never fails with `EBUSY` while removing its temporary | ||
| directory, and a macOS job that never gets a runner does not show as a | ||
| failed check. | ||
|
|
||
| ## Plan | ||
|
|
||
| Decided 2026-10-22 (user) as follow-ups of | ||
| [kixelated/quest#192](https://github.com/kixelated/quest/pull/192) and | ||
| [kixelated/quest#191](https://github.com/kixelated/quest/pull/191): | ||
|
|
||
| - **Windows `EBUSY`.** The Windows arm64 Release job failed after its own | ||
| checks passed, in the final `rmSync(work, { recursive: true, force: true })` | ||
| of `scripts/lifecycle-check.mjs`, on #192 and on the `quest/m0/worktree` | ||
| branch (run 39679528766). A rerun passed both times. Find which process or | ||
| handle still holds the directory (for example a child process the check | ||
| started, or a file it left open) and fix that cause. No retries, sleeps, or | ||
| ignored errors. Reproduce it on a native Windows runner before fixing. | ||
| - **macOS queue timeout.** On #191 and | ||
| [kixelated/quest#185](https://github.com/kixelated/quest/pull/185), the | ||
| optional `lifecycle (macos-14)` job waited 15 minutes for a hosted runner | ||
| during a GitHub macOS capacity notice, was cancelled without running, and | ||
| showed as failed. Decide from the workflow (`.github/workflows/check.yml`) | ||
| whether to shorten its queue limit, report it as skipped, or drop it from | ||
| pull request runs, keeping macOS covered somewhere. | ||
| - Keep both fixes covered by the existing lifecycle jobs. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,22 @@ | ||
| # [S] Make every Worker test pass on its own | ||
|
|
||
| ## Goal | ||
|
|
||
| Each Worker test (`cloudflare/test/`) passes when run alone, in any order, or | ||
| in the full suite, because no test depends on D1 state another test left | ||
| behind. | ||
|
|
||
| ## Plan | ||
|
|
||
| Decided 2026-10-22 (user) as a follow-up of | ||
| [kixelated/quest#188](https://github.com/kixelated/quest/pull/188): | ||
|
|
||
| - A test in `cloudflare/test/publish.test.ts` passed in the full suite but | ||
| failed alone with a foreign-key error until it inserted its second user | ||
| itself, so D1 state leaks between tests in a full run. | ||
| - Find how state is shared (per-file or per-suite storage, seeded rows, | ||
| module-level fixtures) and make each test set up what it needs, rather than | ||
| fixing tests one at a time as they surface. | ||
| - Prove it by running each Worker test case alone (not just each file, since | ||
| tests in one file share state too) and the suite in a shuffled order, and | ||
| keep a check in CI that would catch a new order dependence. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,22 @@ | ||
| # [S] Read only what changed in each history pass | ||
|
|
||
| ## Goal | ||
|
|
||
| A history pass over a project reads only the issues and pull requests that | ||
| changed since the last pass, and fetches pull request bodies only where the | ||
| board needs them, instead of paging every entity each time. | ||
|
|
||
| ## Plan | ||
|
|
||
| Decided 2026-10-22 (user) as a follow-up of | ||
| [kixelated/quest#182](https://github.com/kixelated/quest/pull/182): | ||
|
|
||
| - Each history page now fetches up to 50 pull request bodies, and a full pass | ||
| still pages every entity: about 126 pages on moq-dev/moq. | ||
| - Page by update time from the last pass's high-water mark, and read bodies | ||
| only for open drafts, whose `## Decisions needed` section decides whether | ||
| the board shows them as claimed or handed back. | ||
| - m1, next to [batched inbox reads](/quest/m1/inbox-reads.md): m0 pilots are | ||
| small enough that full passes are affordable. | ||
| - Dropped (user): caching installation tokens across an inbox load, until | ||
| pilots show slow inboxes. |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
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.
On a PR with more than 100 relevant timeline events after a hold was taken, reusing the state-command reader cannot provide the promised age or event:
src/cli/hold.ts:25requests onlytimelineItems(last: 100), andholder()deliberately omits those details when the label-add event is absent. Require pagination (or a direct event lookup) here soquest statussatisfies the stated output on long-lived PRs.Useful? React with 👍 / 👎.
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.
Disagree for this quest. The reader in
src/cli/hold.tsfilters the timeline to label, auto-merge, and merge-queue events, so falling off its last 100 needs 100 such events after the hold was taken, which no PR here comes close to.quest statusdeliberately shares that reader, so if paging is ever needed it belongs in the shared reader and fixes the state commands too, rather than in this quest.(Written by Claude Opus 5.5)