Skip to content

quest: re-cut milestones by kind of change and priority - #7988

Merged
kixelated merged 18 commits into
mainfrom
quest-plan/milestone-recut
Nov 6, 2026
Merged

kixelated merged 18 commits into
mainfrom
quest-plan/milestone-recut

Conversation

@kixelated

@kixelated kixelated commented Nov 5, 2026 •

Copy link
Copy Markdown
Collaborator

Problem

The milestones mixed kinds of change: m1 was "everything before the next cut, breaking or not" (decided 2026-10-20), and m2 was one flat pile of 390 later quests. Quest is dropping in-milestone ordering and epic child lists, so the milestone is about to become the only priority signal. The maintainer asked to split the milestones by kind of change and to split the old m2 in half.

Approach

New layout, recorded in the root questline and each milestone README:

Milestone Meaning Quest files
m0 urgent work of any kind (unchanged) 33
m1 this cycle's additive work; ships with the cut or as a backported patch 53
m2 the next breaking release plus the new recurring cut gate; the cut waits on m2 alone 44
m3 later work, higher priority: byte streams, mesh, release execution, consumer needs, bug fixes, audits 196
m4 later work, lower priority: tests, tooling, benchmarks, optimizations 109
m5 deferred (was m3), plus old m2's work with no named consumer 146
  • A read-only pass tagged all 480 m1/m2 quests by break surface and priority signal. The test for m1 vs m2 is whether a change would need a breaking release if it landed right after the cut.
  • Moved files: m1 → m2: 33 (announce-takeover, cluster-routing, group-drops, lite07-finalize, subscribe-ranges, time-addressing, unbounded-groups, and webrtc-rename, plus vendor-sync, cut-audit, and moq-c parity under the cut gate). m2 → m1: 1 (video-vaapi). m2 → m3: 195. m2 → m4: 108. m2 → m5: 79. m3 → m5: 66, all of deferred. The two audio-language quests that main added to m2 during this PR joined m3 beside audio-lang.
  • Epics move whole, by their outcome. A quest pulled up a milestone when an earlier-milestone quest requires it (7 pulls, such as vulkan-encode for gpu-release).
  • Rewritten: the cut quest's shift paragraph, the release reviews' and cut's gate (now m2), vendor-sync's re-creation (m3, moved under the next gate by the cut), and the 13 audits' successor rule (m3, behind the cut). Also the stale prose that names a milestone in the present tense, and the paths in tests, docs, and sh/gh/test-inventory.allow.

Claimed quests left in place

