Repository navigation
refactor(net): drop JS moq-transport FETCH serving - #8445
Conversation
Quest-Claim: 44d57fd31b39abaa
…ting js/net answers every moq-transport FETCH with NOT_SUPPORTED, so a draft-18 Next Object subscription carries its current group whole instead of a joining FETCH head. moq-net no longer lists a moq-transport peer's tracks with SUBSCRIBE_TRACKS: such a listing fails as unsupported, and a received SUBSCRIBE_TRACKS is still refused. 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>
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed the full patch at fa33c64 and the affected request, subscription, alias, and group-join paths. No actionable findings.
Direction: the removals match the agreed IETF scope. Unsupported requests retain request-ID admission and per-request refusals; ordinary Rust subscription alias ownership and cancellation remain intact. The draft-18 JavaScript fallback sends the current group's head on the subscription while retaining the real Largest Object, consistent with the existing whole-group receiver path. All 28 changed fuzz regression inputs preserve their payloads and select the same message types after renumbering.
Verification limits: GitHub-only static review. No builds, tests, fuzzing, or interop runs performed; author-reported checks were not independently verified. Third-party behavior with the draft-18 whole-group fallback remains for the documented interop follow-up.
|
Warning Review limit reachedYou've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Next included review available in 4 minutes. View limit details
No actionable comments were generated in the recent review. WalkthroughThe changes remove Rust upstream track listings and JavaScript FETCH serving. Both implementations refuse incoming Merge Risk:
|
There was a problem hiding this comment.
Important
Removing JS FETCH serving also removes the only path that fills a relay's upstream miss, which the IETF interop CLI FETCH history lane still exercises against a native JS publisher. One now-impossible m3 quest and a few removed-FETCH references are also left behind.
Reviewed changes
- JS publisher stops serving FETCH.
runFetch, the draft-18 join registry, the range and joining answer paths, and thegroupEndhook are gone;Connectionrefuses every FETCHNOT_SUPPORTEDon its own stream while the session stays up. The draft-20+ fill path stays. - Draft-18 Next Object subscriptions carry the current group whole.
filterRangenow takes the version and starts a pre-draft-20nextObjectat{largest.group, 0}, so the head arrives without a joining FETCH whileSUBSCRIBE_OKstill reports the true Largest Object. - Rust stops listing a moq-transport peer's tracks.
ietf/subscribe_tracks.rsandietf/subscriber/tracks.rsare deleted with the paused/resuming alias states, PUBLISH adoption, andDUPLICATE_SUBSCRIPTION; a received PUBLISH is always declined and a local listing is aborted withError::Unsupportedwithout sending SUBSCRIBE_TRACKS. - SUBSCRIBE_TRACKS is a bare refusal. Rust and JS read only its Request ID and skip the body; the type is a
SUBSCRIBE_TRACKS_IDconstant in both. - Fuzz kinds renumbered from 27 to 25 with the committed regression inputs rewritten to the same effective decoder, plus the doc and quest notes.
⚠️ The IETF interop CLI FETCH history lane can no longer pass with a JS publisher
test/interop/README.md documents that a native JS publisher answers groups 0 through 2 of the CLI FETCH history lane from track.requests(), and that this "runs on moq-lite and every supported IETF draft". The relay fills a downstream miss by sending an upstream ietf::Fetch, so with every FETCH refused there is no path for those groups, and run_fetch_round <js-runtime> <sub> history keeps running unchanged.
The follow-up in the description only covers the joining-FETCH js-web cells, so this lane was not reconciled. Note that run_tails gates its native-JS publisher loops on needs (which also consults the subscriber list), so those cells also run on the PR lane where js-native-* are subscribers only.
Technical details
# The IETF `CLI FETCH history` lane still assumes a JS publisher answers FETCH
## Affected sites
- `test/interop/interop.sh:2684` — `run_fetch_round "$runtime" "$sub" history` still runs for `js-native-node` and `js-native-bun`.
- `test/interop/README.md:76-79` — states the JS publisher "answers groups 0 through 2, which it never cached" and that the lane runs on every supported IETF draft.
- `rs/moq-net/src/ietf/subscriber.rs:6998` — `ServeFill` fills a local miss by writing `ietf::Fetch::ID` upstream, a Standalone FETCH on draft-18 and a Filtered absolute FETCH from draft-20.
- `js/net/src/ietf/connection.ts:401-406` — every FETCH is now refused `NOT_SUPPORTED`.
- `quest/m3/audit-interop.md:101-104` — the audit note covers only the third-party `js-web` publisher cells behind a joining FETCH.
## Required outcome
- The IETF pass of this lane must not fail for an intended removal: either skip the `history` cells whose publisher is `js-native-*` with a named reason (the `run_finishes` quarantine comment is the local pattern), or record them as expected failures somewhere the harness reads.
- `test/interop/README.md` must stop claiming the lane covers moq-transport with a JS publisher.
## Open questions for the human
- Is the intent to drop the whole lane for moq-transport, or should the JS publisher keep serving cached/fill FETCH for upstream fills while only joining FETCH goes away?ℹ️ Removed-FETCH references left behind
Three places still describe the deleted behavior. The first is an open quest whose goal this PR makes impossible; the other two are docs and comments that now contradict doc/concept/standard.md.
Technical details
# Stale references to JS FETCH serving
## Affected sites
- `quest/m3/ietf-js-joining-fetch.md` — goal is "the JS publisher answers a joining FETCH after a quick finish", which cannot happen any more. Still linked as open from `quest/m3/README.md:121`. The PR deletes `quest/m2/ietf-scope/serving.md`, so retiring this one in the same pass keeps the tree coherent.
- `doc/lib/js/net.md:53` — "This serves lite FETCH, single-group IETF FETCH, and lite-07 ranged subscriptions from the same track". js/net no longer serves IETF FETCH; only lite FETCH and lite-07 ranges still reach `track.requests()`.
- `js/net/src/ietf/publisher.ts:833-835` — the `SUBSCRIBE_OK.largest` comment says a Next Object subscription starts right after it and recovers the head with a fill or a joining FETCH. On draft-18 it now starts at object 0 of that group.
- `js/net/src/ietf/publisher.test.ts:2851-2854` — the same claim in the `LARGEST_OBJECT is the live edge` doc comment (the assertion itself is still correct).
## Required outcome
- The quest is deleted (or rewritten to a closed note), and the three references describe the draft-18 whole-group behavior or drop the IETF FETCH claim.deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏
…erving # Conflicts: # rs/moq-net/src/ietf/subscriber.rs
There was a problem hiding this comment.
Important
The merge integration itself is clean, but the IETF interop CLI FETCH history concern from the previous review is unchanged, so this still is not mergeable as-is. run_fetch_round <js-runtime> <sub> history needs groups 0-2 that the relay can only obtain with an upstream ietf::Fetch (FetchRun at rs/moq-net/src/ietf/subscriber.rs:7148), while the JS publisher now serves track.requests() only through the SUBSCRIBE-fill path; PR CI's --publishers rust hides that, nightly's --all --versions ietf does not.
Reviewed changes
- Listing removal re-applied to main's refactored state machine.
OnceStep::Adopt,Write'sheld,Answering::held,OnceRequest::token_grant,Established::alias, thePaused/Resumingalias states, andpause/want/unwant/adopted/entry_info/entry_ended/is_entry/poll_listing/listen/poll_handoff/buffer_forwardare all gone fromietf/subscriber.rs; nothing else from the merge was dropped. - Shared helpers inlined locally.
tracks::TrackKeybecametype TrackKey = (Path, Arc<str>)andtracks::listing_endbecame a byte-identicaldone_end. RunBroadcastrefuses listings instead of serving them. It holds abroadcast::Listerand aborts each wanted listing withError::Unsupported; the loop terminates becauseLister::abortclears the readers, returningpoll_wantedtoPending.- Secondary Rust files carry only the matching removals.
RequestKind::Publish,DUPLICATE_SUBSCRIPTION,Publish::into_owned,request_stream::Cancel, and theSUBSCRIBE_TRACKS_IDwiring insession.rs/publisher.rs;datagrams.rsfollows the newTrackKey. - Verified at
30d7aed1b:cargo check -p moq-net --all-featureswarning-free,cargo test -p moq-net --all-features --lib ietf::→ 838 passed,--test integration tracks_ietf→ 1 passed.js/net/src/ietf/is untouched since the prior review.
deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏
… stale FETCH claims A relay fills a downstream miss with an upstream FETCH, which a JS publisher now refuses on moq-transport, so the interop CLI FETCH and history cells with a native JS publisher are skipped there with a named reason. The JS net docs, two comments, and the m3 JS joining FETCH quest no longer describe IETF FETCH serving. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed the updates through 453b165 against the prior review and current base, including the Rust subscriber merge integration. No new actionable findings.
Direction: the interop follow-up addresses the previously reported unsupported FETCH cells. The shared run_fetch_round guard records explicit skips for native-JS publishers on moq-transport in both cached and history modes, while retaining moq-lite and Rust-publisher coverage. Removing the obsolete joining-FETCH quest and correcting the related documentation is consistent with the scope reduction.
Verification limits: GitHub-only static review; no builds, tests, or interop runs performed. Author-reported passing runs were not independently verified. The documented third-party joining-FETCH interop follow-up remains.
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes — the delta since the prior pullfrog review (30d7aed1b..453b165cf, 8 files, +17/−39):
- Interop FETCH cells now skip a native JS publisher on moq-transport.
run_fetch_roundrecords a named skip when$VERSIONismoq-transport-*and$pubisjs-native-*, before opening a relay. Both the cached andhistorycalls share the function, andrun_tailsonly passesrust/js-native-node/js-native-bun, so no other publisher is affected. - The interop README states the skip. Both lanes run on moq-lite and every supported IETF draft except a native JS publisher's moq-transport cells, with the upstream-FETCH refusal named as the reason.
- Stale FETCH-serving claims corrected.
doc/lib/js/net.md, theSUBSCRIBE_OK.largestcomment inpublisher.ts, and theLARGEST_OBJECTdoc comment inpublisher.test.tsnow describe the draft-18 whole-group start from object 0 instead of a joining FETCH. - The now-impossible joining-FETCH quest is gone.
quest/m3/ietf-js-joining-fetch.mdis deleted, itsquest/m3/README.mdlink removed, andquest/m3/audit-ci.mdnotes that the JS half no longer exists.
The prior review's blocking finding is resolved by the first two bullets: the CLI FETCH and CLI FETCH history lanes no longer fail on an intended removal, and the README no longer claims coverage the publisher cannot provide. I verified the skip guard's version/publisher conditions against VERSION_LIST (set per pass), the two run_fetch_round call sites, and the absence of any remaining ietf-js-joining-fetch reference; bash -n test/interop/interop.sh passes. No Rust or TS behavior changed in this delta.
deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏
|
quest land watch: the merge queue removed this pull request at 453b165 because A person's removal ends the pick: the watcher leaves this pull request alone until a maintainer enqueues it again. (written by quest land watch) |
Cloudflare's relay answers SUBSCRIBE_TRACKS, so restore moq-net's listing and the PUBLISH adoption, paused/resuming states, and DUPLICATE_SUBSCRIPTION it needs, as on main. Docs and the ietf-scope epic record why. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…erving # Conflicts: # quest/m3/audit-ci.md # quest/m3/audit-interop.md
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed the update from 453b165 through b87eb24 against the base. No new actionable findings.
Direction: retaining Rust SUBSCRIBE_TRACKS listing is consistent with the revised scope. The comparison confirms no remaining Rust changes relative to the base: PUBLISH adoption, paused/resuming aliases, request decoding, and fuzz dispatch/seeds are restored together. The previously reviewed JS FETCH refusal, draft-18 whole-group fallback, and explicit unsupported interop-cell skips remain unchanged; the documentation now distinguishes receiving a listing request from requesting a third-party listing.
Verification limits: GitHub-only static review; no builds, tests, fuzzing, or third-party interop runs performed. Author-reported checks were not independently verified. GitHub currently reports merge conflicts, so the eventual conflict resolution still needs review.
There was a problem hiding this comment.
Important
The branch no longer merges into main (mergeable_state: dirty), and three of the quest edits target quest/m3 files that main rewrote or deleted since this branch's last merge. The Rust revert itself is clean: rs/ no longer appears in the PR diff, so the PR is now the 24 JS, doc, and interop files only.
Reviewed changes — the delta since the prior pullfrog review (453b165cf..b87eb2473, 48 files, +3382/−209; only the docs and one quest README survive in the PR diff):
- The Rust listing removal is reverted whole.
rs/moq-net(includingietf/subscribe_tracks.rs,ietf/subscriber/tracks.rs,request_stream::Cancel,RequestKind::Publish,DUPLICATE_SUBSCRIPTION) and the committedfuzz/regressions/ietf/*inputs are back to the base, along withIETF_KINDS = 27, so no Rust file is part of this PR any more. - The Rust listing claims return to the docs.
doc/concept/standard.md,doc/concept/stats.md, andquest/m5/net-wrap/e2ee.mdare base text again, and their statements about Rust answeringFETCHand listing a peer's tracks withSUBSCRIBE_TRACKSmatch the restored code. - The listing decision is recorded.
quest/m2/ietf-scope/README.mdadds the "Kept (decided 2026-11-10, maintainer)" bullet, naming Cloudflare's relay as the consumer and noting that a receivedSUBSCRIBE_TRACKSstays refused.
The two doc lines that remain changed (the one-group-at-a-time paragraph and the "any FETCH to JavaScript" refusal list) still describe the shipped JS behavior, and nothing under quest/, doc/, or test/ refers to ietf-scope/serving any more.
⚠️ The quest notes now target files main has deleted or rewritten
main is at 114b14fb6 while this branch last merged it at 30d7aed1b. Since then the audit consolidation reshaped quest/m3, so the PR's note edits no longer apply: quest/m3/audit-ci.md does not exist on main, and the js-web paragraph in quest/m3/audit-interop.md that the PR rewrites is gone too. Resolving this by keeping the branch's side would resurrect deleted files and reword text main removed.
Technical details
# Quest notes target pre-#8437 audit files
## Affected sites
- `quest/m3/audit-ci.md:92-94` — the PR replaces the "JS joining FETCH owns the JS half" wording, but `main` deleted this file (#8437 merged the 13 recurring audits into six). Modify/delete conflict; the note has nowhere to land.
- `quest/m3/audit-interop.md:101-104` — main's version no longer contains the "Every `js-web` publisher cell behind a joining FETCH" paragraph this PR rewrites.
- `quest/m3/README.md:124` — `main` still links `/quest/m3/ietf-js-joining-fetch.md`, which this PR deletes; the link removal must be re-applied at the resolved head or the link breaks.
- `quest/m2/ietf-scope/README.md` — main changed only the `Related` link (`audit-simplify.md` → `audit-code.md`); the new "Kept" bullet is unaffected but the file is in conflict.
- `js/net/src/internal.ts`, `js/net/src/ietf/publisher.ts`, `js/net/src/integration.test.ts`, `js/justfile` — main also changed these, in unrelated regions (the `arrivalRuns` hook, `saturatingAdd`/`checkedAdd` in `#refusal`, the `until()` deadline, a `tla` recipe). Keep main's hunks.
## Required outcome
- Merge `main` and re-apply the PR's quest notes onto main's files: drop the `audit-ci.md` edit (or move the JS-half note to whichever consolidated audit now owns it), and re-target the `audit-interop.md` note to its new structure.
- `quest/m3/README.md` must not link the deleted `ietf-js-joining-fetch.md` at the resolved head.
- Confirm `rs/` still matches `main` after resolution: main changed `rs/moq-net/src/model/track.rs`, `ledger.rs`, `lite/publisher.rs`, `tests/integration/socket.rs` and added `rs/moq-net/verify/*` after this branch's merge, so a careless "keep ours" would resurrect pre-main code.
## Open questions for the human
- Does the "The JS half is gone" note still earn a home once the audits are consolidated, or is it covered by `doc/concept/standard.md` alone?deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes — the delta since the prior pullfrog review (b87eb2473..6b65f945a, the merge of main at 114b14fb6; 4 quest/doc files):
- The branch merges
maincleanly again. GitHub now reportsmergeable: MERGEABLE(wasdirty), and the merge touches no code:git diff --name-statusagainstmainlists only the 23 intended PR files. - The
quest/m3/audit-ci.mdedit is dropped.maindeleted that file when #8437 consolidated the audits, so the modify/delete conflict is resolved by keepingmain's deletion rather than resurrecting the file; no "JS half" note is left orphaned. - The
ietf-js-joining-fetch.mdlink removal is re-applied.quest/m3/README.mdno longer links the quest this PR deletes, andmain's newCost auditentry is kept. - The
audit-interop.mdnote is re-targeted ontomain's structure. The FETCH-refusal bullet now extendsmain's "Unsupported or down" list instead of rewording the paragraphmainremoved; the resolved text has no duplicated lines. quest/m2/ietf-scope/README.mdkeeps the "Kept" decision bullet on top ofmain'sRelatedlink change.
I verified that rs/ still matches main byte for byte (the prior run's "keep ours" risk), that main's own edits inside the touched JS files survived (arrivalRuns in internal.ts, until() in integration.test.ts, saturatingAdd/checkedAdd in publisher.ts's #refusal, the tla recipe in js/justfile), and that no conflict markers or references to ietf-js-joining-fetch, ietf-scope/serving, or audit-ci.md remain anywhere in the tree. No specialist dispatch was warranted: the delta is conflict resolution in quest notes, with no behavioral surface to probe.
deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏
# Conflicts: # quest/m3/README.md
|
quest land watch: the merge queue removed this pull request at 442b670 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.
…ork/_temp/git-credentials-21d3e558-98a4-4157-8e27-b23ab11f27ee.config
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.0/bin/git config --local --unset includeif.gitdir:/var/cache/github-runner-work/moq/moq/.git.path \/var\/cache\/github\-runner\-work\/_temp\/git\-credentials\-21d3e558\-98a4\-4157\-8e27\-b23ab11f27ee\.config
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.0/bin/git config --local --get-all includeif.gitdir:/var/cache/github-runner-work/moq/moq/.git/worktrees/*.path
/var/cache/github-runner-work/_temp/git-credentials-21d3e558-98a4-4157-8e27-b23ab11f27ee.config
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.0/bin/git config --local --unset includeif.gitdir:/var/cache/github-runner-work/moq/moq/.git/worktrees/*.path \/var\/cache\/github\-runner\-work\/_temp\/git\-credentials\-21d3e558\-98a4\-4157\-8e27\-b23ab11f27ee\.config
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.0/bin/git config --local --get-all includeif.gitdir:/github/workspace/.git.path
/github/runner_temp/git-credentials-21d3e558-98a4-4157-8e27-b23ab11f27ee.config
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.0/bin/git config --local --unset includeif.gitdir:/github/workspace/.git.path \/github\/runner_temp\/git\-credentials\-21d3e558\-98a4\-4157\-8e27\-b23ab11f27ee\.config
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.0/bin/git config --local --get-all includeif.gitdir:/github/workspace/.git/worktrees/*.path
/github/runner_temp/git-credentials-21d3e558-98a4-4157-8e27-b23ab11f27ee.config
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.0/bin/git config --local --unset includeif.gitdir:/github/workspace/.git/worktrees/*.path \/github\/runner_temp\/git\-credentials\-21d3e558\-98a4\-4157\-8e27\-b23ab11f27ee\.config
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.0/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url
Removing credentials config '/var/cache/github-runner-work/_temp/git-credentials-21d3e558-98a4-4157-8e27-b23ab11f27ee.config'
##[endgroup]
Prepare all required actions
Getting action download info
Download action repository 'taiki-e/install-action@1919c4a95903d2c33e4a221102edca87309fc14b' (SHA:1919c4a95903d2c33e4a221102edca87309fc14b)
##[group]Run ./.github/actions/just
env:
BASE: 55b6d703ddca1f1347dec81541b179d9ab162b56
CHECK_FAIL_FAST: 1
NEXTEST_TEST_THREADS: 24
##[endgroup]
##[start-action display=Use the NixOS runner toolchain;id=__self.__run]
##[group]Run just --version
�[36;1mjust --version�[0m
shell: /nix/store/1mv3qz005gkbalxfghk4y3s8ayv4d2dl-bash-interactive-5.3p15/bin/bash --noprofile --norc -e -o pipefail {0}
env:
BASE: 55b6d703ddca1f1347dec81541b179d9ab162b56
CHECK_FAIL_FAST: 1
NEXTEST_TEST_THREADS: 24
##[endgroup]
just 1.58.0
##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=20]
##[start-action display=Run taiki-e/install-action@1919c4a95903d2c33e4a221102edca87309fc14b;id=__self.__taiki-e_install-action]
##[end-action id=__self.__taiki-e_install-action;outcome=skipped;conclusion=skipped;duration_ms=0]
Prepare all required actions
Getting action download info
Download action repository 'jdx/mr-boxington-action@88acf2bb50552c7c508cbac13e5f8c576b95b1de' (SHA:88acf2bb50552c7c508cbac13e5f8c576b95b1de)
##[group]Run ./.github/actions/rust-cache
with:
env:
BASE: 55b6d703ddca1f1347dec81541b179d9ab162b56
CHECK_FAIL_FAST: 1
NEXTEST_TEST_THREADS: 24
##[endgroup]
##[start-action display=Require main's merge queue on self-hosted runners;id=__self_2.__run]
##[end-action id=__self_2.__run;outcome=skipped;conclusion=skipped;duration_ms=0]
##[start-action display=Cache credentials;id=__self_2.__run_2]
##[end-action id=__self_2.__run_2;outcome=skipped;conclusion=skipped;duration_ms=0]
##[start-action display=Run jdx/mr-boxington-action@88acf2bb50552c7c508cbac13e5f8c576b95b1de;id=__self_2.mbx]
##[group]Run jdx/mr-boxington-action@88acf2bb50552c7c508cbac13e5f8c576b95b1de
with:
version: 1.29.2
backend: local
remote-url: s3://mbx-moq-dev
namespace: Linux-X64
github-token: ***
cache-generation: v1
github-cache-mode: target
isolate-objects-cache: false
clean-target-before-export: false
save-on-workflow-dispatch: false
save-on-pull-request: false
save-on-protected-branch: false
working-directory: .
cache-links: auto
env:
BASE: 55b6d703ddca1f1347dec81541b179d9ab162b56
CHECK_FAIL_FAST: 1
NEXTEST_TEST_THREADS: 24
##[endgroup]
Set up mbx 1.29.2
##[end-action id=__self_2.mbx;outcome=success;conclusion=success;duration_ms=572]
##[start-action display=Drop another mbx version's private state;id=__self_2.__run_3]
##[group]Run : "${VERSION:?the mbx action reported no version}"
�[36;1m: "${VERSION:?the mbx action reported no version}"�[0m
�[36;1mstamp="$HOME/.cache/moq-mbx-versions$RUNNER_WORKSPACE"�[0m
�[36;1mif [ "$(cat "$stamp" 2>/dev/null)" != "$VERSION" ]; then�[0m
�[36;1m mbx clean --under "$RUNNER_WORKSPACE"�[0m
�[36;1m mkdir -p "${stamp%/*}"�[0m
�[36;1m printf '%s\n' "$VERSION" > "$stamp"�[0m
�[36;1mfi�[0m
shell: /nix/store/1mv3qz005gkbalxfghk4y3s8ayv4d2dl-bash-interactive-5.3p15/bin/bash --noprofile --norc -e -o pipefail {0}
env:
BASE: 55b6d703ddca1f1347dec81541b179d9ab162b56
CHECK_FAIL_FAST: 1
NEXTEST_TEST_THREADS: 24
MBX_CACHE_LINKS: 1
MBX_REMOTE_URL:
VERSION: 1.29.2
##[endgroup]
##[end-action id=__self_2.__run_3;outcome=success;conclusion=success;duration_ms=11]
##[start-action display=Sweep the cache before building;id=__self_2.__run_4]
##[group]Run config="$HOME/.config/mbx/config.toml"
�[36;1mconfig="$HOME/.config/mbx/config.toml"�[0m
�[36;1mmkdir -p "${config%/*}"�[0m
�[36;1mprintf '[gc]\nauto = false\n' > "$config"�[0m
�[36;1mmbx gc�[0m
shell: /nix/store/1mv3qz005gkbalxfghk4y3s8ayv4d2dl-bash-interactive-5.3p15/bin/bash --noprofile --norc -e -o pipefail {0}
env:
BASE: 55b6d703ddca1f1347dec81541b179d9ab162b56
CHECK_FAIL_FAST: 1
NEXTEST_TEST_THREADS: 24
MBX_CACHE_LINKS: 1
MBX_REMOTE_URL:
##[endgroup]
evicted 0 objects and 0 action results (0 B logical); 50.0 GiB logical remain
##[end-action id=__self_2.__run_4;outcome=success;conclusion=success;duration_ms=730]
##[start-action display=Check the cache;id=__self_2.__run_5]
##[end-action id=__self_2.__run_5;outcome=skipped;conclusion=skipped;duration_ms=0]
##[start-action display=Cargo shim;id=__self_2.__run_6]
##[group]Run mbx setup --yes
�[36;1mmbx setup --yes�[0m
�[36;1mshim=$(mbx setup --status 2>/dev/null | sed -n '1s/.*: //p' || true)�[0m
�[36;1mif [ ! -e "$shim" ]; then�[0m
�[36;1m echo "::error::mbx setup installed no Cargo shim: $(mbx setup --status 2>&1)"�[0m
�[36;1m exit 1�[0m
�[36;1mfi�[0m
�[36;1mecho "${shim%[/\\]*}" >> "$GITHUB_PATH"�[0m
shell: /nix/store/1mv3qz005gkbalxfghk4y3s8ayv4d2dl-bash-interactive-5.3p15/bin/bash --noprofile --norc -e -o pipefail {0}
env:
BASE: 55b6d703ddca1f1347dec81541b179d9ab162b56
CHECK_FAIL_FAST: 1
NEXTEST_TEST_THREADS: 24
MBX_CACHE_LINKS: 1
MBX_REMOTE_URL:
##[endgroup]
refreshed the Cargo shim at /var/cache/github-runner-home/.local/share/mbx/bin/cargo
##[end-action id=__self_2.__run_6;outcome=success;conclusion=success;duration_ms=40]
##[group]Run rm -rf target/cargo-timings
�[36;1mrm -rf target/cargo-timings�[0m
�[36;1mnix develop --command just ci "$BASE"�[0m
shell: /nix/store/1mv3qz005gkbalxfghk4y3s8ayv4d2dl-bash-interactive-5.3p15/bin/bash -e {0}
env:
BASE: 55b6d703ddca1f1347dec81541b179d9ab162b56
CHECK_FAIL_FAST: 1
NEXTEST_TEST_THREADS: 24
MBX_CACHE_LINKS: 1
MBX_REMOTE_URL:
##[endgroup]
warning: ignoring untrusted flake configuration setting 'extra-substituters'.
Pass '--accept-flake-config' to trust it
warning: ignoring untrusted flake configuration setting 'extra-trusted-public-keys'.
Pass '--accept-flake-config' to trust it
warning: ignoring untrusted flake configuration setting 'fallback'.
Pass '--accept-flake-config' to trust it
CI_STRICT=1 NEXTEST_PROFILE=ci sh/dispatch.sh ci "$BASE"
changed: base 55b6d703ddca1f1347dec81541b179d9ab162b56
ci: check biome started
ci: check quest started
ci: check shell started
ci: check quest failed in 2s
ci: check shell cancelled in 2s
##[group]check quest
Dev-shell quest: /nix/store/pwg8xw04qkakb329k00lfrw99vrb0rb9-quest-0.1.0/bin/quest
quest: quest/m2/ietf-scope/README.md: quest title must be '# [XS|S|M|L|XL] Title'
##[endgroup]
##[group]check shell
##[endgroup]
ci: check biome cancelled in 2s
##[group]check biome
uv run --no-project python sh/js/install.py frozen
[0.05ms] ".env"
bun install v1.4.2 (744846f84)
Resolving dependencies
Resolved, downloaded and extracted [1]
error: recipe `biome` failed on line 142 with exit code 143
##[endgroup]
##[error]ci: check quest failed
ci: wall and CPU seconds per module
2 0 check biome (cancelled)
2 2 check quest (failed)
2 0 check shell (cancelled)
2 3 whole run
error: recipe `ci` failed on line 119 with exit code 1
##[error]Process completed with exit code 1.
##[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: 55b6d703ddca1f1347dec81541b179d9ab162b56
CHECK_FAIL_FAST: 1
NEXTEST_TEST_THREADS: 24
MBX_CACHE_LINKS: 1
MBX_REMOTE_URL:
##[endgroup]
No files were found with the provided path: target/cargo-timings/cargo-timing-*.html. No artifacts will be uploaded.
Post job cleanup.
##[start-action display=Run jdx/mr-boxington-action@88acf2bb50552c7c508cbac13e5f8c576b95b1de;id=__629ae705-9f49-4715-a203-51a06364d4d8.mbx]
##[end-action id=__629ae705-9f49-4715-a203-51a06364d4d8.mbx;outcome=skipped;conclusion=skipped;duration_ms=0]
Post job cleanup.
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.0/bin/git version
git version 2.55.0
Temporarily overriding HOME='/var/cache/github-runner-work/_temp/d1a40350-85ec-4f24-a88e-a6bfc1ec9c69' before making global git config changes
Adding repository directory to the temporary git global config as a safe directory
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.0/bin/git config --global --add safe.directory /var/cache/github-runner-work/moq/moq
Removing SSH command configuration
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.0/bin/git config --local --name-only --get-regexp core\.sshCommand
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.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/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.0/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.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/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.0/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir:
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.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/gx2v6q84b0w43bafm0whkdx93qyxbpps-ci-cache-gc.sh/bin/ci-cache-gc.sh'
shell: /nix/store/1mv3qz005gkbalxfghk4y3s8ayv4d2dl-bash-interactive-5.3p15/bin/bash --noprofile --norc -e -o pipefail {0}
##[endgroup]
evicted 0 objects and 0 action results (0 B logical); 50.0 GiB logical remain
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: ci: check quest failed in 2s ci: check shell cancelled in 2s ##[group]check quest Dev-shell quest: /nix/store/pwg8xw04qkakb329k00lfrw99vrb0rb9-quest-0.1.0/bin/quest quest: quest/m2/ietf-scope/README.md: quest title must be '# [XS|S|M|L|XL] Title' (written by codex, gpt-6.1-sol, medium effort) |
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes — the delta since the prior pullfrog review (442b6706b..f9cbd2e2b) is the quest README rewrite plus a merge of main; no JS behavior changed.
- The epic README becomes a standalone
[S]docs quest.quest/m2/ietf-scope/README.mdretitles to[S] Docs state the frozen moq-transport scope, restates the goal as the remaining docs work (doc/concept/, the IETF draft, and the interop matrix), records the 2026-11-11 sizing decision, and gains the[S]bracket that a leaf quest needs once the last child is deleted. No child links remain, and itsRelatedlink toaudit-code.mdresolves. - The merge keeps
main's newer changes inside the PR-touched files. #8444's in-band AUTH removal and #8474'sMAX_CACHE_DURATIONchange sit alongside the PR's FETCH and SUBSCRIBE_TRACKS refusals, andgit diff --name-status main...HEADstill lists only the 22 intended files (3 deletions);rs/remains byte-identical tomain. - Verified at the head:
bunx tsc --noEmit -p net/tsconfig.jsonis clean,cd js && bun test net/srcreports 3106 pass / 1 skip / 0 fail,bash -npasses ontest/interop/interop.shandsh/gh/nightly.sh, and nothing in the tree referencesietf-scope/servingorietf-js-joining-fetch.
deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏

Finishes quest/m2/ietf-scope/serving.md, part of the IETF scope freeze.
Summary
NOT_SUPPORTEDon its own stream; the session stays up. DeletedrunFetchand its range, join registry, and FETCH_OK writer, plus thegroupEndhook only they used. The draft-20+ fill and#writeFetchGroupstay.rs/is unchanged frommain. Cloudflare's relay (cloudflare/moq-rs,moq-transport/src/message/subscribe_tracks.rsandmoq-relay-ietf/src/producer.rs) answers SUBSCRIBE_TRACKS with PUBLISH. Without our side we could no longer list tracks on that relay.subscribe_tracks.tsis gone and the type is a bareSUBSCRIBE_TRACKS_IDconstant. Rust still decodes the whole message, because it sends one when listing.doc/concept/standard.md,doc/lib/js/net.md) and quest notes (m3/audit-interop.md, which lists FETCH cases with a moq-dev-js publisher as unsupported, and them2/ietf-scopeepic README, which now records that listing stays) describe the new scope.Decisions
main(rejected: delete it). Decided 2026-11-10 by the maintainer after the PR left the merge queue. The earlier premise that no third party consumes listings was wrong: Cloudflare's relay implements SUBSCRIBE_TRACKS.FORWARD=0PUBLISH. So listing needs PUBLISH adoption inSubscribeOnce, the paused/resuming alias states that a reader resumes instead of subscribing again, andDUPLICATE_SUBSCRIPTIONfor a redundant draft-18 PUBLISH. Restoringrs/whole frommainis also the simplest result. It drops two of the earlier choices: the Rust "refuse SUBSCRIBE_TRACKS without decoding" and the IETF fuzz-kind renumbering, so the fuzz regression inputs are back as onmain.quest/m2/ietf-scope/README.md[S]and rewrite it as a standalone quest for the remaining docs work (doc/concept/,drafts/draft-lcurley-moq-ietf.mdif it lists the extensions, the interop matrix) (rejected: finishing the docs in this PR, XS). Decided 2026-11-11 by the maintainer after the merge queue removed the PR: deleting the last child made the README a quest without a size, failingquest check.Choices made without asking
CLI FETCHandCLI FETCH historylanes can no longer pass. They are skipped there with a named reason, andtest/interop/README.mdsays so. Over moq-lite, which our JS publishers use, both lanes still run and pass. Also deletedquest/m3/ietf-js-joining-fetch.md, whose goal this PR makes moot.Impact
Public API: none. Nothing in js/net's public API exposed FETCH serving; moq-net is unchanged.
Wire: no format change. A FETCH to a JS publisher (a relay's upstream fill included) gets NOT_SUPPORTED, an optional behavior in moq-transport. A JS draft-18 Next Object subscription now carries objects from 0 in its first group. Rust's SUBSCRIBE_TRACKS sending and both sides' refusal are unchanged.
Caused by
Not a bug fix: the freeze removes features added on purpose (moq-dev/moq#6945, moq-dev/moq#7793, moq-dev/moq#7794, moq-dev/moq#8117, moq-dev/moq#8231).
Checks
On the head that restores listing (
just checkrerun after mergingmainagain on 2026-11-11, which also took main's new FETCH-serving tests out offetch.test.ts):just check: passed.just test interop --all: everything passed except one moq-lite-06rust -> js-native-buncell, which received only audio before the connection closed under load. It passed on rerun. This PR does not touch moq-lite orrs/.just test interop --all --versions ietf: everything passed except onejs -> gstcell (a 20 ms audio timestamp gap), with the 12 JS-publisherCLI FETCHcells per draft skipped as above. Six reruns ofjs -> gstacross the IETF drafts all passed.Follow-ups
None. The earlier js-web rerun note is gone:
main's rewrite of the interop audit already has it confirm every red cell after the runner client bump.Models
Size: M
Implementer: Claude Code, Claude Opus 5.5, medium effort
Implementer: Claude Code, claude-opus-5-5, medium effort (iterate, M)
Implementer: Claude Code, claude-opus-5-5, low effort (iterate, S)
🤖 Generated with Claude Code
(Written by Claude Opus 5.5 with medium)
Review
Rewritten by
quest reviewafter each round.01a1cc1d-600d-7ba1-9fb7-42f7f98d89ef, round 1The reduced FETCH-serving scope is consistently reflected in dispatch, documentation, and interop selection, with no actionable defects found; builds and tests were not run, as instructed.