From bd132c2618796ee88a32cb215680c61a9d8832af Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Thu, 12 Nov 2026 16:28:25 -0800 Subject: [PATCH 1/6] quest: plan fixes the Pullfrog learnings exposed Co-Authored-By: Claude Opus 5.5 --- quest/m0/doc-drift.md | 30 ++++++++++++++++++++++++++++++ quest/m0/pin-on-main.md | 21 +++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 quest/m0/doc-drift.md create mode 100644 quest/m0/pin-on-main.md diff --git a/quest/m0/doc-drift.md b/quest/m0/doc-drift.md new file mode 100644 index 0000000..91a25e8 --- /dev/null +++ b/quest/m0/doc-drift.md @@ -0,0 +1,30 @@ +# [S] Docs and test notes match the code + +## Goal + +Ignored tests name a recipe that exists, `record.rs` describes how recording +actually encodes, and `CONTRIBUTING.md`'s PR rules fit the quest PRs agents +open, so neither people nor agents follow instructions that fail. + +## Plan + +Decided 2026-11-12 (user, /quest-plan), from studio's trimmed Pullfrog +learnings: + +- `CONTRIBUTING.md:9` and `:15-21` require conventional-commit titles and + Problem/Approach/Impact sections on every PR, but quest PRs (#108, #110, + #112, #114, #115, #126, #141, #143) use the quest guide's sections and + `quest:` titles. Which changes? + - ✅ Exempt quest PRs: a PR that only adds or edits quests follows the quest + guide's format and a `quest:` title (rejected: make quest PRs carry the + template too). +- 59 `#[ignore]` reasons say `just rs render-sw` (54 in + `rs/moq-scene/src/compositor.rs`, 5 in `rs/moq-studio/src/engine.rs`), but + the recipe is `just render-sw` in the root `justfile`. Open PR + [moq-dev/studio#146](https://github.com/moq-dev/studio/pull/146) adds + another with the wrong name and edits the recipe; fix whatever main holds + when the work starts. +- `rs/moq-studio/src/record.rs:4-6` says a recording shares the live + encoders, but `rs/moq-studio/src/engine.rs:1806-1810` gives each recording + its own full-size encoder in a private broadcast. Make the comment match + the engine. diff --git a/quest/m0/pin-on-main.md b/quest/m0/pin-on-main.md new file mode 100644 index 0000000..abe6706 --- /dev/null +++ b/quest/m0/pin-on-main.md @@ -0,0 +1,21 @@ +# [XS] The moq pin is checked to be on moq's main + +## Goal + +A PR that points the `moq` submodule at a commit not on moq-dev/moq's `main` +fails a check, as `AGENTS.md:14` already requires in prose. + +## Plan + +Decided 2026-11-12 (user, /quest-plan), from studio's trimmed Pullfrog +learnings. + +`sh/check-moq-pin.sh` checks only that the checkout matches the gitlink, that +the submodule is clean, and that no moq git dependency appears beside it. +`sh/upgrade-moq.sh` fetches moq's `main` but checks out any revision given. + +Recommended: in `sh/check-moq-pin.sh`, fetch moq's `main` and fail unless +`git merge-base --is-ancestor origin/main` holds; run it where a +fetch is allowed, and make `just upgrade-moq ` refuse a revision off +`main` the same way. [pin-main](/quest/m0/pin-main.md) catches the studio up +to moq's `main` and is unaffected. From 8ae7ad16949ae326b4142e258e13bfedb053cfa9 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Thu, 12 Nov 2026 16:44:50 -0800 Subject: [PATCH 2/6] quest: settle the review's findings on the Pullfrog plans Co-Authored-By: Claude Opus 5.5 --- quest/m0/doc-drift.md | 34 ++++++++++++++++++++-------------- quest/m0/pin-on-main.md | 21 ++++++++++++++------- 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/quest/m0/doc-drift.md b/quest/m0/doc-drift.md index 91a25e8..2817883 100644 --- a/quest/m0/doc-drift.md +++ b/quest/m0/doc-drift.md @@ -2,29 +2,35 @@ ## Goal -Ignored tests name a recipe that exists, `record.rs` describes how recording -actually encodes, and `CONTRIBUTING.md`'s PR rules fit the quest PRs agents -open, so neither people nor agents follow instructions that fail. +Ignored tests name a recipe that exists, and `just check` keeps it so, +`record.rs` describes how recording actually encodes, and `CONTRIBUTING.md`'s +PR rules fit the quest PRs agents open, so neither people nor agents follow +instructions that fail. ## Plan -Decided 2026-11-12 (user, /quest-plan), from studio's trimmed Pullfrog +Decided 2026-11-12 (maintainer, /quest-plan), from studio's trimmed Pullfrog learnings: - `CONTRIBUTING.md:9` and `:15-21` require conventional-commit titles and Problem/Approach/Impact sections on every PR, but quest PRs (#108, #110, #112, #114, #115, #126, #141, #143) use the quest guide's sections and - `quest:` titles. Which changes? + `quest` type titles, such as `quest:` or `quest(m0/ux):`. Which changes? - ✅ Exempt quest PRs: a PR that only adds or edits quests follows the quest - guide's format and a `quest:` title (rejected: make quest PRs carry the - template too). + guide's format and a `quest` type title, with or without a scope + (rejected: make quest PRs carry the template too). - 59 `#[ignore]` reasons say `just rs render-sw` (54 in `rs/moq-scene/src/compositor.rs`, 5 in `rs/moq-studio/src/engine.rs`), but - the recipe is `just render-sw` in the root `justfile`. Open PR + the recipe is `just render-sw` in the root `justfile`. Fix every one main + holds, and add a `just check` step that fails when an `#[ignore]` reason + names a `just` recipe the root `justfile` does not define (`just + --summary` lists them). Open PR [moq-dev/studio#146](https://github.com/moq-dev/studio/pull/146) adds - another with the wrong name and edits the recipe; fix whatever main holds - when the work starts. -- `rs/moq-studio/src/record.rs:4-6` says a recording shares the live - encoders, but `rs/moq-studio/src/engine.rs:1806-1810` gives each recording - its own full-size encoder in a private broadcast. Make the comment match - the engine. + another with the wrong name and edits the recipe; whichever of the two + lands second then fails its check until it agrees, so neither waits. +- `rs/moq-studio/src/record.rs:4-6` says a recording of the program shares + the live encoders, but `rs/moq-studio/src/engine.rs:1811-1852` gives the + recording its own full-size encoder (`recorded_video`, `record: true`) in + a hidden broadcast. Rewrite only the program's half: the sources' half + (`record.rs:6-9`) is accurate, since local sources are read from the + studio's local broadcast (`engine.rs:932-935`). diff --git a/quest/m0/pin-on-main.md b/quest/m0/pin-on-main.md index abe6706..23fe9f5 100644 --- a/quest/m0/pin-on-main.md +++ b/quest/m0/pin-on-main.md @@ -7,15 +7,22 @@ fails a check, as `AGENTS.md:14` already requires in prose. ## Plan -Decided 2026-11-12 (user, /quest-plan), from studio's trimmed Pullfrog -learnings. +From studio's trimmed Pullfrog learnings (2026-11-12, maintainer, +/quest-plan). `sh/check-moq-pin.sh` checks only that the checkout matches the gitlink, that the submodule is clean, and that no moq git dependency appears beside it. `sh/upgrade-moq.sh` fetches moq's `main` but checks out any revision given. -Recommended: in `sh/check-moq-pin.sh`, fetch moq's `main` and fail unless -`git merge-base --is-ancestor origin/main` holds; run it where a -fetch is allowed, and make `just upgrade-moq ` refuse a revision off -`main` the same way. [pin-main](/quest/m0/pin-main.md) catches the studio up -to moq's `main` and is unaffected. +- Add a script that fetches moq's `main` into the submodule, with its whole + commit history (`--filter=tree:0` keeps it small, and CI's submodule + checkout is shallow), and fails unless `git merge-base --is-ancestor + FETCH_HEAD` holds. +- Run it as its own step in `.github/workflows/check.yml`, not from + `just check`, so a local `just check` stays offline and an unchanged pin + never fails on a network error. +- `just upgrade-moq ` runs the same ancestry test after its fetch and + refuses a revision off `main`. + +[pin-main](/quest/m0/pin-main.md) catches the studio up to moq's `main` and +is unaffected: the current pin, `644d48996`, is on `main`. From 0983cac5322eedffe9a8010dc094908319814c53 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Thu, 12 Nov 2026 16:45:03 -0800 Subject: [PATCH 3/6] quest: pin-on-main unshallows CI's submodule before the ancestry test Co-Authored-By: Claude Opus 5.5 --- quest/m0/pin-on-main.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/quest/m0/pin-on-main.md b/quest/m0/pin-on-main.md index 23fe9f5..ad10a17 100644 --- a/quest/m0/pin-on-main.md +++ b/quest/m0/pin-on-main.md @@ -14,10 +14,10 @@ From studio's trimmed Pullfrog learnings (2026-11-12, maintainer, the submodule is clean, and that no moq git dependency appears beside it. `sh/upgrade-moq.sh` fetches moq's `main` but checks out any revision given. -- Add a script that fetches moq's `main` into the submodule, with its whole - commit history (`--filter=tree:0` keeps it small, and CI's submodule - checkout is shallow), and fails unless `git merge-base --is-ancestor - FETCH_HEAD` holds. +- Add a script that fetches moq's `main` into the submodule with its whole + commit history, since CI's submodule checkout is shallow (`--unshallow` + where it is, with `--filter=tree:0` to keep it small), and fails unless + `git merge-base --is-ancestor FETCH_HEAD` holds. - Run it as its own step in `.github/workflows/check.yml`, not from `just check`, so a local `just check` stays offline and an unchanged pin never fails on a network error. From 673ff3ed470f39bde831762c8938bf2c566635bd Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Thu, 12 Nov 2026 16:52:25 -0800 Subject: [PATCH 4/6] quest: bound the recipe lint's race with #146 and fetch moq only when the pin moves Co-Authored-By: Claude Opus 5.5 --- quest/m0/doc-drift.md | 8 ++++++-- quest/m0/pin-on-main.md | 6 ++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/quest/m0/doc-drift.md b/quest/m0/doc-drift.md index 2817883..6c9ac49 100644 --- a/quest/m0/doc-drift.md +++ b/quest/m0/doc-drift.md @@ -26,8 +26,12 @@ learnings: names a `just` recipe the root `justfile` does not define (`just --summary` lists them). Open PR [moq-dev/studio#146](https://github.com/moq-dev/studio/pull/146) adds - another with the wrong name and edits the recipe; whichever of the two - lands second then fails its check until it agrees, so neither waits. + another with the wrong name and edits the recipe. Check on a PR tests its + merge with `main` as of its last run, so if this lands first, #146's next + Check runs the lint, and if #146 lands first, this fixes its reason too. + If #146 has already passed Check when this lands, update its branch with + `main` (`gh pr update-branch 146`), or ask the session holding it to, so + it cannot land on a Check that predates the lint. - `rs/moq-studio/src/record.rs:4-6` says a recording of the program shares the live encoders, but `rs/moq-studio/src/engine.rs:1811-1852` gives the recording its own full-size encoder (`recorded_video`, `record: true`) in diff --git a/quest/m0/pin-on-main.md b/quest/m0/pin-on-main.md index ad10a17..832a42c 100644 --- a/quest/m0/pin-on-main.md +++ b/quest/m0/pin-on-main.md @@ -19,8 +19,10 @@ the submodule is clean, and that no moq git dependency appears beside it. where it is, with `--filter=tree:0` to keep it small), and fails unless `git merge-base --is-ancestor FETCH_HEAD` holds. - Run it as its own step in `.github/workflows/check.yml`, not from - `just check`, so a local `just check` stays offline and an unchanged pin - never fails on a network error. + `just check`, so a local `just check` stays offline, and only on a pull + request whose `moq` gitlink differs from its base's + (`github.event.pull_request.base.sha`), so an unchanged pin fetches + nothing and never fails on a network error. - `just upgrade-moq ` runs the same ancestry test after its fetch and refuses a revision off `main`. From 4a89fac50051990d1543c1eb884ad20a0783c891 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Fri, 13 Nov 2026 09:25:07 -0800 Subject: [PATCH 5/6] quest(m0): address CodeRabbit on #146's hold and the base gitlink fetch Co-Authored-By: Claude Opus 5.5 --- quest/m0/doc-drift.md | 10 +++++++--- quest/m0/pin-on-main.md | 6 +++++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/quest/m0/doc-drift.md b/quest/m0/doc-drift.md index 6c9ac49..8df9ed7 100644 --- a/quest/m0/doc-drift.md +++ b/quest/m0/doc-drift.md @@ -29,9 +29,13 @@ learnings: another with the wrong name and edits the recipe. Check on a PR tests its merge with `main` as of its last run, so if this lands first, #146's next Check runs the lint, and if #146 lands first, this fixes its reason too. - If #146 has already passed Check when this lands, update its branch with - `main` (`gh pr update-branch 146`), or ask the session holding it to, so - it cannot land on a Check that predates the lint. + `main`'s ruleset does not require an up-to-date branch, so a Check that + predates the lint still counts. #146 is a draft held until moq's timed + catalog is pinned, so it cannot merge before this lands; right after this + lands, update its branch with `main` (`gh pr update-branch 146`), or ask + the session holding it to, so its next Check runs the lint before it can + be marked ready. If #146 is ready for review by then, hold it from merging + until that Check passes. - `rs/moq-studio/src/record.rs:4-6` says a recording of the program shares the live encoders, but `rs/moq-studio/src/engine.rs:1811-1852` gives the recording its own full-size encoder (`recorded_video`, `record: true`) in diff --git a/quest/m0/pin-on-main.md b/quest/m0/pin-on-main.md index 832a42c..236ae29 100644 --- a/quest/m0/pin-on-main.md +++ b/quest/m0/pin-on-main.md @@ -22,7 +22,11 @@ the submodule is clean, and that no moq git dependency appears beside it. `just check`, so a local `just check` stays offline, and only on a pull request whose `moq` gitlink differs from its base's (`github.event.pull_request.base.sha`), so an unchanged pin fetches - nothing and never fails on a network error. + nothing and never fails on a network error. The checkout is shallow + (depth 1, the merge commit only), so the step first runs + `git fetch --no-tags --depth=1 origin ` and compares + `git rev-parse :moq` with `git rev-parse HEAD:moq`; that fetch + is one small commit and reads no submodule. - `just upgrade-moq ` runs the same ancestry test after its fetch and refuses a revision off `main`. From d0faa24e9f14176718b6617f0c2967cc51c4a173 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Fri, 13 Nov 2026 09:29:23 -0800 Subject: [PATCH 6/6] quest(m0/doc-drift): Check runs when a draft is marked ready Co-Authored-By: Claude Opus 5.5 --- quest/m0/doc-drift.md | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/quest/m0/doc-drift.md b/quest/m0/doc-drift.md index 8df9ed7..38017c0 100644 --- a/quest/m0/doc-drift.md +++ b/quest/m0/doc-drift.md @@ -26,16 +26,14 @@ learnings: names a `just` recipe the root `justfile` does not define (`just --summary` lists them). Open PR [moq-dev/studio#146](https://github.com/moq-dev/studio/pull/146) adds - another with the wrong name and edits the recipe. Check on a PR tests its - merge with `main` as of its last run, so if this lands first, #146's next - Check runs the lint, and if #146 lands first, this fixes its reason too. - `main`'s ruleset does not require an up-to-date branch, so a Check that - predates the lint still counts. #146 is a draft held until moq's timed - catalog is pinned, so it cannot merge before this lands; right after this - lands, update its branch with `main` (`gh pr update-branch 146`), or ask - the session holding it to, so its next Check runs the lint before it can - be marked ready. If #146 is ready for review by then, hold it from merging - until that Check passes. + another with the wrong name and edits the recipe. Check skips drafts but + runs when one is marked ready, testing its merge with `main` as of that + run, so #146, a draft held until moq's timed catalog is pinned, runs the + lint once marked ready after this lands; if #146 lands first, this fixes + its reason too. `main`'s ruleset does not require an up-to-date branch, + so if #146 is ready with a passing Check when this lands, update its + branch (`gh pr update-branch 146`), or ask the session holding it to, and + hold it from merging until that Check passes. - `rs/moq-studio/src/record.rs:4-6` says a recording of the program shares the live encoders, but `rs/moq-studio/src/engine.rs:1811-1852` gives the recording its own full-size encoder (`recorded_video`, `record: true`) in