From bcf91c92f0103bf511a561c8105879618ecfeb4b Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Sun, 4 Oct 2026 21:04:14 -0700 Subject: [PATCH 1/3] chore(quest): pin the flat-questline quest CLI Bump the quest input to kixelated/quest 0cb952c, which drops questline branches. Add the quest-iterate skill stub, record the flat-lines decisions in the quest, and drop questlines from the merge-commit rule. Co-Authored-By: Claude Opus 5.5 --- .claude/skills/quest-iterate/SKILL.md | 7 +++ CONTRIBUTING.md | 2 +- flake.lock | 8 ++-- flake.nix | 2 +- quest/m1/quest-flat-lines.md | 69 ++++++++++++++++++++------- 5 files changed, 65 insertions(+), 23 deletions(-) create mode 100644 .claude/skills/quest-iterate/SKILL.md diff --git a/.claude/skills/quest-iterate/SKILL.md b/.claude/skills/quest-iterate/SKILL.md new file mode 100644 index 00000000000..3c0192a2df1 --- /dev/null +++ b/.claude/skills/quest-iterate/SKILL.md @@ -0,0 +1,7 @@ +--- +name: quest-iterate +description: Adopt someone else's open PR and drive it to landable. +--- + +Run `quest skill takeover` and follow its output. +If `quest` is not installed, follow https://github.com/kixelated/quest/blob/main/SETUP.md first. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c93c2efa092..6f994bb82b6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,7 +1,7 @@ # Commits PRs into `main` are squash-merged, so the PR title becomes the commit subject and the PR description becomes the body in `git log`. -PRs into any other branch (`release`, a questline) use a merge commit, so their history survives until they land. +PRs into any other branch (`release`) use a merge commit, so their history survives until they land. - Use conventional-commit subjects (`feat(watch): ...`, `fix: ...`, `chore: ...`, `docs: ...`) - AI commit attribution goes in a `Co-Authored-By:` trailer, not the commit body. diff --git a/flake.lock b/flake.lock index efeed0f7799..eb5bb096860 100644 --- a/flake.lock +++ b/flake.lock @@ -65,17 +65,17 @@ ] }, "locked": { - "lastModified": 1790797838, - "narHash": "sha256-/WmkmY7+FJSNGXR6+1i0sV2xHLRnWUxAVC0xogJdqlo=", + "lastModified": 1791167052, + "narHash": "sha256-7CSvqXwmt7C6lQ5Ff3afSpIvpgEchbov0QscfoXl4f8=", "owner": "kixelated", "repo": "quest", - "rev": "362489bcf02833d8674cff339463b086442cf92d", + "rev": "0cb952c2d8fdf2b6e0ec0a9ac2c0ab605876193d", "type": "github" }, "original": { "owner": "kixelated", "repo": "quest", - "rev": "362489bcf02833d8674cff339463b086442cf92d", + "rev": "0cb952c2d8fdf2b6e0ec0a9ac2c0ab605876193d", "type": "github" } }, diff --git a/flake.nix b/flake.nix index aa5fedf168f..66f9456e30b 100644 --- a/flake.nix +++ b/flake.nix @@ -27,7 +27,7 @@ # The quest CLI, which also serves the quest guide and skills the stubs in # .claude/skills call. Bump the rev to upgrade them. quest = { - url = "github:kixelated/quest/362489bcf02833d8674cff339463b086442cf92d"; + url = "github:kixelated/quest/0cb952c2d8fdf2b6e0ec0a9ac2c0ab605876193d"; inputs.nixpkgs.follows = "nixpkgs"; inputs.flake-utils.follows = "flake-utils"; inputs.crane.follows = "crane"; diff --git a/quest/m1/quest-flat-lines.md b/quest/m1/quest-flat-lines.md index 7913dfb82a5..1301a1166af 100644 --- a/quest/m1/quest-flat-lines.md +++ b/quest/m1/quest-flat-lines.md @@ -11,23 +11,58 @@ branches reaches `main`, and those branches retire. kixelated/quest#44 dropped questline branches, `quest branch`, and `quest ready --remote`; kixelated/quest#51 changed the import skill to treat a -report's fix as a claim and plan each issue fully. moq still pins the quest -input in `flake.nix` from before both. - -Decided (2026-10-04): a quest of its own, not a routine pin bump, because 16 -questline branches carry merged child work that is not on `main` -(`git ls-remote origin 'refs/heads/quest/*README'`). - -- Bump the `quest` input and run `quest check` with the new CLI; fix what it - reports. -- For each questline branch, land its accumulated work on `main` through its - existing umbrella PR, or a new one, then delete the branch. A branch whose - work cannot land yet is decided with the maintainer, not left orphaned. -- Add the `quest-takeover` skill stub beside the other `.claude/skills/quest-*` - stubs, and decide with the maintainer whether it replaces the existing - `takeover` skill. -- Update `AGENTS.md` and `CONTRIBUTING.md` only where they describe questline - branches, with the maintainer's approval, as both files require. +report's fix as a claim and plan each issue fully. moq pins kixelated/quest +`0cb952c`, which includes both; `quest check` passed on the tree unchanged. + +Decided 2026-10-04: + +- A quest of its own, not a routine pin bump, because 16 questline branches + carried merged child work that is not on `main`. +- Goal confirmed: questlines become planning groups whose children PR straight + to `main`. Finishing any line's remaining children is a non-goal. +- Bump the CLI now, not after the lines land, because the point is to get rid + of line branches. +- Each code-carrying line branch gets `main` merged in and its umbrella PR + marked ready; the maintainer lands them later with `/quest-complete`. Merging + `main` in is less churn than re-cutting each child, and finishing a line + first would keep its branch alive. +- Code-free lines (quic #3975, cluster-routing #4654, broadcast-epoch #4805) + are closed and their branches deleted; their children PR to `main`. Nothing + on them needs landing. +- Nested lines (rs2ts/sans-io #4438, archive/track-timeline #4255) fold into + their parent branch, then close, so each tree lands through one PR. +- The quest CLI's PR-adoption skill is installed as `quest-iterate` and + replaces the `takeover` skill, so one skill covers it. The CLI still calls it + `takeover`, so the stub runs `quest skill takeover` until kixelated/quest#52 + renames it. +- `CONTRIBUTING.md` drops ", a questline" so the merge-commit rule names only + `release`. + +Interview paper trail (✅ marks the choice): + +- Goal confirm: ✅ Confirm / Also finish lines / Bump only. +- Landing default: Land partial now / Re-cut per child / Finish then land / + ✅ (user) "merge main into the branch, mark PR as ready for review, then I'll + do quest-complete later". +- Split: Per-line quests / One quest / Batch by size / ✅ (user) "spawn + sub-agents to merge main for all of them, then mark as ready". +- Order: Bump last / Bump first / Bump first, sync quest files / ✅ (user) "the + idea is to get rid of line branches", then confirmed ✅ Bump now. +- Empty lines: ✅ Close and retarget / Merge main and ready. +- Nested: ✅ Fold into parent / Retarget to main / Merge main, keep nesting. +- Takeover: Add stub, replace takeover / Add stub, keep both / Skip / ✅ (user) + "add stub, replace takeover, rename it to quest-iterate". +- CONTRIBUTING: ✅ Yes, edit it / Leave it. + +Remaining: + +- Land each line's umbrella PR with `/quest-complete`, then delete its branch: + #4162 audio-jitter-target, #4403 wildcard, #4034 archive (with #4255 folded + in), #4039 auth, #4079 cpp, #4519 ffi-shape, #4080 obs-moq-video, #4133 qos, + #4437 rs2ts (with #4438 folded in), #4653 test-flakes-2, #4180 + transport-upgrade, #4640 tstd. +- Once kixelated/quest#52 merges, bump the `quest` input and point the + `quest-iterate` stub at `quest skill iterate`. Done when `flake.nix` pins the new quest, no `quest/*README` branch remains, and `quest check` passes. From afd575402040c0fbb336dbd7f7455f5e84e9ba7e Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Sun, 4 Oct 2026 21:31:37 -0700 Subject: [PATCH 2/3] chore(quest): pin the iterate rename Re-pin quest to 677f8d1 (kixelated/quest#52), so the quest-iterate stub runs `quest skill iterate`. Address review: the merge-commit rule names only `release`, and the quest lists the leftover cluster-routing branch instead of a branch count. Co-Authored-By: Claude Opus 5.5 --- .claude/skills/quest-iterate/SKILL.md | 4 ++-- CONTRIBUTING.md | 2 +- flake.lock | 8 ++++---- flake.nix | 2 +- quest/m1/quest-flat-lines.md | 14 ++++++-------- 5 files changed, 14 insertions(+), 16 deletions(-) diff --git a/.claude/skills/quest-iterate/SKILL.md b/.claude/skills/quest-iterate/SKILL.md index 3c0192a2df1..ce4652438a5 100644 --- a/.claude/skills/quest-iterate/SKILL.md +++ b/.claude/skills/quest-iterate/SKILL.md @@ -1,7 +1,7 @@ --- name: quest-iterate -description: Adopt someone else's open PR and drive it to landable. +description: Iterate on an open PR to settle its open decisions, fix CI and review findings, and push. --- -Run `quest skill takeover` and follow its output. +Run `quest skill iterate` and follow its output. If `quest` is not installed, follow https://github.com/kixelated/quest/blob/main/SETUP.md first. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6f994bb82b6..850ee697797 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,7 +1,7 @@ # Commits PRs into `main` are squash-merged, so the PR title becomes the commit subject and the PR description becomes the body in `git log`. -PRs into any other branch (`release`) use a merge commit, so their history survives until they land. +PRs into `release` use a merge commit, so their history survives until they land. - Use conventional-commit subjects (`feat(watch): ...`, `fix: ...`, `chore: ...`, `docs: ...`) - AI commit attribution goes in a `Co-Authored-By:` trailer, not the commit body. diff --git a/flake.lock b/flake.lock index eb5bb096860..080a1ddbc60 100644 --- a/flake.lock +++ b/flake.lock @@ -65,17 +65,17 @@ ] }, "locked": { - "lastModified": 1791167052, - "narHash": "sha256-7CSvqXwmt7C6lQ5Ff3afSpIvpgEchbov0QscfoXl4f8=", + "lastModified": 1791174579, + "narHash": "sha256-mnhPSoQsj3qOOdEuMZieVeOfcOVov72o+m5i/7L3ixA=", "owner": "kixelated", "repo": "quest", - "rev": "0cb952c2d8fdf2b6e0ec0a9ac2c0ab605876193d", + "rev": "677f8d11aa2fb71828ac7760bfa4bbf9d4165594", "type": "github" }, "original": { "owner": "kixelated", "repo": "quest", - "rev": "0cb952c2d8fdf2b6e0ec0a9ac2c0ab605876193d", + "rev": "677f8d11aa2fb71828ac7760bfa4bbf9d4165594", "type": "github" } }, diff --git a/flake.nix b/flake.nix index 66f9456e30b..c0b2b8cb3d2 100644 --- a/flake.nix +++ b/flake.nix @@ -27,7 +27,7 @@ # The quest CLI, which also serves the quest guide and skills the stubs in # .claude/skills call. Bump the rev to upgrade them. quest = { - url = "github:kixelated/quest/0cb952c2d8fdf2b6e0ec0a9ac2c0ab605876193d"; + url = "github:kixelated/quest/677f8d11aa2fb71828ac7760bfa4bbf9d4165594"; inputs.nixpkgs.follows = "nixpkgs"; inputs.flake-utils.follows = "flake-utils"; inputs.crane.follows = "crane"; diff --git a/quest/m1/quest-flat-lines.md b/quest/m1/quest-flat-lines.md index 1301a1166af..ec77fa157ee 100644 --- a/quest/m1/quest-flat-lines.md +++ b/quest/m1/quest-flat-lines.md @@ -12,11 +12,11 @@ branches reaches `main`, and those branches retire. kixelated/quest#44 dropped questline branches, `quest branch`, and `quest ready --remote`; kixelated/quest#51 changed the import skill to treat a report's fix as a claim and plan each issue fully. moq pins kixelated/quest -`0cb952c`, which includes both; `quest check` passed on the tree unchanged. +`677f8d1`, which includes both; `quest check` passed on the tree unchanged. Decided 2026-10-04: -- A quest of its own, not a routine pin bump, because 16 questline branches +- A quest of its own, not a routine pin bump, because questline branches carried merged child work that is not on `main`. - Goal confirmed: questlines become planning groups whose children PR straight to `main`. Finishing any line's remaining children is a non-goal. @@ -27,14 +27,13 @@ Decided 2026-10-04: `main` in is less churn than re-cutting each child, and finishing a line first would keep its branch alive. - Code-free lines (quic #3975, cluster-routing #4654, broadcast-epoch #4805) - are closed and their branches deleted; their children PR to `main`. Nothing + close and their branches are deleted; their children PR to `main`. Nothing on them needs landing. - Nested lines (rs2ts/sans-io #4438, archive/track-timeline #4255) fold into their parent branch, then close, so each tree lands through one PR. - The quest CLI's PR-adoption skill is installed as `quest-iterate` and - replaces the `takeover` skill, so one skill covers it. The CLI still calls it - `takeover`, so the stub runs `quest skill takeover` until kixelated/quest#52 - renames it. + replaces the `takeover` skill, so one skill covers it. kixelated/quest#52 + renamed it upstream to match. - `CONTRIBUTING.md` drops ", a questline" so the merge-commit rule names only `release`. @@ -61,8 +60,7 @@ Remaining: in), #4039 auth, #4079 cpp, #4519 ffi-shape, #4080 obs-moq-video, #4133 qos, #4437 rs2ts (with #4438 folded in), #4653 test-flakes-2, #4180 transport-upgrade, #4640 tstd. -- Once kixelated/quest#52 merges, bump the `quest` input and point the - `quest-iterate` stub at `quest skill iterate`. +- Delete the `quest/m1/cluster-routing/README` branch; #4654 is closed. Done when `flake.nix` pins the new quest, no `quest/*README` branch remains, and `quest check` passes. From 21f578854cf3aa067216c9f97f4e9f45ac03eb32 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Sun, 4 Oct 2026 21:32:24 -0700 Subject: [PATCH 3/3] chore(quest): the cluster-routing line branch is deleted Co-Authored-By: Claude Opus 5.5 --- quest/m1/quest-flat-lines.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/quest/m1/quest-flat-lines.md b/quest/m1/quest-flat-lines.md index ec77fa157ee..8af5a6df0e4 100644 --- a/quest/m1/quest-flat-lines.md +++ b/quest/m1/quest-flat-lines.md @@ -27,7 +27,7 @@ Decided 2026-10-04: `main` in is less churn than re-cutting each child, and finishing a line first would keep its branch alive. - Code-free lines (quic #3975, cluster-routing #4654, broadcast-epoch #4805) - close and their branches are deleted; their children PR to `main`. Nothing + are closed and their branches deleted; their children PR to `main`. Nothing on them needs landing. - Nested lines (rs2ts/sans-io #4438, archive/track-timeline #4255) fold into their parent branch, then close, so each tree lands through one PR. @@ -60,7 +60,6 @@ Remaining: in), #4039 auth, #4079 cpp, #4519 ffi-shape, #4080 obs-moq-video, #4133 qos, #4437 rs2ts (with #4438 folded in), #4653 test-flakes-2, #4180 transport-upgrade, #4640 tstd. -- Delete the `quest/m1/cluster-routing/README` branch; #4654 is closed. Done when `flake.nix` pins the new quest, no `quest/*README` branch remains, and `quest check` passes.