Repository navigation
quest: audit the backlog before the m0-m2 cut, and add the lab bucket - #8637
Conversation
Re-milestone the backlog so the cut waits only on breaking work, move experiments that touch no published API into quest/lab, delete quests that no longer pay for themselves, and record the maintainer's pre-cut decisions: the down-only route flag, routing prior art, mesh grant shape, API fences, and first-publish versions. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
ℹ️ No critical issues. Two quest notes contradict the rest of the tree; suggestions are inline.
Reviewed changes
I reviewed the whole quest-tree audit. I ran a link check over every tracked file against base 6aa4f9c. It found no new broken quest/ links: the only new hit is the cross-repo rust2 path in quest/m5/rs2ts-js.md, which is not a link, and the missing targets outside quest/ are the two links the PR body already names plus test fixtures. Nothing still references a deleted quest. I also checked the code claims in the new m1 and m2 quests against the source.
quest/lab/bucket: a new home outside the milestone order for internal-only work. The perf, kio-channel-contention, stream-transports, and video-quality epics, plus the uring and bench quests, move here.- m2 trimmed to breaking work: the probe epic goes to m3, routes browser-proof to m5, unbounded groups to m3, and additive/docs work plus outbound federation go to m1. The mesh and byte-stream epics move from m3 to m1.
- New m2 fences before first publish: the mesh grant shape, enrollment
#[non_exhaustive], capture selections, thepoll::SendStreamack-hook shape, usage-derived settings, the RTMPS connect options, and first-publish0.0.xversions. Spot-checks hold:Source::Display(Option<String>),Enrollment { pub token },pub mod settings, the#[cfg(test)]poll_acked, and0.1.0onmoq-rtsp,moq-bench, and@moq/stats. - Routes epic items 29 and 30: a sticky down-only flag (RFC 9234 OTC), dead-hop reports scoped to the session they arrived on, hold deadlines, and three prior-art acceptance fixtures. These carry through
scope.md,switch.md, andacceptance.md. - Re-ranking and deletions across m3, m4, and m5, with a new m1 fix split from the auth session index (
token-count-signing-input.md) andsh/gh/test-inventory.allowrepointed at the moved quests.
ℹ️ An m3 quest now requires an m5 quest
quest/m3/cli-packaging.md lists quest/m5/capture-alsa-link.md under Required, so this m3 quest can't start until the m5 one finishes. Its new Waiting entry already asks the maintainer to choose between A, B, C, and D. Until someone picks, quest unblocked will rank the quest as blocked behind work in a later milestone. If B (split by OS) is the expected answer, settling it in this PR would fix the ordering.
claude-opus-5-5 | 𝕏
# Conflicts: # quest/m2/cluster-routes/handoff-revival.md
…ff later milestones No quest requires one in a later milestone: the m1 quests that waited on m2 move to m3, cli-packaging's m5 blockers join it in m3, and the watch-worker plan joins its consumer in m4. lab ranked ahead of m0 by name, so it becomes m9. m4 and m5 require the release cut, so spare capacity goes to m0 to m3 and then the lab until the cut lands. Also credits Drop set to #8476. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
ℹ️ No critical issues. One small leftover from moving the capture chain back to m3; the suggestion is inline.
Reviewed changes
I reviewed the merge of main (65398605d) and 08d72ed. A link check over every tracked Markdown file finds no broken quest/ links, and nothing still points at quest/lab/ or at the old m1 or m5 paths. A scan of every ## Required section confirms the new rule: no quest requires one in a later milestone.
- Renamed
quest/lab/toquest/m9/, so the lab ranks last instead of ahead of m0.infra/README.md,rs/moq-quic/README.md, and every quest link follow the rename. - Gated m4 and m5 on the release cut: both milestone READMEs now list
quest/m3/release/cut.mdunderRequired, andcut.mdrecords the open question of where the next cycle's cuts live. - Moved quests off later milestones: the 14 m1 quests that wait on m2 work (including the whole cluster-routing and mesh epics) moved to m3.
capture-alsa-linkandcpal-alsa-runtimemoved from m5 to m3, which also fixes the m3 → m5 dependency flagged in the last review.plan-watch-workermoved from the lab to m4, next to its consumer. - Settled both earlier threads: the merge from
mainremovedhandoff-revival.md, andsubscribe-fills-js.mdnow credits Drop set to #8476.
claude-opus-5-5 | 𝕏
There was a problem hiding this comment.
ℹ️ The new commit raises no new issues. The thread from the last review, on
quest/m3/cli-packaging.md:73, is still open: option (A) still says this quest follows capture-alsa-link "into m5", andcapture-alsa-link.md:32andcpal-alsa-runtime.md:34still have their unmarked "Moved to m5" lines.
Reviewed changes
I reviewed d8669c1 against 08d72ed. The new Required edge points from the m3 cut to an m0 quest, so it points to an earlier milestone and keeps the rule that no quest requires one in a later milestone. Nothing else links to cut-placement.md yet, and it has no Required of its own, so it adds no cycle.
- Added
quest/m0/cut-placement.md: a quest to settle with the maintainer where each cycle's cuts live and which milestones each cut's gate covers. It lists three placement rules thatquest checkwill enforce: a cut lives in or after the last milestone it waits on, a cut can't require the milestone or epic that holds it, and a milestone a cut gates can't hold that cut. - Wired the release cut to it:
quest/m3/release/cut.mdnow points to the new quest instead of an unnamed "follow-up quest", and lists it first underRequired. The m3 cut, and through it the m4 and m5 gates, now waits on that m0 decision.
claude-opus-5-5 | 𝕏
Deletions by finished PRs win (reconnect-predecessor-status, lite07-fetch); the subscribe-ranges epic becomes its own quest; links follow the m1/m9 moves.
There was a problem hiding this comment.
✅ No new issues found. The last open thread is fixed, and the merge from
mainleft no broken quest links or ordering violations.
Reviewed changes
I reviewed the merge of main (6fb5e2f) and 3c5a3ee against d8669c1. A link check over every tracked Markdown file finds no broken /quest/... links and no remaining quest/lab references. A scan of every ## Required section finds no quest that requires one in a later milestone, and no Required target that is missing.
- Settled the cpal leftovers: option (A) in
quest/m3/cli-packaging.mdnow says the quest stays blocked until the cpal release ships. The "Moved to m5" lines incapture-alsa-link.mdandcpal-alsa-runtime.mdare now marked as superseded by the 2026-11-13 move back to m3. - Resolved the merge from
main: the branch now followsmain's moves ofmutants,quic-sim, andwire-fuzz-coverageto m1, its newaudio-playoutepic, and its deletion ofsubscribe-ranges/lite07-fetch.md. The links that pointed at those paths (miri-seeds-tsan,resume-redesign,audio-bufferbloat-av,subscribe-fills-js,js-byte-holes) were updated, andrelay-soak's link toperf/relay-allocsnow points at m9.
claude-opus-5-5 | 𝕏
route-inductive deleted by main wins; trace-validation and exhaustive-sim keep the audit's m3 placement with main's dropped-invariant wording.
…egration suite covers" This reverts commit 3c6eea3.
There was a problem hiding this comment.
✅ No new issues found. The trimmed
subscribe-rangesquest matches the integration suite, and the merge frommainleft no broken quest links or ordering violations.
Reviewed changes
I reviewed the merge of main (4855260), the delete-and-revert pair (3c6eea3, 69f433a), and 8d26f6c, all against 3c5a3ee. A link check over every tracked Markdown file finds no broken /quest/... links. A scan of every ## Required section finds no quest that requires one in a later milestone.
- Trimmed
quest/m2/subscribe-ranges/README.mdto[S] Subscribe ranges end to end: one missing integration test that combines a relay cache with holes, a past range wider than the cache plus the live edge, both orders, and both lite-07 and moq-transport. The five test files it credits (subscribe_ranges.rs,range_read.rs,group_order.rs,range_fill.rs,drop_record.rs) all exist underrs/moq-net/tests/integration/.subscribe_ranges.rshas no descending case andgroup_order.rsdoes, which matches the gap the quest names. - Merged
main's deletion ofquest/m1/route-inductive.md(#8704): item 28 incluster-routes/README.mdrecords the reversal, androute-exhaustive-sim.mdandquest/m3/route-trace-validation.mdno longer link to the deleted quest. Nothing else references it.
claude-opus-5-5 | 𝕏
|
quest land watch: the merge queue removed this pull request at 8d26f6c because its 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.
…tter corpus > reorder > is a trace of equal-length clocks [0.02ms]
moq-doc test: (pass) audio jitter corpus > reorder > arrives in a monotonic order [0.22ms]
moq-doc test: (pass) audio jitter corpus > reorder > names a target for the first frame
moq-doc test: (pass) audio jitter corpus > reorder > reports every target as a change
moq-doc test: (pass) audio jitter corpus > backlog > matches the checked-in file [0.06ms]
moq-doc test: (pass) audio jitter corpus > backlog > is a trace of equal-length clocks
moq-doc test: (pass) audio jitter corpus > backlog > arrives in a monotonic order [0.35ms]
moq-doc test: (pass) audio jitter corpus > backlog > names a target for the first frame
moq-doc test: (pass) audio jitter corpus > backlog > reports every target as a change
moq-doc test: (pass) audio jitter corpus > idle > matches the checked-in file [0.04ms]
moq-doc test: (pass) audio jitter corpus > idle > is a trace of equal-length clocks
moq-doc test: (pass) audio jitter corpus > idle > arrives in a monotonic order [0.18ms]
moq-doc test: (pass) audio jitter corpus > idle > names a target for the first frame
moq-doc test: (pass) audio jitter corpus > idle > reports every target as a change [0.01ms]
moq-doc test: (pass) audio jitter corpus > silence > matches the checked-in file [0.06ms]
moq-doc test: (pass) audio jitter corpus > silence > is a trace of equal-length clocks
moq-doc test: (pass) audio jitter corpus > silence > arrives in a monotonic order [0.31ms]
moq-doc test: (pass) audio jitter corpus > silence > names a target for the first frame
moq-doc test: (pass) audio jitter corpus > silence > reports every target as a change [0.01ms]
moq-doc test: (pass) audio jitter corpus > tunein > matches the checked-in file [0.05ms]
moq-doc test: (pass) audio jitter corpus > tunein > is a trace of equal-length clocks
moq-doc test: (pass) audio jitter corpus > tunein > arrives in a monotonic order [0.25ms]
moq-doc test: (pass) audio jitter corpus > tunein > names a target for the first frame
moq-doc test: (pass) audio jitter corpus > tunein > reports every target as a change
moq-doc test: (pass) audio jitter corpus > spike > matches the checked-in file [0.07ms]
moq-doc test: (pass) audio jitter corpus > spike > is a trace of equal-length clocks
moq-doc test: (pass) audio jitter corpus > spike > arrives in a monotonic order [0.37ms]
moq-doc test: (pass) audio jitter corpus > spike > names a target for the first frame
moq-doc test: (pass) audio jitter corpus > spike > reports every target as a change
moq-doc test: (pass) audio jitter corpus > straggler > matches the checked-in file [0.06ms]
moq-doc test: (pass) audio jitter corpus > straggler > is a trace of equal-length clocks
moq-doc test: (pass) audio jitter corpus > straggler > arrives in a monotonic order [0.25ms]
moq-doc test: (pass) audio jitter corpus > straggler > names a target for the first frame
moq-doc test: (pass) audio jitter corpus > straggler > reports every target as a change
moq-doc test: (pass) audio jitter corpus > fixed > matches the checked-in file [0.02ms]
moq-doc test: (pass) audio jitter corpus > fixed > is a trace of equal-length clocks
moq-doc test: (pass) audio jitter corpus > fixed > arrives in a monotonic order [0.10ms]
moq-doc test: (pass) audio jitter corpus > fixed > names a target for the first frame
moq-doc test: (pass) audio jitter corpus > fixed > reports every target as a change
moq-doc test:
moq-doc test: ::endgroup::
moq-doc test:
moq-doc test: 139 pass
moq-doc test: 0 fail
moq-doc test: 17493 expect() calls
moq-doc test: Ran 139 tests across 4 files. [5.12s]
moq-doc test: Exited with code 0
js: test finished in 16.49s
##[endgroup]
##[group]check markdown
##[endgroup]
##[group]check gh
python3 sh/version.py
shared version: disabled until the release cut runs just version
actionlint
zizmor --offline --quiet .github
�[33m WARN�[0m �[2mzizmor::registry::input�[0m�[2m:�[0m failed to validate file://.github/workflows/dependabot.yml as dependabot config: input does not match expected validation schema
�[32mNo findings to report. Good job!�[39m (�[1m�[93m30�[39m ignored, �[93m120�[39m suppressed�[0m)
sh/gh/alert.sh check-coverage
alert.yml watches all 35 alertable workflows
bun test ./sh/gh/alert.test.ts
bun test v1.4.2 (744846f84)
##[group]sh/gh/alert.test.ts:
(pass) Discord alert policy for pull_request [0.29ms]
(pass) Discord alert policy for pull_request_target [0.13ms]
(pass) Discord alert policy for push [0.14ms]
(pass) Discord alert policy for schedule [0.03ms]
(pass) Discord alert policy for workflow_dispatch [0.12ms]
(pass) Discord alert policy for workflow_run [0.04ms]
(pass) cron workflows only alert on scheduled failures [18.07ms]
(pass) ordinary CI never subscribes to Discord alerts [0.21ms]
(pass) alert coverage excludes CI-only workflows and retains release and nightly workflows [100.59ms]
##[endgroup]
9 pass
0 fail
232 expect() calls
Ran 9 tests across 1 file. [136.00ms]
bun sh/gh/check-runs.ts
python3 sh/gh/test-inventory.py
python3 bench/relay.test.py
.......
----------------------------------------------------------------------
Ran 7 tests in 2.521s
OK
##[endgroup]
##[group]test gh
python3 sh/version.test.py
.......
----------------------------------------------------------------------
Ran 7 tests in 33.598s
OK
python3 sh/local.test.py
.........
----------------------------------------------------------------------
Ran 9 tests in 0.436s
OK
python3 test/smoke/runner.test.py
.......
----------------------------------------------------------------------
Ran 7 tests in 1.680s
OK
python3 sh/coverage.test.py
......
----------------------------------------------------------------------
Ran 6 tests in 3.325s
OK
python3 sh/size/report.test.py
.............
----------------------------------------------------------------------
Ran 13 tests in 0.991s
OK
python3 sh/size/release.test.py
...
----------------------------------------------------------------------
Ran 3 tests in 0.444s
OK
python3 sh/size/nightly.test.py
.
----------------------------------------------------------------------
Ran 1 test in 0.220s
OK
python3 bench/compare.test.py
..................
----------------------------------------------------------------------
Ran 18 tests in 0.522s
OK
python3 bench/summary.test.py
...
----------------------------------------------------------------------
Ran 3 tests in 0.333s
OK
python3 bench/profile.test.py
..................................s..
----------------------------------------------------------------------
Ran 37 tests in 3.973s
OK (skipped=1)
python3 bench/fanout.test.py
....
----------------------------------------------------------------------
Ran 4 tests in 0.005s
OK
python3 bench/lock.test.py
....
----------------------------------------------------------------------
Ran 4 tests in 0.345s
OK
python3 bench/local.test.py
./nix/store/xahxrjs30p3mw0a42bqg9ikgkikskw8m-python3-3.14.8/lib/python3.14/unittest/case.py:704: ResourceWarning: unclosed file <_io.TextIOWrapper name=4 encoding='UTF-8'>
function, args, kwargs = self._cleanups.pop()
ResourceWarning: Enable tracemalloc to get the object allocation traceback
.
----------------------------------------------------------------------
Ran 2 tests in 0.245s
OK
python3 sh/gh/gst-formula.test.py
...
----------------------------------------------------------------------
Ran 3 tests in 0.029s
OK
python3 sh/changed.test.py
..................
----------------------------------------------------------------------
Ran 18 tests in 5.026s
OK
python3 sh/large-files.test.py
.......
----------------------------------------------------------------------
Ran 7 tests in 4.846s
OK
python3 sh/migrate.test.py
.....
----------------------------------------------------------------------
Ran 5 tests in 1.859s
OK
python3 sh/text.test.py
........
----------------------------------------------------------------------
Ran 8 tests in 1.632s
OK
python3 sh/coverage-tables.test.py
........
----------------------------------------------------------------------
Ran 8 tests in 0.853s
OK
python3 sh/tlc.test.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.027s
OK
python3 sh/dispatch-query.test.py
.............error: recipe `test` was terminated on line 84 by signal 15
##[endgroup]
##[error]ci: test rs failed
##[error]Process completed with exit code 100.
##[group]Run actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9
with:
name: cargo-timings
path: target/cargo-timings/cargo-timing-*.html
if-no-files-found: ignore
retention-days: 14
compression-level: 6
overwrite: false
include-hidden-files: false
archive: true
env:
BASE: 2360ab7e65920cbfade7f8a5366564dcd78f64de
CHECK_FAIL_FAST: 1
NEXTEST_TEST_THREADS: 24
MBX_CACHE_LINKS: 1
MBX_REMOTE_URL:
##[endgroup]
With the provided path, there will be 2 files uploaded
Artifact name is valid!
Root directory input is valid!
Uploading artifact: cargo-timings.zip
Beginning upload of artifact content to blob storage
Uploaded bytes 142961
Finished uploading artifact content to blob storage!
SHA256 digest of uploaded artifact is 13545e9ab079c1692a7d60b03c6c3517f3a96f657b6dae29a211dc53bf40bfc2
Finalizing artifact upload
Artifact cargo-timings successfully finalized. Artifact ID 14099625119
Artifact cargo-timings has been successfully uploaded! Final size is 142961 bytes. Artifact ID is 14099625119
Artifact download URL: https://github.com/moq-dev/moq/actions/runs/43557751216/artifacts/14099625119
Post job cleanup.
##[start-action display=Run jdx/mr-boxington-action@88acf2bb50552c7c508cbac13e5f8c576b95b1de;id=__dffc7336-8b96-45fe-b842-e2861274cbff.mbx]
##[end-action id=__dffc7336-8b96-45fe-b842-e2861274cbff.mbx;outcome=skipped;conclusion=skipped;duration_ms=0]
Post job cleanup.
[command]/nix/store/i2m3w4ly2w6grrmk1j59rb7zp09bssia-git-2.56.0/bin/git version
git version 2.56.0
Temporarily overriding HOME='/var/cache/github-runner-work/_temp/b0ca7f23-a07d-4ceb-9232-4285d3cc99d8' before making global git config changes
Adding repository directory to the temporary git global config as a safe directory
[command]/nix/store/i2m3w4ly2w6grrmk1j59rb7zp09bssia-git-2.56.0/bin/git config --global --add safe.directory /var/cache/github-runner-work/moq/moq
Removing SSH command configuration
[command]/nix/store/i2m3w4ly2w6grrmk1j59rb7zp09bssia-git-2.56.0/bin/git config --local --name-only --get-regexp core\.sshCommand
[command]/nix/store/i2m3w4ly2w6grrmk1j59rb7zp09bssia-git-2.56.0/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :"
Removing HTTP extra header
[command]/nix/store/i2m3w4ly2w6grrmk1j59rb7zp09bssia-git-2.56.0/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader
[command]/nix/store/i2m3w4ly2w6grrmk1j59rb7zp09bssia-git-2.56.0/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :"
Removing includeIf entries pointing to credentials config files
[command]/nix/store/i2m3w4ly2w6grrmk1j59rb7zp09bssia-git-2.56.0/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir:
[command]/nix/store/i2m3w4ly2w6grrmk1j59rb7zp09bssia-git-2.56.0/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url
A job completed hook has been configured by the self-hosted runner administrator
##[group]Run '/nix/store/3wq9f25mz2ksqrx6zs5nq522386djzw1-ci-cache-gc.sh/bin/ci-cache-gc.sh'
shell: /nix/store/lfm00fnq66xfgbn099vqckabyl5jllz6-bash-interactive-5.3p20/bin/bash --noprofile --norc -e -o pipefail {0}
##[endgroup]
evicted 152 objects and 0 action results (6.2 GiB logical); 50.0 GiB logical remain
dropped 2 stale checkout records
dropped 13 session event streams
Cleaning up orphan processes
(written by quest land watch) |
|
codex, gpt-6.1-sol, medium effort land fixer note:
(written by codex, gpt-6.1-sol, medium effort) |
|
codex, gpt-6.1-sol, medium effort land fixer: OK
python3 sh/large-files.test.py
.......
----------------------------------------------------------------------
Ran 7 tests in 4.846s
OK
python3 sh/migrate.test.py
.....
----------------------------------------------------------------------
Ran 5 tests in 1.859s
OK
python3 sh/text.test.py
........
----------------------------------------------------------------------
Ran 8 tests in 1.632s
OK
python3 sh/coverage-tables.test.py
........
----------------------------------------------------------------------
Ran 8 tests in 0.853s
OK
python3 sh/tlc.test.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.027s
OK
python3 sh/dispatch-query.test.py
.............error: recipe `test` was terminated on line 84 by signal 15
##[endgroup]
##[error]ci: test rs failed
##[error]Process completed with exit code 100.
##[group]Run actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9
with:
name: cargo-timings
path: target/cargo-timings/cargo-timing-*.html
if-no-files-found: ignore
retention-days: 14
compression-level: 6
overwrite: false
include-hidden-files: false
archive: true
env:
BASE: 2360ab7e65920cbfade7f8a5366564dcd78f64de
CHECK_FAIL_FAST: 1
NEXTEST_TEST_THREADS: 24
MBX_CACHE_LINKS: 1
MBX_REMOTE_URL:
##[endgroup]
With the provided path, there will be 2 files uploaded
Artifact name is valid!
Root directory input is valid!
Uploading artifact: cargo-timings.zip
Beginning upload of artifact content to blob storage
Uploaded bytes 142961
Finished uploading artifact content to blob storage!
SHA256 digest of uploaded artifact is 13545e9ab079c1692a7d60b03c6c3517f3a96f657b6dae29a211dc53bf40bfc2
Finalizing artifact upload
Artifact cargo-timings successfully finalized. Artifact ID 14099625119
Artifact cargo-timings has been successfully uploaded! Final size is 142961 bytes. Artifact ID is 14099625119
Artifact download URL: https://github.com/moq-dev/moq/actions/runs/43557751216/artifacts/14099625119
Post job cleanup.
##[start-action display=Run jdx/mr-boxington-action@88acf2bb50552c7c508cbac13e5f8c576b95b1de;id=__dffc7336-8b96-45fe-b842-e2861274cbff.mbx]
##[end-action id=__dffc7336-8b96-45fe-b842-e2861274cbff.mbx;outcome=skipped;conclusion=skipped;duration_ms=0]
Post job cleanup.
[command]/nix/store/i2m3w4ly2w6grrmk1j59rb7zp09bssia-git-2.56.0/bin/git version
git version 2.56.0
Temporarily overriding HOME='/var/cache/github-runner-work/_temp/b0ca7f23-a07d-4ceb-9232-4285d3cc99d8' before making global git config changes
Adding repository directory to the temporary git global config as a safe directory
[command]/nix/store/i2m3w4ly2w6grrmk1j59rb7zp09bssia-git-2.56.0/bin/git config --global --add safe.directory /var/cache/github-runner-work/moq/moq
Removing SSH command configuration
[command]/nix/store/i2m3w4ly2w6grrmk1j59rb7zp09bssia-git-2.56.0/bin/git config --local --name-only --get-regexp core\.sshCommand
[command]/nix/store/i2m3w4ly2w6grrmk1j59rb7zp09bssia-git-2.56.0/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :"
Removing HTTP extra header
[command]/nix/store/i2m3w4ly2w6grrmk1j59rb7zp09bssia-git-2.56.0/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader
[command]/nix/store/i2m3w4ly2w6grrmk1j59rb7zp09bssia-git-2.56.0/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :"
Removing includeIf entries pointing to credentials config files
[command]/nix/store/i2m3w4ly2w6grrmk1j59rb7zp09bssia-git-2.56.0/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir:
[command]/nix/store/i2m3w4ly2w6grrmk1j59rb7zp09bssia-git-2.56.0/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url
A job completed hook has been configured by the self-hosted runner administrator
##[group]Run '/nix/store/3wq9f25mz2ksqrx6zs5nq522386djzw1-ci-cache-gc.sh/bin/ci-cache-gc.sh'
shell: /nix/store/lfm00fnq66xfgbn099vqckabyl5jllz6-bash-interactive-5.3p20/bin/bash --noprofile --norc -e -o pipefail {0}
##[endgroup]
evicted 152 objects and 0 action results (6.2 GiB logical); 50.0 GiB logical remain
dropped 2 stale checkout records
dropped 13 session event streams
Cleaning up orphan processes
== The pull request's own checks on 8d26f6c6672edaeeaa194ea26ee288213746c465 ==
Its own CI ran these on the pull request, not in the merge queue. They are a signal only, and gate nothing.
skipped optional Dependabot / Request landing (https://github.com/moq-dev/moq/actions/runs/43553441230/job/132320847866)
skipped required Queue / Queue (https://github.com/moq-dev/moq/actions/runs/43553445015/job/132320858904)
skipped optional Queue / Report Queue (https://github.com/moq-dev/moq/actions/runs/43553445015/job/132320858362)
skipped optional CodeRabbit (https://coderabbit.ai?utm_source=cr_app&utm_medium=github)
success optional pullfrog (https://github.com/moq-dev/moq/actions/runs/43553444676)
(written by codex, gpt-6.1-sol, medium effort) |
scope.md is deleted: #8622 built the router with the down-only flag, so epic item 29 links the code. switch.md keeps main's DRAIN entries and this PR's scoped dead-hop rule. obs-js links obs-studio at m5, where this PR moved it. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
ℹ️ No critical issues. The merge resolution leaves one routes-epic claim behind the code. The suggestion is inline.
Reviewed changes
I reviewed the merge of main (cbbfc51) against 8d26f6c. A link check over every tracked Markdown file finds no broken /quest/... links, and nothing still links to the deleted cluster-routes/scope.md.
- Merged #8622's path router and the deletion of
scope.md: items 28 and 29 inquest/m2/cluster-routes/README.mdnow link to #8622 instead of the deleted quest. The branch's item 29 paragraph inscope.mdwent away with the file. The router does carry the flag:down_onlyinrs/moq-net/src/route/path.rs, checked bytwo_uplinks_never_carry_cdn_transit. - Combined the dead-hop bullet in
switch.md:main's DRAIN sentence and the branch's item 30 scoped-session sentence now read as one bullet, with no duplicated lines. - Repointed
quest/m1/obs-js.mdat/quest/m5/obs-studio/README.md, which exists.
claude-opus-5-5 | 𝕏
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
@pullfrog review this pull request and submit an approving review if it is ready to merge (Written by Claude Sonnet 5.5 with high) |
There was a problem hiding this comment.
✅ No new issues found. The routes-epic claim from the last review is fixed.
Reviewed changes
I reviewed 1cbc04f against cbbfc51. It touches two quest files and changes no code.
- Reworded item 29 in
quest/m2/cluster-routes/README.md: the router (route/path.rs, #8622) now carries the flag and its export check. The switch is named as the owner of adding both toRouteHandoff.tla. - Added a bullet to
quest/m2/cluster-routes/switch.md:RouteHandoff.tlagains the down-only flag and its export rule, so the model checks the rule the wire carries. This gives the TLA+ change the owner the earlier thread asked for.
claude-sonnet-5-5 | 𝕏
There was a problem hiding this comment.
✅ No new issues found. The head is unchanged since the last approval.
main's only new commit touches no quest paths, and the tree still passes the link, ordering, and text checks.
Reviewed changes
I re-checked head 1cbc04f against current main (4d2ff8a). This run did not re-read all ~8,000 diff lines. It relied on mechanical checks across the whole tree, a re-read of the files that define the cut gate, and the earlier commit-by-commit reviews of this branch, whose threads are all resolved.
- No drift from
main: since the branch's merge base12537d1,mainhas one commit, #8688 (nix bump plusdemo/boy,bun.lock,doc/.vitepress/api). It touches noquest/file and no quest link, and GitHub reports the PR asMERGEABLE. - No broken quest links: a checker over every tracked
.mdfile andsh/gh/test-inventory.allowcovered 1,071/quest/...links plus relative andgithub.com/.../main/quest/links. It found no broken targets on head or on the base tree. This includesbench/README.md→m5/bench-transport-sweep.md,doc/concept/socket.md→m3/unbounded-groups,infra/README.md→m9/video-quality/harness.md,rs/moq-quic/README.md→m9/perf/quic-lock-contention.md, and the repointedvaapi-render-testsandcapture-wgcallow entries. - Milestone ordering holds: across the 161 quests with a
## Requiredsection, none requires a quest in a later milestone or one that is missing. This matches the rulequest/README.mdnow states. - Deleted quests are unreferenced:
git grepat head finds no remaining reference to any of the 16 quest files deleted relative to the merge base. - Gate docs agree with each other:
quest/README.md,quest/m1/README.md,quest/m2/README.md,quest/m9/README.md, andquest/m0/cut-placement.mdgive the same account of the m9 lab, the m4/m5 gate on the cut, and the moves out of m2. sh/text.shpasses on head.
claude-opus-5-5 | 𝕏
Brings in #8637, #8672, #8699, #8673 and #8722. #8672's refusal rule is ported onto the path wire. A Route Offer now spells its path first, so a receiver that refuses the rest of the offer still learns the path a later DEAD may name. Each DEAD Moved offer is sized, so one refused offer leaves the next readable. A refused route keeps its Route ID and its path, follows DEADs like any other route, and files again with its last floor's claims once a usable offer arrives. A prefix that no believed route certifies now shows what the selected live route carries. A sender refusing a claim, which sends no floors while it holds one, then still shows its other claims. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Problem
The m0-m2 cut (
main→release) waits on every quest in m0, m1, and m2. The backlog had rotted: additive work sat in m2 and held the cut, experiments that touch no published API were queued behind cuts they cannot affect, some quests had no consumer left, and a few pre-cut API shapes were about to be frozen by a first publish.Approach
A
/quest-auditread all ~505 quests against the code and the downstream quest trees, and the maintainer settled each move in three rounds plus a routing prior-art round.quest/lab/: a new bucket beside the milestones for internal-only work (unpublished crates, harnesses, benchmarks, models). A cut never waits on it. The perf, kio-channel-contention, stream-transports, and video-quality epics moved there.moq_auth::meshpublishes for the first time), auth key validation, the RTMPS connect signature, usage's derived settings (merging two m4 quests), first-publish versions, and three API fences (mesh enrollment, capture selections, ack-hook trait).quest/m2/cluster-routes):upstreamguarantee survives the path rule.git diff --name-status -Mlists them all.Impact
bench/README.md,infra/README.md,rs/moq-quic/README.md,doc/concept/socket.md, andsh/gh/test-inventory.allow, and one note indoc/lib/dart/index.mdthat iOS is untested.Alternatives
Follow-ups
mainwere already broken before this PR:.github/workflows/queue.yml→quest/m0/ci/land.md, andtest/ietf-conformance/README.md→quest/m1/interop-coverage/runner-cases.md.Iteration 2026-11-14 (third merge, maintainer away)
Merged main to clear a conflict that failed re-enqueue (the earlier merge_group failure was the flaky
container::consumer::tests::gap_in_group_sequence_recovery, "Expected >= 4 frames, got 2"; no quest owns it, and it uses a 100 ms delay budget without pausing the tokio clock). Conflicts:m2/cluster-routes/scope.mdwas deleted by #8622, which built the router with the down-only flag, so the deletion won and epic item 29 links the code instead.switch.mdkeeps main's DRAIN entries and this PR's scoped dead-hop rule.m1/obs-js.mdlinks obs-studio at m5, where this PR moved it. Unchanged from this PR's intent; note the TLA model (RouteHandoff.tla) still lacks the down-only flag item 29 asked for, whichscope.mdhad tracked.Recommendations taken while away: take main's deletions, keep this PR's audit moves, re-run
quest reviewon the merged head.Iteration 2026-11-14 (second merge)
Merged main again: #8704 deleted
m1/route-inductive, so the deletion won and the two mentions follow main's wording (invariant dropped).Iteration 2026-11-14
Merged main (conflicts: deleted reconnect-predecessor-status and lite07-fetch, whose PRs #8595 and #8616 finished them, so the deletions won; kept both sides of the m1 README, quic-sim, and miri-seeds-tsan edits; subscribe-ranges lost its last child and was trimmed to its one missing test (see Decisions); links follow the m1 and m9 moves).
Iteration 2026-11-13
quest/m9/.questorders milestones by name, solabwould have ranked ahead of m0; as m9 it ranks last, is never gated, and leaves m6 to m8 free for the shifts after a cut.quest checkrule for this). The 14 m1 quests that waited on m2 move to m3: buffered-ascending, export-order, receive-windows-evicted, route-trace-validation, routing-guide, subscribe-fills-js, time-addressing-guide, and the cluster-routing and mesh epics whole. cli-packaging's two m5 blockers (capture-alsa-link and the cpal wait) move to m3, and the watch-worker plan moves from the lab to m4, next to its consumer. This replaces the closed quest: move quests that required a later milestone #8645.Decisions
Settled 2026-11-13 (maintainer, /quest-plan and /quest-iterate):
lab, which ranks first)m3/release/cut.md(rejected: m3 to m5 requiring m0, m1, and m2, which lifts only when they empty; splitting m3 so it can be gated)quest/m0/cut-placement.md, added here and required by the cut (rejected: settling it in this PR).Settled 2026-11-13 (maintainer, /quest-complete), carried out 2026-11-14:
m2/subscribe-rangesepic once its last child finished? ✅ Trim it to what the suite lacks (rejected: delete outright, which the maintainer allowed only if the tests cover it).subscribe_ranges.rs,group_order.rs,range_read.rs,range_fill.rs, anddrop_record.rscover its end-to-end test only in pieces; none combines a relay cache with holes, a wide past range plus live, both orders, and lite-07 plus moq-transport, so the quest is now that one[S]test.Models
Size: L
Implementer: Claude Code, claude-opus-5-5, unknown effort (iterate, M)
Implementer: Claude Code, claude-sonnet-5-5, unknown effort (iterate, S)
Implementer: Claude Code, claude-sonnet-5-5, high effort (merge, S)
(Written by Claude Opus 5.5)
🤖 Generated with Claude Code
(Written by Claude Sonnet 5.5 with high)
Review
Rewritten by
quest reviewafter each round.Head: 1cbc04f
Base: origin/main at 4d2ff8a
Reviewer: Codex, gpt-6.1-sol, xhigh effort
Session:
01a1d5af-09ab-7ff2-899a-ec96512d07c6, round 8Score: 10/10,
The incremental change assigns the missing down-only model work to the switch quest and introduces no actionable defects.Rounds: 8; findings 1 (medium 1): fixed 1, refuted 0, open 0
Findings: none