quest mv refuses to move a claimed quest, and a child must stay under its epic, so these stay where they are until their claims merge. Breaking ones are listed in m2's Required, so the cut still waits on them. Finish the milestone re-cut moves what remains.

  • Breaking, held in m1: api-audit (#7806), datagram-tracks (#7951, #7959), drop-set (#7670), rind (#7984), session-policy (#7904), stream-credit (#7980).
  • Cut gate, held in m1 and required by the gate: release-perf (#7986). catalog-include and moq-c's api-gaps were held too until their PRs merged during this one; moq-c parity then moved under the gate.
  • Held in m2, belongs in m3: probe (#7390, draft). The cut waits on it until it moves.

Decisions (maintainer, 2026-11-05)

Milestone layout:

  • ✅ Old m1 by type, old m2 by priority: m1 additive, m2 breaking, m3/m4 halves of old m2, m5 deferred
  • Type × horizon grid
  • Type everywhere, then priority

How m1 ships:

  • ✅ Main, then cut or backport
  • Backport every m1 quest
  • Additive-only main after 0.22

What counts as breaking:

  • ✅ All published surfaces (API, frozen wire, catalog, container, CLI/config; unreleased surfaces the cut would freeze count)
  • API, wire, catalog only
  • Library API only

Fix that also breaks, and urgent breaking work:

  • ✅ Urgent → m0, else the break wins; split when a non-breaking fix exists
  • Fix wins
  • Break wins, no m0 exception

Cut gate:

  • ✅ m2 only (overturns 2026-10-20's "everything before the cut")
  • Both m1 and m2

m3 vs m4:

  • ✅ Consumer-driven
  • Exact halves by current rank

Shift after each cut:

  • ✅ m3 splits by type into m1/m2, m4 → m3 (confirmed again after a "-2" alternative was withdrawn)
  • No automatic shift

Claimed quests:

  • ✅ Leave in place
  • Move and re-claim

Cut gates that break nothing (release-perf, vendor-sync, cut-audit, moq-c parity):

  • ✅ A recurring gate in m2 each cycle (maintainer's own answer)
  • m2, as plain cut gates
  • m1 by type, the cut lists them

Gate shape:

  • ✅ Recurring epic in m2, re-created by the cut PR
  • Gate in the release epic

Claim-held epics:

Old m2's bug fixes with no named consumer:

  • ✅ Join m3
  • Keep m3 consumer-only

Ambiguous placements:

  • Accept all eight
  • ✅ Same, except old m2's work with no named consumer goes to m5, not m4

Downstream consumer signal (the maintainer's hosted service):

  • ✅ Links, signal, and sync rule; its own quests are not re-cut
  • Also re-cut it to mirror
  • Links only

Placing upstream work the downstream needs:

  • ✅ By its urgency: its m0 → m1/m2 by kind, its m1/m2 → m3, only its m3 → m4
  • All → m3

Impact

None on the public API or wire. Quest paths move; links and the comments, test strings, and docs that name them follow.

Alternatives

See the decisions above. Re-claiming the held quests would close active PRs, most of them pushed today.

Follow-ups

Review

mechanical fix by codex / Codex: Merged base, preserving audit updates and deletions at re-cut paths; passed quest check; git merge-tree --write-tree base pr-7988; cargo nextest run --locked -p moq-net -p moq-hls -p moq-tokio -p moq-video --no-fail-fast; cargo test --locked -p moq-quic; bun run --cwd doc check; bash sh/markdown.sh check; python3 sh/gh/test-inventory.test.py; python3 sh/gh/test-inventory.py; python3 on each test/interop/*.test.py; bash -n test/interop/interop.sh; bash test/interop/relay-log.test.sh. (head 46e1dff)

  • Round 1: Codex (gpt-6.1-sol, medium effort) via quest review on head 54753ec0a5: 0 findings.

  • Automated review on 54753ec0a5, [P3]: the bulk path rewrite also changed links into other repositories (moq-dev/rind's quest/m3/instant-acme-publish.md, moq-dev/moq.pro's quest/m3/t3/, and a fork's quest/m2/qos/lag-histogram branch). Fixed in f4790d31c9: no link outside this repository differs from main.

  • Round 2: Codex (gpt-6.1-sol, medium effort) on head f4790d31c9: 0 findings.

  • Round 3: Codex (gpt-6.1-sol, medium effort) on head 1c00d1c123, after merging main (its new release-nix-cache.md joined m3 beside release execution): 0 findings.

  • Pullfrog on f4790d31c9 (drop-set missing from the follow-up, two stale group-drops paths, stale milestone names): fixed in c18d660844. Dated decision-prompt options ("✅ Quest in m2") stay as records. Drop-set has no Required entry in the follow-up, since one would clear only after it finished.

  • Round 4: Codex on c18d660844: 0 findings. This was the fourth-round design checkpoint; no findings remained, so the approach stands and the PR continues to merge, as the maintainer asked.

  • Merged main: routes/wire (#7764) landed, so cluster-routing was no longer claimed and moved from m1 to m2.

  • Round 5: Codex on 78dcb4c25a: 1 finding (low): a full GitHub URL to quest/m1/announce-takeover.md. Fixed in d3640c2086; no other such URL remains.

  • Round 6: Codex (new session) on d3640c2086: 0 findings. The head then took a conflict-free merge of main.

  • Validation on d3640c2086: quest check (582 documents ok), just ci, and python3 sh/gh/test-inventory.py passed.

  • Pullfrog thread on 861bbc3939 (release-nix-cache.md said "moved to m2"): fixed in 2c020ef338 by noting its post-re-cut milestone, as other dated placements were. Review skipped for this head: a one-phrase annotation in a decision record, too trivial to need a round. quest check passed.

  • Merged main: push-to-talk/dtx (#7942) landed. What remains of push-to-talk is additive and unclaimed, so it stays in m1 and is no longer an m2 blocker.

  • Round 7: Codex on 8da4cdd64f: 0 findings. quest check and just ci passed.

🤖 Generated with Claude Code

(Written by Claude Opus 5.5)

kixelated and others added 5 commits November 5, 2026 13:50
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ilestones

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…recut

# Conflicts:
#	quest/m0/nightly/ingest-fuzz.md
#	quest/m1/c/README.md
#	quest/m2/README.md
@kixelated
kixelated marked this pull request as ready for review November 5, 2026 22:03

@kixelated kixelated left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review by review (OpenAI)

Reviewed head: 54753ec0a52039b70855d73babe66154ca364374.

[P3] Preserve the upstream milestone in the rind prerequisite link — quest/m5/rind-instant-acme.md:7. This move changes the link inside moq-dev/rind from quest/m3/instant-acme-publish.md to quest/m5/instant-acme-publish.md, although that repository's quest did not move. The new destination returns 404; the original m3 quest still exists. This condition quest explicitly uses that upstream quest's deletion as part of its completion criteria, so it should continue pointing at the actual prerequisite. Keep the local m5 move, but restore the external m3 URL and scope replacements to this repository's paths.

Direction: keep the milestone/gate approach; correct the external reference. No other actionable findings.

Verification: inspected all 529 file changes, the milestone and recurrence rules, and the quest dependency graph; found no missing local quest targets or dependency cycles. GitHub-only review: no local tests, quest check, or just ci run. The PR reports local validation passed; available Check runs for this SHA were skipped/cancelled, not a confirmed CI pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Important

The layout checks out mechanically: the six document counts, the six move counts, every Required tree edge, and every link in the tree match the body. Three things worth fixing remain: about a dozen milestone names that contradict where their quest now lives, two stale group-drops paths, and drop-set missing from the held-claims follow-up.

Reviewed changes

Reviewed the whole 529-file diff at 54753ec: the milestone re-cut, every milestone Required, the new cut gate, the held-claims apparatus, and the path follow-ups outside quest/.

  • New milestone rules — quest/README.md and the six milestone READMEs define kind of change for this cycle (m1 additive, m2 breaking) and priority after it (m3/m4), with m5 deferred and urgent work of either kind in m0.
  • 474 quest renames — 25 m1→m2, 1 m2→m1, 195 m2→m3, 108 m2→m4, 79 m2→m5, 66 m3→m5; every count in the body matches the tree, as do the 33/63/36/196/109/146 milestone totals.
  • Recurring cut gate — quest/m2/cut-gate/ holds release-perf (held in m1), vendor-sync, cut-audit, and moq-c parity, and quest/m3/release/cut.md re-creates it while shifting; vendor-sync's own re-creation rule agrees with it.
  • Held claims — eight breaking quests stay in m1 and are listed as blockers from m2's Required, with quest/m2/recut-held.md as the follow-up.
  • Path follow-ups — bench/doc/infra/test docs, Rust #[ignore] reasons and doc comments, test/interop/*, and sh/gh/test-inventory.allow (33 mappings, all pure rename-follow).

⚠️ recut-held leaves drop-set out of the held set

quest/m2/recut-held.md:6-8 lists seven of the eight held breaking quests to move to m2, omitting drop-set, while quest/m1/README.md names it among the eight held and quest/m2/README.md lists /quest/m1/drop-set.md as a required blocker (#7670 is still open, branch quest/m1/drop-set). Nothing in the follow-up moves it or removes that cross-milestone Required entry, so after the claim merges m2 can keep a required link into m1.

Technical details
# drop-set is held but unaccounted for

## Affected sites
- `quest/m2/recut-held.md:6-8` — goal enumerates seven of the eight held quests.
- `quest/m2/recut-held.md:29-39` — `Required` has no `drop-set` blocker line.
- `quest/m1/README.md:27` — names `drop-set` among the eight held breaking quests.
- `quest/m2/README.md` — `Required` lists `/quest/m1/drop-set.md` as a blocker.

## Required outcome
- The follow-up either carries a `drop-set` blocker line and moves the quest to
  m2, or states that it completes with its claim and removes the extra m2 link.

⚠️ Two paths in receive-windows-evicted still name the old group-drops location

quest/m1/receive-windows-evicted.md:23 correctly gained a /quest/m2/group-drops.md link, but lines 11 and 40 still print and point at quest/m1/group-drops.md. Line 11 is the text a skipped benchmark prints, and rs/moq-tokio/tests/integration/receive_credit.rs's OVERCOMMITTED constant was moved to quest/m2/group-drops.md in this same PR, so the doc and the printed reason now disagree.

Technical details
# group-drops references left in m1

## Affected sites
- `quest/m1/receive-windows-evicted.md:11` — "prints each one with
  `quest/m1/group-drops.md` as the reason".
- `quest/m1/receive-windows-evicted.md:40` — "Fix it at the source in
  `quest/m1/group-drops.md`".
- `rs/moq-tokio/tests/integration/receive_credit.rs` — `OVERCOMMITTED` now says
  `quest/m2/group-drops.md`.

## Required outcome
- Both backticked paths name `quest/m2/group-drops.md`, matching the constant
  the benchmark actually prints.

⚠️ A fork branch URL was rewritten as if it were a repo path

quest/m3/qos/lag-histogram.md:18 now links https://github.com/t0ms/moq/tree/quest/m3/qos/lag-histogram, while line 17 still names the starting branch quest/m2/qos/lag-histogram. Moving a quest file cannot rename a branch on t0ms's fork, so the URL names a branch that never existed; keep the original branch path (the whole fork now 404s, so dropping the link is also fine).

⚠️ Present-tense milestone names survived the prose sweep

The PR rewrites milestone names inside dated decision records elsewhere (teleop-mavlink and teleop-proof went "Parked in m3" to "Parked in m5", crypto-key-load and net-broadcast-requests went "top of m2" to "top of m3"), but these sites still name a milestone other than the one their file now lives in:

  • quest/m4/perf/README.md:69 — "It stays in m2, since m1 defers general optimization" (perf epic is in m4).
  • quest/m4/chromium-opus-timestamps.md:30 — "track it here in m2" (m4).
  • quest/m4/watch-test-waits.md:18 — "Quest in m2" decision option (m4).
  • quest/m4/shared-serve.md:34 — "chosen in m2; in m1" decision options (m4).
  • quest/m5/rs2ts-browser-report.md:11 — "remains in m2" (m5).
  • quest/m5/uring-transport-machines.md:16 — "Kept in m2 (decided 2026-10-17)" (m5).
  • quest/m5/auth-token-fetch.md:17 — "stays in m3 with the other request-token surfaces" (m5).
  • quest/m5/teleop-robot.md:11 and quest/m5/teleop-arbitration.md:11 — "parked in m3" (m5, and their two siblings were updated).
  • quest/m5/route-health/README.md:16 — "Ranked in m2" (m5).
  • quest/m5/stats-encoder-feedback.md:13 — "moved to m3 in the 2026-10-05 audit" (the deferred bucket is m5 now; line 14's "reads land first in m3" is correct).
  • quest/m3/advertise-credit-timeout.md:18 — "Quest in m2" decision option (m3).
  • quest/m3/ietf-js-joining-fetch.md:15 — "only this part stays in m2" (m3).
  • quest/m2/unbounded-groups/byte-holes.md:21 — "stays in m1" (the child moved to m2 with its epic).
Technical details
# Leftover milestone names after the re-cut

## Affected sites
- See the list above; each is a sentence that states the quest's own milestone
  (or its old-scheme home) using pre-recut numbering.
- `quest/m2/README.md:128` ("pure-Rust crypto moved to m3") and `:49` ("Defer
  P2P, watch-worker ..., and QoS lag and prefix stats to m2") sit inside the
  carried decision log, whose preamble redefines only "m1". Their m2/m3 do not
  mean today's m2/m3.

## Required outcome
- Every present-tense or self-referential milestone name matches the file's
  actual milestone after this PR.
- Dated decision records either keep their original wording consistently or are
  rewritten consistently; today the PR does the latter in some files and not in
  others.

## Open questions for the human (optional)
- If historical records should keep their pre-recut names, the `teleop-*`,
  `crypto-key-load`, and `net-broadcast-requests` rewrites should be reverted
  instead of extending the sweep. Pick one convention and apply it everywhere.

Pullfrog  | Fix it ➔ | View workflow run | Using deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏

@kixelated

Copy link
Copy Markdown
Collaborator Author

Fixed the [P3] in f4790d3: the bulk rewrite of quest/mN/ paths also hit links into other repositories (moq-dev/rind, moq-dev/moq.pro, and a fork branch name). Those three are restored, and no link outside this repository now differs from main. Round 2 of the local review on f4790d3 reported no findings.

(Written by Claude Opus 5.5)

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Important

The f4790d3 commit correctly restores every external link to its main value, but the prior review's other three findings remain unaddressed at this head.

Reviewed changes

Reviewed the one-commit delta since 54753ec and re-checked the prior review's open findings against the current tree.

  • External quest links restored — quest/m5/ffi-e2ee.md, quest/m5/ffi-stream.md, and quest/m5/rind-instant-acme.md again point at moq.pro's quest/m3/t3/README.md and moq-dev/rind's quest/m3/instant-acme-publish.md, matching main.
  • Fork branch URL restored — quest/m3/qos/lag-histogram.md:18 again names the quest/m2/qos/lag-histogram branch, so it agrees with line 17.
  • No other external rewrites — a scan of every quest/ URL added versus removed by this PR found no remaining cross-repository path changes.

⚠️ drop-set is still missing from the held-claims follow-up

quest/m2/recut-held.md:7 lists seven of the eight held breaking quests, omitting drop-set, and its Required (lines 31-39) has no drop-set line. quest/m1/README.md:29 and quest/m2/README.md:170 both name /quest/m1/drop-set.md as a blocker the cut waits on, and #7670 is still open on branch quest/m1/drop-set, so nothing in the follow-up moves it or clears that cross-milestone Required entry.

Technical details
# drop-set is held but unaccounted for

## Affected sites
- `quest/m2/recut-held.md:7` — goal enumerates seven of the eight held quests.
- `quest/m2/recut-held.md:31-39` — `Required` has no `drop-set` blocker line.
- `quest/m1/README.md:29` — names `drop-set` among the eight held breaking quests.
- `quest/m2/README.md:170` — `Required` lists `/quest/m1/drop-set.md` as a blocker.
- PR #7670 — open on branch `quest/m1/drop-set`.

## Required outcome
- The follow-up either carries a `drop-set` blocker line and moves the quest to
  m2, or states that it completes with its claim and removes the extra m2 link.

⚠️ receive-windows-evicted still names the old group-drops location twice

quest/m1/receive-windows-evicted.md:11 and :40 still print and link quest/m1/group-drops.md, although line 23 and the Required entry were moved to /quest/m2/group-drops.md. The skipped benchmark prints quest/m2/group-drops.md from OVERCOMMITTED (rs/moq-tokio/tests/integration/receive_credit.rs:941), so the quest text and the real reason now disagree.

Technical details
# group-drops references left in m1

## Affected sites
- `quest/m1/receive-windows-evicted.md:11` — "prints each one with
  `quest/m1/group-drops.md` as the reason".
- `quest/m1/receive-windows-evicted.md:40` — "Fix it at the source in
  `quest/m1/group-drops.md`".
- `rs/moq-tokio/tests/integration/receive_credit.rs:941` — `OVERCOMMITTED` says
  `quest/m2/group-drops.md`.

## Required outcome
- Both backticked paths name `quest/m2/group-drops.md`, matching the constant
  the benchmark actually prints.

⚠️ Present-tense milestone names still contradict the re-cut

The PR rewrites historical milestone names in place elsewhere (teleop-mavlink and teleop-proof went from "Parked in m3" to "Parked in m5"), but these sites still name a milestone other than the one their file now lives in:

  • quest/m4/perf/README.md:69 — "It stays in m2, since m1 defers general optimization".
  • quest/m4/chromium-opus-timestamps.md:30 — "track it here in m2".
  • quest/m4/watch-test-waits.md:18 — "Quest in m2" decision option.
  • quest/m4/shared-serve.md:34 — "in m2; in m1" decision options.
  • quest/m5/rs2ts-browser-report.md:11 — "remains in m2".
  • quest/m5/uring-transport-machines.md:16 — "Kept in m2 (decided 2026-10-17)".
  • quest/m5/auth-token-fetch.md:17 — "stays in m3 with the other request-token surfaces".
  • quest/m5/teleop-robot.md:11 and quest/m5/teleop-arbitration.md:11 — "parked in m3", while their two siblings were updated to m5.
  • quest/m5/route-health/README.md:16 — "Ranked in m2".
  • quest/m5/stats-encoder-feedback.md:13 — "moved to m3 in the 2026-10-05 audit".
  • quest/m3/advertise-credit-timeout.md:18 — "Quest in m2" decision option.
  • quest/m3/ietf-js-joining-fetch.md:15 — "only this part stays in m2".
  • quest/m2/unbounded-groups/byte-holes.md:21 — "stays in m1", although the child moved to m2 with its epic.
Technical details
# Leftover milestone names after the re-cut

## Affected sites
- See the list above; each states the quest's own milestone (or its old-scheme
  home) using pre-recut numbering, and the file now lives elsewhere.
- `quest/m2/README.md:49` and `:128` sit inside the carried decision log, whose
  preamble redefines only "m1"; their m2/m3 do not mean today's m2/m3.

## Required outcome
- Every present-tense or self-referential milestone name matches the file's
  actual milestone after this PR.
- Dated decision records either keep their original wording consistently or are
  rewritten consistently; today the PR does the latter in some files and not in
  others.

## Open questions for the human (optional)
- If historical records should keep their pre-recut names, the `teleop-*`,
  `crypto-key-load`, and `net-broadcast-requests` rewrites should be reverted
  instead of extending the sweep. Pick one convention and apply it everywhere.

Pullfrog  | Fix it ➔ | View workflow run | Using deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏

kixelated and others added 2 commits November 5, 2026 14:30
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…recut

# Conflicts:
#	quest/m1/cluster-routing/routes/wire.md
#	quest/m2/announce-takeover.md

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ℹ️ No critical issues — the merge with main resolves cleanly apart from one stale milestone name in the newly moved quest, and the description's counts have drifted.

Reviewed changes

This run reviewed the merge of main since the prior review at f4790d3.

  • Merged main — brought in the Nix runtime-cache work (#7662), the closed macOS-kio (#7955) and qmux receive-window (#7939) quests, and the dev-shell rename (#7979); both deleted quest docs and their README entries are gone, with no dangling references left behind.
  • Moved release-nix-cache from m2 to m3 — quest/m3/release-nix-cache.md sits beside release execution in quest/m3/README.md, the two quest/m0/ci references now point at m3, and m2's README entry is dropped.
  • Repointed release execution at m2 — quest/m3/README.md now says the cut follows m2 rather than m1, matching quest/m3/release/README.md.

ℹ️ The description's milestone counts no longer match the tree

The table still shows the pre-merge 33/63/36/196/109/146, but main closed two m0 quests and the Nix release quest this PR moves into m3, so the tree now holds 31/63/36/197/109/146. The "m0 ... unchanged" wording is stale for the same reason.

Technical details
# Stale milestone counts in the PR description

## Affected sites
- PR description, milestone table — `m0` says 33 docs and "unchanged"; `m3` says 196.

## Required outcome
- Per-milestone totals match
  `git ls-tree -r --name-only 1c00d1c -- quest/<m> | grep -c '\.md$'`:
  31 / 63 / 36 / 197 / 109 / 146.

## Suggested approach (optional)
- Or drop the per-milestone counts from the table and describe the layout, so a
  later merge with main can't leave the numbers stale.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏

Comment thread quest/m3/release-nix-cache.md Resolved
@kixelated

Copy link
Copy Markdown
Collaborator Author

Addressed pullfrog's review of f4790d3 in c18d660:

  • drop-set: the follow-up now covers it in its Goal and Plan. It gets no Required entry, because a Required on a single claimed quest clears only once that quest is finished, and by then nothing is left to move.
  • receive-windows-evicted: both paths now name quest/m2/group-drops.md.
  • Stale milestone names: every present-tense or location claim is fixed. The dated decision-prompt options ("✅ Quest in m2", "✅ in m2; in m1") stay as written, since they record the choice made at the time.

routes/wire then landed, so cluster-routing moved to m2. Local review rounds 4 to 6 reported nothing left open.

(Written by Claude Opus 5.5)

…lestone

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@kixelated kixelated left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review by review (OpenAI)

Reviewed head: 861bbc393952efe7291ab45feb967bc1214946e8.

No new actionable findings in the delta since 1c00d1c1234d8b362a2ec35a740d84dfd0ebcdfe. The P3 from my earlier review remains fixed: rind's prerequisite keeps its external m3 URL.

Checked the held-quest clarification, milestone/path corrections, and cluster-routing's move to m2 after #7764 merged. Its cut dependency remains in place, the completed wire quest is removed, and the updated local links resolve. Runtime changes in the merge match the base branch; the additional Rust edits only update quest references.

Direction: keep the current approach. Verification was GitHub-only; no local tests or quest check run. The current head's Check job is still running, so this is not a CI pass or merge-readiness claim.

…recut

# Conflicts:
#	quest/m1/push-to-talk/dtx.md

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found.

Reviewed changes

This run reviewed the four commits since the prior pullfrog review at 1c00d1c, including the fixup for that review's findings, the cluster-routing milestone move, and two merges of main.

  • Settled the prior findings — quest/m2/recut-held.md now names drop-set and explains it moves as a single quest when unclaimed, both receive-windows-evicted paths print quest/m2/group-drops.md, and the narrative milestone names were rewritten to later-work wording, with dated decision-prompt labels intentionally kept as records.
  • Moved cluster-routing from m1 to m2 — after main's #7764 landed the route wire and released the claim, the eight-doc epic moved whole; every quest, rs/ doc-comment, and doc pointer now targets m2, m1's held list and recut-held name the remaining seven, and main's new route-wire plan items survive the move intact.
  • Followed announce-takeover's move — the route-wire decision records now link its m2 path.
  • Merged main twice — brought in #7764's route wire and ROUTE_HOLD work, #7985, and #7910 without regressing any main quest content.

Pullfrog  | Fix it ➔ | View workflow run | Using deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found.

Reviewed changes

This run reviewed the single commit since the prior pullfrog review at 861bbc3.

  • Annotated the release-nix-cache decision with its post-re-cut milestone — quest/m3/release-nix-cache.md now reads "m2 (m3 since the 2026-11-05 milestone re-cut)" and keeps its m3/release/cut.md link, so the dated record agrees with where the quest lives and the prior thread is resolved.

Pullfrog  | View workflow run | Using deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏

@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Nov 5, 2026
@moq-bot

moq-bot Bot commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

quest land watch: the merge queue removed this pull request at 46e1dff because it conflicts with main (merge_conflict).

The land fixer works on it in the background, and the watcher re-enqueues it at the back of the queue once it is fixed or judged flaky, or hands it back here with what it needs.

(written by quest land watch)

@moq-bot

moq-bot Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

codex / Codex land fixer note:

The failure log identifies the conflict at line 4:

CONFLICT (modify/delete): quest/m1/api-audit/route/handle.md deleted in HEAD and modified in 46e1dff. Version 46e1dff of quest/m1/api-audit/route/handle.md left in tree.

The PR only updates a link in this file; base deleted it when the implementation landed. Retaining that deletion resolves the conflict mechanically. I tested that resolution locally, then aborted the merge, leaving the PR branch at its pinned head because validation could not pass.

cargo build -p moq-hls -p moq-net -p moq-tokio -p moq-quic -p moq-video passed. bun run --cwd doc check passed, including 139 tests and the site build. The inventory's 18 Python tests and bash -n test/interop/interop.sh passed.

The selected Rust unit and integration suites passed with --test-threads=1, but the Route doctest failed at rs/moq-net/src/model/origin.rs:2939 with error[E0283]: type annotations needed: create_track("catalog.json", Default::default()) cannot infer impl Into<Option<track::Info>>. This file is identical to base. Fixing this compiler error is outside the permitted conflict, formatting, generation, and rename fixes.

The initial parallel Rust run also failed model::track::test::pool_debt_sheds_a_flight and model::track::test::pool_debt_sheds_a_flight_without_its_cached_group; both passed in isolation with the async feature and in the serial suite. A standalone default-feature moq-net test attempt additionally failed with error[E0599]: no method named read_frame found at track.rs:23329. These findings need follow-up separately from the merge conflict.

(written by codex / Codex)

@moq-bot

moq-bot Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

codex / Codex land fixer: After resolving the modify/delete conflict, &#96;cargo test -p moq-hls -p moq-net -p moq-tokio -p moq-quic -p moq-video -- --test-threads=1&#96; failed in the unchanged base's Route doctest (rs/moq-net/src/mo. Recommendation: Fi·x the base Route doctest's ambiguous create_track argument through review, then merge base into this PR retaining the deletion of quest/m1/api-audit/route/handle.md and rerun the checks.

CONFLICT (modify/delete): quest/m1/api-audit/route/handle.md deleted in HEAD and modified in 46e1dffd5b14989b75be1c8058bcbbedbc08f3c9.  Version 46e1dffd5b14989b75be1c8058bcbbedbc08f3c9 of quest/m1/api-audit/route/handle.md left in tree.

(written by codex / Codex)

# Conflicts:
#	quest/m1/api-audit/route/handle.md
@kixelated
kixelated added this pull request to the merge queue Nov 6, 2026

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ℹ️ No critical issues — the merge released api-audit's claim but left its held-claim annotations stale.

Reviewed changes

This run reviewed the merge of main since the prior pullfrog review at 46e1dff, which brought #7806 into the branch.

  • Merged main's route-handle landing — quest/m1/api-audit/route/handle.md is deleted, facts.md arrives byte-identical at its m1 path, and the route epic's Required now names the new quest.
  • Adapted the held-claims follow-up — quest/m2/recut-held.md drops the Route handle blocker because #7806 merged, while its Goal still carries api-audit's remaining work.
  • Carried main's edits through the re-cut paths — announce-takeover's new #7806 PR link and the removal of its Required entry survive at quest/m2/announce-takeover.md, and session.md's edit survives at quest/m2/cluster-routing/routes/session.md.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏

Comment thread quest/m2/README.md
- [Drop set](/quest/m1/drop-set.md) - each cursor judges missing groups against its own budget, so a narrow reader drops promptly and a widening re-offers groups already reported dropped on lite-07 (held in m1 by an open claim)
- [Subscribe ranges](/quest/m2/subscribe-ranges/README.md) - a lite-07 SUBSCRIBE asks for past and live ranges with absolute or relative ends, in either order, and replaces FETCH for multi-group reads (single-group FETCH stays); merged ranges never starve a subscriber; relays fill misses by range, including over moq-transport
- [Address groups by timestamp](/quest/m2/time-addressing/README.md) - group start timestamps replace sequence numbers in the moq-net API and lite-07 wire, while old subscribers, old publishers, and published JS clients keep working
- [A smaller, safer API than release](/quest/m1/api-audit/README.md) - every surface added since release has a consumer or is gone, overlapping operations are collapsed, names mirror across Rust, JS, and the bindings, and every break says how to migrate (held in m1 by an open claim)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#7806 merged, so no open PR claims api-audit any more, yet this line and quest/m1/README.md:25-29 still say it is "held ... by an open claim". The blocker placement is still correct — its remaining breaking work waits for recut-held — so only the claim rationale needs to drop api-audit; the PR description's held list has the same stale entry.

Technical details
# api-audit is no longer claim-held

## Affected sites
- `quest/m2/README.md:176` — `(held in m1 by an open claim)`.
- `quest/m1/README.md:25-29` — "Held here by open claims ... api-audit, datagram-tracks, ...".
- PR description, "Claimed quests left in place" — `api-audit (#7806)`.
- `quest/m2/recut-held.md:33` — the removed `Route handle` blocker line is correct; its Goal still names api-audit's remainder.

## Required outcome
- api-audit is no longer described as claim-held, while it stays an m2 blocker until the follow-up moves it.

## Open questions for the human (optional)
- Since nothing claims api-audit now, should the epic move to m2 in this PR instead of waiting for `recut-held`?

@kixelated kixelated Nov 6, 2026 •

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed that it's stale, but I'm leaving it here so this PR keeps its place in the merge queue. Nothing claims api-audit any more, so recut-held can move the epic to m2 and drop the "held" notes in m1, m2, and the cut gate as soon as it runs. That quest is spawned right after this PR merges.

(Written by Claude Opus 5.5)

@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Nov 6, 2026
@moq-bot

moq-bot Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

quest land watch: the merge queue removed this pull request at 3185701 because it conflicts with main (merge_conflict).

The land fixer works on it in the background, and the watcher re-enqueues it at the back of the queue once it is fixed or judged flaky, or hands it back here with what it needs.

(written by quest land watch)

@moq-bot

moq-bot Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

codex / Codex land fixer note:

The failure log reports:

5: CONFLICT (content): Merge conflict in quest/m0/ci/nix-cache-verify.md
7: CONFLICT (content): Merge conflict in quest/m0/ci/publish-release-only.md
10: CONFLICT (content): Merge conflict in quest/m2/README.md
12: CONFLICT (content): Merge conflict in quest/m2/cluster-routing/routes/README.md
13: CONFLICT (rename/delete): quest/m2/release-nix-cache.md renamed to quest/m3/release-nix-cache.md in 3185701, but deleted in HEAD.
15: Automatic merge failed; fix conflicts and then commit the result.

Local commit d380d52ffb12c1adb19d0eb7158bbb55081f60e4 merges base, preserves the milestone moves and newer base prose/deletion, and maps the newly deferred release publisher quests to m3 with the other post-cut release work.

Passed: quest check (582 documents), bash sh/markdown.sh check, the 18 inventory tests via UV_PYTHON_DOWNLOADS=never uv run --no-project --with pyyaml==6.0.3 python sh/gh/test-inventory.test.py, the inventory validator with the same interpreter, bash -n test/interop/interop.sh, git diff --check, and cargo test -p moq-quic.

cargo test -p moq-hls -p moq-net -p moq-tokio -p moq-video built the packages and passed their unit/integration tests, then failed the moq-net Route doctest. Independently reproduced with cargo test -p moq-net --doc:

error[E0283]: type annotations needed
2939 | let _catalog = route.broadcast().create_track("catalog.json", Default::default())?;
cannot infer type for type parameter impl Into<Option<track::Info>> declared on the method create_track

The failing origin.rs file is identical to base. A compile repair needs a separate reviewed change outside the permitted fixes, so this result is a handback.

(written by codex / Codex)

@moq-bot

moq-bot Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

codex / Codex land fixer: cargo test -p moq-net --doc fails in model::origin_impl::Route (origin.rs:2932): "error[E0283]: type annotations needed"; create_track cannot infer Default::default().. Recommendation: Fi·x the doctest type inference in a reviewed change, then rerun the affected Rust tests; the mechanical merge resolution is committed on pr-7988.

CONFLICT (content): Merge conflict in quest/m0/ci/nix-cache-verify.md
Auto-merging quest/m0/ci/publish-release-only.md
CONFLICT (content): Merge conflict in quest/m0/ci/publish-release-only.md
Auto-merging quest/m1/README.md
Auto-merging quest/m2/README.md
CONFLICT (content): Merge conflict in quest/m2/README.md
Auto-merging quest/m2/cluster-routing/routes/README.md
CONFLICT (content): Merge conflict in quest/m2/cluster-routing/routes/README.md
CONFLICT (rename/delete): quest/m2/release-nix-cache.md renamed to quest/m3/release-nix-cache.md in 3185701db887241fc04c08bf53cc2e2e31d16f4a, but deleted in HEAD.
CONFLICT (modify/delete): quest/m3/release-nix-cache.md deleted in HEAD and modified in 3185701db887241fc04c08bf53cc2e2e31d16f4a.  Version 3185701db887241fc04c08bf53cc2e2e31d16f4a of quest/m3/release-nix-cache.md left in tree.
Automatic merge failed; fix conflicts and then commit the result.

(written by codex / Codex)

Keep the re-cut m2 list, take main's cachix-retire supersession of
release-nix-cache, and move main's newly deferred crates-trusted-publisher
and release-rs-oidc to m3 with the other post-cut release work.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated
kixelated enabled auto-merge November 6, 2026 00:31
@kixelated
kixelated added this pull request to the merge queue Nov 6, 2026

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ℹ️ No critical issues — one placement record still names the pre-re-cut milestone.

Reviewed changes

This run reviewed the merge of main since the prior pullfrog review at 3185701, which brought #7982 and #7928 into the branch.

  • Merged main's quest unblock — cachix-retire arrives as a new m0 quest and absorbs #7662's release-Nix quest, whose quest/m3/release-nix-cache.md and m3 README entry are deleted; nix-cache-verify and publish-release-only now point at the new quest.
  • Re-cut the trusted-publisher pair — main moved crates-trusted-publisher and release-rs-oidc to m2; the re-cut places both in m3 behind the cut, dropping m1's README entries, adding m3's, and repointing every link (bench-publish, moq-e2ee-remove, the cut, each other).
  • Merged main's bench calibration — #7928's rewrite of quest/m1/bench-ci.md, bench/README.md, bench/compare.py, and nightly.yml lands intact, and m1's README summary follows the new goal.
  • Carried the remaining audit edits — cluster-routing/routes/README.md keeps the routing-key clarification at its m2 path, mbx-r2-verify annotates its moved cache quest as "m3 (m2 before the milestone re-cut)", and the m0 flake/interop edits match main.

Verification: every quest link and per-directory README listing resolves at head, every code file main touched in this range is byte-identical, and no conflict markers remain.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏

Comment on lines +21 to +22
✅ move this quest and [Rust releases publish through OIDC](/quest/m3/release-rs-oidc.md)
to m2 behind [the cut](/quest/m3/release/cut.md). The seven crates the cut

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
✅ move this quest and [Rust releases publish through OIDC](/quest/m3/release-rs-oidc.md)
to m2 behind [the cut](/quest/m3/release/cut.md). The seven crates the cut
✅ move this quest and [Rust releases publish through OIDC](/quest/m3/release-rs-oidc.md)
to m3 (m2 before the milestone re-cut) behind [the cut](/quest/m3/release/cut.md). The seven crates the cut

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Leaving this as is: it's a dated decision record, and on 2026-11-05 that milestone was still called m2. The quest's path and the m3 README already show where it lives now, and a push here would pull this PR out of the merge queue.

(Written by Claude Opus 5.5)

@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Nov 6, 2026
@moq-bot

moq-bot Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

quest land watch: the merge queue removed this pull request at 479cc1b because it conflicts with main (merge_conflict).

The land fixer works on it in the background, and the watcher re-enqueues it at the back of the queue once it is fixed or judged flaky, or hands it back here with what it needs.

(written by quest land watch)

# Conflicts:
#	quest/m1/route-swap-keeps-incumbent.md
@kixelated
kixelated enabled auto-merge November 6, 2026 00:54
@kixelated
kixelated added this pull request to the merge queue Nov 6, 2026

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found.

Reviewed changes

This run reviewed the merge of main since the prior pullfrog review at 479cc1b, which brought #7883 and #7956 into the branch.

  • Merged main's socket-endpoint work — #7883's Python socket implementation closes quest/m1/socket/py.md, whose file and README entries the merge drops, while its new quest/m0/test-flakes-2/ietf-wider-fill.md arrives listed under the flake epic and its Rust/JS investigation comments point at existing m0 quests.
  • Kept route-swap-keeps-incumbent retired — #7956 shipped that fix, so the quest file and its m1 bullet are gone and no reference to the path survives anywhere.
  • Adapted main's path edits to the re-cut — bench/README.md, doc/concept/socket.md, test/interop/README.md, and test/interop/interop.sh carry main's new wording with their targets moved to m3 and m4, and quest/m1/socket/README.md differs from main only in those links while carla.md and the flake epic's README are byte-identical.

Verification at 94bde868: every /quest/*.md link resolves (0 broken), every backticked quest path resolves apart from quest/m3/rust2-exporter.md's deliberate references to moq-dev/rust2's own quest tree, every quest doc is listed by the README of its directory, no conflict markers or .orig/.rej remain, and no code file differs from main. The three earlier findings (the restored ## Related section in m1's README, the api-audit held note, and the dated crates-trusted-publisher record) are unchanged, so their threads stay open.

Pullfrog  | Fix it ➔ | View workflow run | Using deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏

@moq-bot

moq-bot Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

codex / Codex land fixer note:

The PR updates a link in a quest that base deleted after completing it. Merging base and retaining that deletion resolves the conflict, but validation cannot pass. The branch has been restored to its pinned head.

Failure log lines 6–10:

CONFLICT (modify/delete): quest/m1/route-swap-keeps-incumbent.md deleted in HEAD and modified in 479cc1b52986886fb8a2e8031130e6f5350ebfd8.  Version 479cc1b52986886fb8a2e8031130e6f5350ebfd8 of quest/m1/route-swap-keeps-incumbent.md left in tree.
Auto-merging quest/m1/socket/README.md
Auto-merging test/interop/README.md
Auto-merging test/interop/interop.sh
Automatic merge failed; fix conflicts and then commit the result.

The build passed for moq-net, moq-hls, moq-tokio, moq-video, and moq-quic. Shell syntax and inventory checks passed. The full package test suite with one test thread passed its unit and integration tests but failed the unchanged base Route doctest: error[E0283]: type annotations needed for create_track("catalog.json", Default::default()) at rs/moq-net/src/model/origin.rs:2939. This requires a separate source/example correction outside the permitted conflict resolution.

Parallel runs also failed model::track::test::pool_debt_sheds_a_flight and model::track::test::pool_debt_sheds_a_flight_without_its_cached_group; both passed with one test thread. Please investigate their concurrency sensitivity.

(written by codex / Codex)

@moq-bot

moq-bot Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

quest land watch: the land fixer's result for 479cc1b was not applied: its head moved to 94bde86 while the fixer ran, and a push by anyone but the land fixer ends the pick.

(written by quest land watch)

Merged via the queue into main with commit 37f8305 Nov 6, 2026
5 of 6 checks passed
@kixelated
kixelated deleted the quest-plan/milestone-recut branch November 6, 2026 01:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant