Skip to content

quest: audit the backlog before the m0-m2 cut, and add the lab bucket - #8637

Merged
kixelated merged 12 commits into
mainfrom
quest-audit/2026-11-12-cut
Nov 14, 2026
Merged

kixelated merged 12 commits into
mainfrom
quest-audit/2026-11-12-cut

Conversation

@kixelated

@kixelated kixelated commented Nov 13, 2026 •

Copy link
Copy Markdown
Collaborator

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-audit read 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.
  • m2 is trimmed to what breaks: the probe epic goes to m3, routes browser-proof to m5, unbounded groups to m3, and additive/docs work plus outbound federation (with its cluster-routing epic) to m1.
  • New m2 quests for shapes the cut would freeze: the mesh grant shape and key budget (moq_auth::mesh publishes 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).
  • Routes epic (quest/m2/cluster-routes):
    • Item 29: a route keeps one sticky down-only flag beside its path (RFC 9234 Only-To-Customer), so the upstream guarantee survives the path rule.
    • Item 30, from BGP/EIGRP prior art: dead-hop reports on a scoped session apply only to that session's routes; holds get a deadline and a stalled announce stream closes the session; three acceptance tests (doubt-timer skew, priority dispute wheel, primary fails and returns).
  • m3/m4/m5 re-ranked: quests with no consumer move m3 → m4; outside-gated work moves to m5; quests with a downstream deployment now waiting move m4 → m3 (Windows capture, HLS player test, mobile interop clients, VA-API render tests, WHIP/WHEP browser test).
  • Deleted (stale, done, or not worth it): recut-held, memory-bench-hang, net-test-subscriber, sim-credit-open, sps-fuzz-h264-reader, quic-dev-dep-path, token-auth-followups, and the three rs2ts sub-quests, among others. git diff --name-status -M lists them all.
  • Per-quest factual fixes (stale PR numbers, moved paths, milestone labels).

Impact

  • No public API or wire changes. Quest documents only, plus link updates in bench/README.md, infra/README.md, rs/moq-quic/README.md, doc/concept/socket.md, and sh/gh/test-inventory.allow, and one note in doc/lib/dart/index.md that iOS is untested.

