diff --git a/.claude/skills/quest-iterate/SKILL.md b/.claude/skills/quest-iterate/SKILL.md new file mode 100644 index 00000000000..ce4652438a5 --- /dev/null +++ b/.claude/skills/quest-iterate/SKILL.md @@ -0,0 +1,7 @@ +--- +name: quest-iterate +description: Iterate on an open PR to settle its open decisions, fix CI and review findings, and push. +--- + +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 c93c2efa092..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`, a questline) 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 efeed0f7799..080a1ddbc60 100644 --- a/flake.lock +++ b/flake.lock @@ -65,17 +65,17 @@ ] }, "locked": { - "lastModified": 1790797838, - "narHash": "sha256-/WmkmY7+FJSNGXR6+1i0sV2xHLRnWUxAVC0xogJdqlo=", + "lastModified": 1791174579, + "narHash": "sha256-mnhPSoQsj3qOOdEuMZieVeOfcOVov72o+m5i/7L3ixA=", "owner": "kixelated", "repo": "quest", - "rev": "362489bcf02833d8674cff339463b086442cf92d", + "rev": "677f8d11aa2fb71828ac7760bfa4bbf9d4165594", "type": "github" }, "original": { "owner": "kixelated", "repo": "quest", - "rev": "362489bcf02833d8674cff339463b086442cf92d", + "rev": "677f8d11aa2fb71828ac7760bfa4bbf9d4165594", "type": "github" } }, diff --git a/flake.nix b/flake.nix index aa5fedf168f..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/362489bcf02833d8674cff339463b086442cf92d"; + 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 7913dfb82a5..8af5a6df0e4 100644 --- a/quest/m1/quest-flat-lines.md +++ b/quest/m1/quest-flat-lines.md @@ -11,23 +11,55 @@ 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 +`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 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. kixelated/quest#52 + renamed it upstream to match. +- `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. Done when `flake.nix` pins the new quest, no `quest/*README` branch remains, and `quest check` passes.