Alternatives

  • Keeping lab work in m4/m5. It would keep queueing behind cuts it cannot affect.
  • Declaring the link relation in SETUP (RFC 9234's receiver half). Not taken: the grant already tells the accepting side, and it adds wire for a misconfiguration.

Follow-ups

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.md was 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.md keeps main's DRAIN entries and this PR's scoped dead-hop rule. m1/obs-js.md links 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, which scope.md had tracked.

Recommendations taken while away: take main's deletions, keep this PR's audit moves, re-run quest review on 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

Decisions

Settled 2026-11-13 (maintainer, /quest-plan and /quest-iterate):

  • How is the lab ranked? ✅ Rename it to m9 (rejected: keep lab, which ranks first)
  • Which milestones wait for the cut? ✅ m4 and m5 require 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)
  • An earlier milestone waiting on a later one? ✅ Never: "I definitely don't want earlier milestones blocked on later milestones" (rejected: ranking a blocker at its dependents' milestone instead). This reverses this PR's 2026-11-12 choice to keep m2-dependent additive work in m1.
  • The 14 m1 quests that wait on m2? ✅ m3 (rejected: m2, where the cut would wait on them; pulling their 12 breaking m2 blockers into m1)
  • cli-packaging requiring m5? ✅ Pull capture-alsa-link and cpal-alsa-runtime into m3 (rejected: push cli-packaging and nixpkgs-cli to m5)
  • m4/watch-worker requiring the lab's plan? ✅ Pull plan-watch-worker into m4 (rejected: m3; pushing the features to the lab)
  • Where the next cycle's cuts live, given the rule and the gate? ✅ A follow-up quest, 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:

  • What happens to the m2/subscribe-ranges epic 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, and drop_record.rs cover 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 review after each round.

  • Head: 1cbc04f

  • Base: origin/main at 4d2ff8a

  • Reviewer: Codex, gpt-6.1-sol, xhigh effort

  • Session: 01a1d5af-09ab-7ff2-899a-ec96512d07c6, round 8

  • Score: 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

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>

@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. 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, the poll::SendStream ack-hook shape, usage-derived settings, the RTMPS connect options, and first-publish 0.0.x versions. Spot-checks hold: Source::Display(Option<String>), Enrollment { pub token }, pub mod settings, the #[cfg(test)] poll_acked, and 0.1.0 on moq-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, and acceptance.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) and sh/gh/test-inventory.allow repointed 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.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using claude-opus-5-5 | 𝕏

Comment thread quest/m3/subscribe-fills-js.md Resolved
kixelated and others added 3 commits November 13, 2026 08:02
# 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>

@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 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/ to quest/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.md under Required, and cut.md records 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-link and cpal-alsa-runtime moved from m5 to m3, which also fixes the m3 → m5 dependency flagged in the last review. plan-watch-worker moved from the lab to m4, next to its consumer.
  • Settled both earlier threads: the merge from main removed handoff-revival.md, and subscribe-fills-js.md now credits Drop set to #8476.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using claude-opus-5-5 | 𝕏

Comment thread quest/m3/cli-packaging.md Resolved

@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.

ℹ️ 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", and capture-alsa-link.md:32 and cpal-alsa-runtime.md:34 still 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 that quest check will 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.md now points to the new quest instead of an unnamed "follow-up quest", and lists it first under Required. The m3 cut, and through it the m4 and m5 gates, now waits on that m0 decision.

Pullfrog  | Fix it ➔ | View workflow run | Using 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.
pullfrog[bot]
pullfrog Bot previously approved these changes Nov 14, 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. The last open thread is fixed, and the merge from main left 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.md now says the quest stays blocked until the cpal release ships. The "Moved to m5" lines in capture-alsa-link.md and cpal-alsa-runtime.md are now marked as superseded by the 2026-11-13 move back to m3.
  • Resolved the merge from main: the branch now follows main's moves of mutants, quic-sim, and wire-fuzz-coverage to m1, its new audio-playout epic, and its deletion of subscribe-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, and relay-soak's link to perf/relay-allocs now points at m9.

Pullfrog  | View workflow run | Using 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.
pullfrog[bot]
pullfrog Bot previously approved these changes Nov 14, 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. The trimmed subscribe-ranges quest matches the integration suite, and the merge from main left 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.md to [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 under rs/moq-net/tests/integration/. subscribe_ranges.rs has no descending case and group_order.rs does, which matches the gap the quest names.
  • Merged main's deletion of quest/m1/route-inductive.md (#8704): item 28 in cluster-routes/README.md records the reversal, and route-exhaustive-sim.md and quest/m3/route-trace-validation.md no longer link to the deleted quest. Nothing else references it.

Pullfrog  | View workflow run | Using claude-opus-5-5 | 𝕏

@kixelated
kixelated added this pull request to the merge queue Nov 14, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Nov 14, 2026
@moq-bot

moq-bot Bot commented Nov 14, 2026

Copy link
Copy Markdown
Contributor

quest land watch: the merge queue removed this pull request at 8d26f6c because its merge_group build failed (failed_checks).

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.

Queue / Queue (job) failure at step Check:

…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)

@moq-bot

moq-bot Bot commented Nov 14, 2026

Copy link
Copy Markdown
Contributor

codex, gpt-6.1-sol, medium effort land fixer note:

The queue failed container::consumer::tests::gap_in_group_sequence_recovery with "Expected >= 4 frames, got 2" (failure log lines 3437–3454). This PR changes documentation, quest paths, and test-inventory references, without changing the failing test or consumer implementation. The test passed on base, and the complete queue gate passed on a scratch merge with base: all 8,449 Rust tests passed, including this test in 0.011 seconds, alongside the selected lint, format, type, build, JavaScript, tooling, and Dart checks. The original failure took 0.386 seconds; the test uses a 100 ms delay budget without pausing the clock, consistent with timing sensitivity under load. The PR branch remains unchanged. This test is not among the supplied known flaky tests, so no skip was added.

(written by codex, gpt-6.1-sol, medium effort)

@moq-bot

moq-bot Bot commented Nov 14, 2026

Copy link
Copy Markdown
Contributor

codex, gpt-6.1-sol, medium effort land fixer: GitHub refused to re-enqueue 8d26f6c6672edaeeaa194ea26ee288213746c465: GitHub GraphQL error: Pull request has merge conflicts and Pull request not in mergeable state. Recommendation: run /quest-iterate before picking it again.

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>

@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 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 in quest/m2/cluster-routes/README.md now link to #8622 instead of the deleted quest. The branch's item 29 paragraph in scope.md went away with the file. The router does carry the flag: down_only in rs/moq-net/src/route/path.rs, checked by two_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.md at /quest/m5/obs-studio/README.md, which exists.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using claude-opus-5-5 | 𝕏

Comment thread quest/m2/cluster-routes/README.md Resolved
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@kixelated

Copy link
Copy Markdown
Collaborator Author

@pullfrog review this pull request and submit an approving review if it is ready to merge

(Written by Claude Sonnet 5.5 with high)

@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. 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 to RouteHandoff.tla.
  • Added a bullet to quest/m2/cluster-routes/switch.md: RouteHandoff.tla gains 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.

Pullfrog  | View workflow run | Using claude-sonnet-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.

✅ 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 base 12537d1, main has one commit, #8688 (nix bump plus demo/boy, bun.lock, doc/.vitepress/api). It touches no quest/ file and no quest link, and GitHub reports the PR as MERGEABLE.
  • No broken quest links: a checker over every tracked .md file and sh/gh/test-inventory.allow covered 1,071 /quest/... links plus relative and github.com/.../main/quest/ links. It found no broken targets on head or on the base tree. This includes bench/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 repointed vaapi-render-tests and capture-wgc allow entries.
  • Milestone ordering holds: across the 161 quests with a ## Required section, none requires a quest in a later milestone or one that is missing. This matches the rule quest/README.md now states.
  • Deleted quests are unreferenced: git grep at 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, and quest/m0/cut-placement.md give the same account of the m9 lab, the m4/m5 gate on the cut, and the moves out of m2.
  • sh/text.sh passes on head.

Pullfrog  | View workflow run | Using claude-opus-5-5 | 𝕏

@kixelated
kixelated added this pull request to the merge queue Nov 14, 2026
Merged via the queue into main with commit 72fd191 Nov 14, 2026
7 checks passed
@kixelated
kixelated deleted the quest-audit/2026-11-12-cut branch November 14, 2026 11:35
kixelated added a commit that referenced this pull request Nov 14, 2026
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>
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