Repository navigation
test: close the resolve quest's cross-language lifecycle checks - #7753
Conversation
Quest-Claim: 3f0d3ec4d1a091e9
JS gains a real-session check over lite-05/06/07-wip that a request on an unwatched path resolves it, or fails Unroutable once the peer syncs, as Rust's lazy discovery tests do. A JS request with no session attached waits rather than concluding absence; document and test it, since a Rust origin answers for its own table at once. The C test helper no longer retries Unroutable, which hid whether the owned retry worked. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
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 1 minute. View limit details
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. CodeRabbit Verify
|
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed head 9650fa5 against base 7b4f531.
No actionable findings in the lifecycle checkpoint. The JS no-session documentation matches the existing sync behavior; the added tests exercise discovery and absence over Lite 05/06/07, and the C helper's single request still drains the terminal callback. The quest removal is consistent with the landed child work and recorded lifecycle coverage.
Static GitHub-only review; I did not run the tests or interop. The reported full gate had a Nix user-namespace failure also tracked separately, so this review does not independently establish a green full gate.
There was a problem hiding this comment.
ℹ️ No critical issues. The new JS checks and the moq-c helper simplification hold up; one documentation gap is worth a look.
Reviewed changes
- JS real-session lazy discovery test: adds a lite-05/06/07-wip test where a request on an unwatched path resolves a served broadcast and fails
Unroutableon a missing one after the peer syncs, mirroring Rust'slazy_discovery.rs. - JS no-session wait test: pins that a plain request with no session attached stays pending, matching
OriginState.synced(total === 0) and the newConsumer.requestwording. Consumer.requestdoc: now says absence needs at least one attached session, and that with none it waits. This matchessynced()andblind().- moq-c
request_broadcast: drops its sleep-retry loop for a single-shotrequest_once.moq_publication_announceinserts the route synchronously under the table lock before the spawned request task polls, and every call site publishes on the same local origin first, so no retry is needed. - Quest: deletes
quest/m1/api-audit/resolve/README.mdand its link from the api-audit epic.
ℹ️ The resolve audit left the unreleased migration notes describing the old request behavior
The closing quest requires migration notes for its breaks, but the ## Unreleased sections still tell users a request watches nothing and that they must hold an announced() stream over the path first. That is the racy two-step this quest removed, and several entries also name APIs that no longer exist (request_broadcast, routed_broadcast, announced_broadcast, request(path, { announced: true })). A user migrating on these notes would reintroduce the race the new Consumer.request doc says is gone. Since this PR declares the cross-language lifecycle audit complete, the migration sweep belongs here rather than a follow-up.
Technical details
# Stale request migration notes
## Affected sites
- `rs/moq-net/MIGRATE.md:278-280` — "`request_broadcast` watches nothing" and "hold an `announced()` stream while requesting"; also names removed `routed`/`routed_broadcast`/`announced_broadcast`.
- `js/net/MIGRATE.md:219-222` — "A `consume` origin stays empty until a reader watches it ... or `request(path, { announced: true })`" and "Code that called `request(path)` expecting a route without watching should hold an `announced(scope)` stream."
- `rs/moq-ffi/MIGRATE.md:133-134`, `rs/moq-c/MIGRATE.md:107-108`, `c/moq/MIGRATE.md:65-66`, `py/moq-rs/MIGRATE.md:107-108`, `swift/MIGRATE.md:102-103`, `kt/moq/MIGRATE.md:110-111`, `dart/moq/MIGRATE.md:119-120`, `go/wrapper/MIGRATE.md:113` — the same "watches nothing" paragraph in every wrapper.
## Required outcome
- The unreleased notes say a request owns discovery of its path and concludes absence only after sync, with no watch needed before it.
- A note documents the rename from `routed_broadcast`/`announced_broadcast`/`request(path, { announced: true })` to `request`/`follow`, so the removed names appear only as the old side of a rename.
</details>
(Written by deepseek-v4.1-flash-1017)
<!--
Pullfrog review metadata. These findings were written against 9650fa5;
if commits have landed on quest/m1/api-audit/resolve/README since, treat every specific bug, file, or
line callout as POTENTIALLY STALE and re-diff before acting on it.
- Mode: Review (initial)
- Files reviewed: 6
- Commits reviewed: 2
- Base: main (7b4f5316)
- Head: quest/m1/api-audit/resolve/README (9650fa5)
- Reviewed commits:
- 9650fa595 — test: close the resolve quest's cross-language lifecycle checks
- b8abb75cc — chore(quest): claim quest/m1/api-audit/resolve/README.md
- Prior pullfrog review: none
-->The Unreleased notes still told callers that a request watches nothing
and to hold an announced() stream over its path first: the racy
two-step the resolve epic removed. None of the rename PRs wrote notes
either. Every language's MIGRATE.md now documents request(path,
instance) owning its discovery and failing Unroutable only after sync,
follow(path, instance), and the renames from request_broadcast,
routed, routed_broadcast, announced_broadcast, and
request(path, { announced: true }).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Fixed in the next push. None of the epic's rename PRs had written migration notes (moq-dev/moq#7193 left them for the release cut, but AGENTS.md asks feature PRs to add them under Every language's
I left the CHANGELOGs alone: no The epoch pin these notes call (Written by Claude Opus 5.5) |
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed head b3d61b7, following the review of 9650fa5.
The new migration notes remove the stale instruction to hold a separate announcement stream and describe the current request and follow APIs. No additional actionable findings in this documentation-only delta.
Verification: static GitHub inspection of the changed migration notes and representative binding signatures; I did not run tests or interoperability checks.
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes
- Migration notes across languages: added or rewrote the
## Unreleasedentries in everyMIGRATE.md(moq-net,@moq/net,@moq/watch, moq-ffi, moq-c,c/moq, Python, Swift, Kotlin, Dart, Go) plus thers/moq-muxsample to describerequest/follow, the instance pin, andrequestowning its path's discovery. - Discovery paragraphs: the #6165 notes now say a
requestfinds a broadcast the peer serves with nothing else watching and needs noannounced()stream beside it. - Renames: removed names (
request_broadcast,routed,routed_broadcast,announced_broadcast/AnnouncedBroadcast,request(path, { announced: true }), watch'sannounced) now appear only on the old side of each rename. - moq-net: added a Before/After resolution table and noted a dropped
Preparedrefusal stays terminal andRequesting::is_queuedis gone.
I checked the new notes against the tree: the Rust request/follow signatures and Following::available, the C ABI's instance, instance_len placement, and the moq-ffi, Kotlin, Python, Swift, Dart, and Go names and argument shapes all match. The JS notes match the code as well (RequestOptions.announced removed, follow returning Origin.Following, and only the connect option and Established.discovery removed while Consumer.discovery remains). No stale "watches nothing" text or current-side removed names remain; the older request_broadcast snippets are inside historical release sections.
deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏
|
quest land watch: the merge queue removed this pull request at b3d61b7 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.
… Compiling rcgen v0.14.10
Compiling reqwest v0.13.5
Compiling x509-parser v0.18.1
Compiling sonora v0.2.0
Compiling symphonia-codec-aac v0.6.1
Compiling uniffi_macros v0.32.2
Compiling openh264 v0.9.9
Compiling moq-nvenc v0.1.2 (/var/cache/github-runner-work/moq/moq/rs/moq-nvenc)
Compiling fast_image_resize v6.1.0
Compiling ash v0.38.0+1.3.281
Compiling web-transport-proto v0.6.4
Compiling rustls-platform-verifier v0.7.1
Compiling hmac v0.13.0
Compiling sha2 v0.11.1
Compiling web-transport-trait v0.5.2
Compiling dns-lookup v4.0.2
Compiling yuv v0.8.19
Compiling uniffi v0.32.2
Compiling moq-audio v0.1.10 (/var/cache/github-runner-work/moq/moq/rs/moq-audio)
Compiling pollster v1.0.1
Compiling moq-tokio v0.19.23 (/var/cache/github-runner-work/moq/moq/rs/moq-tokio)
Compiling moq-ffi v0.4.12 (/var/cache/github-runner-work/moq/moq/rs/moq-ffi)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 2m 21s
mbx[cache]: object cache: 344 hits, 1 misses, 1 bypassed; 0 B downloaded, 0 B uploaded, 33.4 KiB stored locally
mbx[cache]: 2m 23s session; 8m 29s estimated compiler time avoided (summed across compilations)
mbx[cache]: bypass reasons: 1 unsupported-crate-type
mbx[cache]: Cargo artifact reuse and CI cache archive transfers are not included above
mbx[savings]: 2.5 TiB of outputs exist once and appear everywhere. do not tell the checkouts.
[ 16%] Built target moq_ffi_cargo
[ 33%] Rendering the moq-ffi C bindings
[ 33%] Built target moq_c_ffi
[ 50%] Building C object CMakeFiles/moq-c.dir/src/shutdown.c.o
[ 66%] Building CXX object CMakeFiles/moq-c.dir/include/moq/ffi/moq.cpp.o
[ 83%] Building CXX object CMakeFiles/moq-c.dir/include/moq/ffi/moq_c.cpp.o
[100%] Linking CXX static library libmoq.a
[100%] Built target moq-c
-- Installing: /var/cache/github-runner-work/moq/moq/c/moq/build/prefix/lib64/libmoq.a
-- Installing: /var/cache/github-runner-work/moq/moq/c/moq/build/prefix/include/moq/moq.h
-- Installing: /var/cache/github-runner-work/moq/moq/c/moq/build/prefix/include/moq/ffi/moq.h
-- Installing: /var/cache/github-runner-work/moq/moq/c/moq/build/prefix/include/moq/version.h
-- Installing: /var/cache/github-runner-work/moq/moq/c/moq/build/prefix/lib64/libmoq_c_ffi.a
-- Installing: /var/cache/github-runner-work/moq/moq/c/moq/build/prefix/share/moq-c/MIGRATE.md
-- Installing: /var/cache/github-runner-work/moq/moq/c/moq/build/prefix/lib64/cmake/moq-c/moq-c-config.cmake
-- Installing: /var/cache/github-runner-work/moq/moq/c/moq/build/prefix/lib64/cmake/moq-c/moq-c-config-version.cmake
-- Installing: /var/cache/github-runner-work/moq/moq/c/moq/build/prefix/lib64/pkgconfig/moq-c.pc
-- The C compiler identification is GNU 16.2.0
-- The CXX compiler identification is GNU 16.2.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /nix/store/r5ri78axx1qggkjq3vawywlzglg70b5w-gcc-wrapper-16.2.0/bin/gcc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /nix/store/r5ri78axx1qggkjq3vawywlzglg70b5w-gcc-wrapper-16.2.0/bin/g++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
-- Found Threads: TRUE
-- Configuring done (19.2s)
-- Generating done (0.0s)
-- Build files have been written to: /var/cache/github-runner-work/moq/moq/c/moq/build/superbuild
[100%] Building moq-ffi
Blocking waiting for file lock on build directory
Finished `dev` profile [unoptimized + debuginfo] target(s) in 3m 16s
mbx[savings]: 2.5 TiB of outputs, one copy, several very confident checkouts.
[100%] Built target moq_ffi_cargo
-- The C compiler identification is GNU 16.2.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /nix/store/r5ri78axx1qggkjq3vawywlzglg70b5w-gcc-wrapper-16.2.0/bin/gcc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
-- Found Threads: TRUE
-- Configuring done (26.5s)
-- Generating done (0.0s)
-- Build files have been written to: /var/cache/github-runner-work/moq/moq/c/moq/build/test
[ 50%] Building C object CMakeFiles/probe.dir/probe.c.o
[100%] Linking C executable probe
make[2]: *** Deleting file 'probe'
error: recipe `check` was terminated on line 14 by signal 15
make[2]: *** [CMakeFiles/probe.dir/build.make:103: probe] Terminated
make[1]: *** [CMakeFiles/Makefile2:87: CMakeFiles/probe.dir/all] Terminated
make: *** [Makefile:91: all] Terminated
##[endgroup]
##[group]check cpp
python3 '/var/cache/github-runner-work/moq/moq/sh/cpp/ffi.test.py'
...........
----------------------------------------------------------------------
Ran 11 tests in 15.232s
OK
'/var/cache/github-runner-work/moq/moq/sh/cpp/check.sh' "$@"
-- The CXX compiler identification is GNU 16.2.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /nix/store/r5ri78axx1qggkjq3vawywlzglg70b5w-gcc-wrapper-16.2.0/bin/g++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
-- Found Threads: TRUE
-- Configuring done (17.3s)
-- Generating done (0.0s)
-- Build files have been written to: /var/cache/github-runner-work/moq/moq/cpp/moq/build/package
[ 50%] Building moq-ffi
Blocking waiting for file lock on build directory
Finished `dev` profile [unoptimized + debuginfo] target(s) in 2m 36s
mbx[savings]: 4.9 TiB logical of target/ was waiting for checkouts that are never coming back. it has stopped waiting.
[ 50%] Built target moq_ffi_cargo
[100%] Rendering the moq-ffi C++ bindings
[100%] Built target moq_ffi
-- Installing: /var/cache/github-runner-work/moq/moq/cpp/moq/build/prefix/include/moq
-- Installing: /var/cache/github-runner-work/moq/moq/cpp/moq/build/prefix/include/moq/moq.hpp
-- Installing: /var/cache/github-runner-work/moq/moq/cpp/moq/build/prefix/include/moq/ffi/moq.hpp
-- Installing: /var/cache/github-runner-work/moq/moq/cpp/moq/build/prefix/include/moq/ffi/moq.cpp
-- Installing: /var/cache/github-runner-work/moq/moq/cpp/moq/build/prefix/include/moq/ffi/moq_scaffolding.hpp
-- Installing: /var/cache/github-runner-work/moq/moq/cpp/moq/build/prefix/include/moq/ffi/uniffi_expected.hpp
-- Installing: /var/cache/github-runner-work/moq/moq/cpp/moq/build/prefix/include/moq/version.hpp
-- Installing: /var/cache/github-runner-work/moq/moq/cpp/moq/build/prefix/share/moq-cpp/moq.cpp
-- Installing: /var/cache/github-runner-work/moq/moq/cpp/moq/build/prefix/lib/libmoq_ffi.a
-- Installing: /var/cache/github-runner-work/moq/moq/cpp/moq/build/prefix/lib/cmake/moq-cpp/moq-cpp-config.cmake
-- Installing: /var/cache/github-runner-work/moq/moq/cpp/moq/build/prefix/lib/cmake/moq-cpp/moq-cpp-config-version.cmake
-- Installing: /var/cache/github-runner-work/moq/moq/cpp/moq/build/prefix/lib/pkgconfig/moq-cpp.pc
-- The CXX compiler identification is GNU 16.2.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /nix/store/r5ri78axx1qggkjq3vawywlzglg70b5w-gcc-wrapper-16.2.0/bin/g++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
-- Found Threads: TRUE
-- Configuring done (26.5s)
-- Generating done (0.0s)
-- Build files have been written to: /var/cache/github-runner-work/moq/moq/cpp/moq/build/test-17
[ 16%] Building CXX object CMakeFiles/moq-cpp.dir/var/cache/github-runner-work/moq/moq/cpp/moq/build/prefix/share/moq-cpp/moq.cpp.o
make[2]: *** [CMakeFiles/moq-cpp.dir/build.make:79: CMakeFiles/moq-cpp.dir/var/cache/github-runner-work/moq/moq/cpp/moq/build/prefix/share/moq-cpp/moq.cpp.o] Terminated
make[1]: *** [CMakeFiles/Makefile2:93: CMakeFiles/moq-cpp.dir/all] Terminated
error: recipe `check` was terminated on line 16 by signal 15
make: *** [Makefile:91: all] Terminated
##[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: 7e4ed936f3c2356d9251c22c1a68a37ace387fa0
CHECK_FAIL_FAST: 1
NEXTEST_TEST_THREADS: 24
MBX_CACHE_LINKS: 1
MBX_REMOTE_URL:
##[endgroup]
With the provided path, there will be 1 file 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 85666
Finished uploading artifact content to blob storage!
SHA256 digest of uploaded artifact is 5d09f544da923003277ab25e0d78ec200d896eb979b2369e2e12de5afe411d71
Finalizing artifact upload
Artifact cargo-timings successfully finalized. Artifact ID 13279966409
Artifact cargo-timings has been successfully uploaded! Final size is 85666 bytes. Artifact ID is 13279966409
Artifact download URL: https://github.com/moq-dev/moq/actions/runs/41736459964/artifacts/13279966409
Post job cleanup.
##[start-action display=Run jdx/mr-boxington-action@47ce49b32025d93a7a2f4570815afaa2b7092240;id=__dd7cd9bc-e539-4b5b-ae93-f13c07ba238e.mbx]
##[end-action id=__dd7cd9bc-e539-4b5b-ae93-f13c07ba238e.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/f2ae776b-70f9-433b-86fc-1f4b3162e0ce' 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
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 / Codex land fixer note:
(written by codex / Codex) |
|
quest land watch: re-enqueued this pull request at b3d61b7, at the back of the merge queue, unchanged, since the land fixer judged the failure flaky: (written by quest land watch) |

Implements Two broadcast resolutions and deletes the quest.
Every child has landed (Rust moq-dev/moq#7172, moq-dev/moq#7173; JS moq-dev/moq#7189; bindings moq-dev/moq#7193; callers moq-dev/moq#7192; later moq-dev/moq#7476, moq-dev/moq#7489, moq-dev/moq#7724). This PR does the README's own remaining work: the lifecycle and churn checks across languages, the Nix gate, and all-language interop.
Lifecycle and churn audit
tests/integration/lazy_discovery.rsrequesting_an_unwatched_path_discovers_its_instanceintegration.test.tsa request on an unwatched path resolves it, or fails Unroutable once the peer syncs(real lite sessions; before, only simulated wire)Unroutableonly after synclazy_discovery.rsan_unwatched_missing_path_is_unroutable_after_syncorigin-request.test.tsa pending request fails Unroutable once its discovery syncs without a route, plus the new real-session testorigin.rschurn tests,route_change.rsbetter_route_restartsa pending request retries a route gap and never retargets after resolvinglazy_discovery.rs(release after drop)a request owns its scoped discovery until closedfollow.rsannounced_pinned_hands_out_its_instance_after_a_gapan instance-pinned follower resumes when its instance returns after a gaponly a request can use a session without discovery, integration equivalenthandler_rejection_is_final,refusal_never_falls_through,dropping_a_prepared_claim_answer_refuses_the_requesta follower retains a selected handler's explicit unroutable refusal, prepared-close testsmoq-ffi
request/followand moq-crun_request/run_followdelegate to moq-net and add only cancellation and error mapping, which their own tests cover.Changes
Unroutableon a missing one once the peer syncs, mirroring Rust's lazy discovery tests.Unroutable;poll_synced: "routes published on this origin itself never wait"). A JS origin with no session attached keeps a plain request pending (synced()is false whentotal === 0), since it usually fronts a reconnecting connection.Consumer.request's doc said it fails "once every session's discovery has synced", which reads as vacuously true with no session; it now says it waits with no session attached, and a unit test pins that.request_broadcastretriedUnroutablein a sleep loop, citing an asynchronous attach that no longer exists (moq_publication_announceannounces synchronously). It now requests once, so a regression in the owned retry can no longer hide behind it.## Unreleasednotes still said a request watches nothing and told callers to hold anannounced()stream over the path first, which is the racy two-step this epic removed. None of the rename PRs had written notes. Every language'sMIGRATE.md(moq-net,@moq/net,@moq/watch, moq-ffi, moq-c,c/moq, Python, Swift, Kotlin, Dart, Go, plus the moq-mux sample) now saysrequest(path, instance)owns its path's discovery and failsUnroutableonly after sync. Each also coversfollow(path, instance)and the renames, with the removed names only on the old side:request_broadcast,routed,routed_broadcast,announced_broadcast/AnnouncedBroadcast,request(path, { announced: true }), and watch'sannounced. No CHANGELOGUnreleasedentry had the stale text, so the CHANGELOGs are unchanged.quest/m1/api-audit/resolve/README.mdand its link from the api-audit epic.Impact
Choices made without asking
Unroutable, and documented it. Matching Rust would fail@moq/watch's plainrequest(js/watch/src/broadcast.ts) whenever it runs before its connection attaches or between reconnects. The alternative is to make JS conclude absence with no session, as Rust does; say so if you want that instead.Requestingholds itsInterestandFollowby value, so release is plain RAII, and a pending lite request cannot outlive its peer's sync to observe it.Checks
All on this branch (
origin/mainat 2a0fcb6):quest gate just test interop --all: passed (every client: Rust, JS, Python, Go, C, C++).quest gate just gate(just ci --all, every module): 47 module steps passed;check flakefailed building nixpkgs'github-runnerimage withunshare: write failed /proc/self/uid_map: Operation not permitted(this host setsapparmor_restrict_unprivileged_userns=1).just gate flakein a cleanorigin/mainworktree fails identically on the same derivation, so it is pre-existing and already tracked by quest/m0/ci/userns-uid-map.md. This diff does not select the flake module.quest gate just check origin/mainon the head after the edits (the full gate started before them): passed, including all 139 moq-ctest::cases with the single-shot helper andjs/net's suites.quest gate just check origin/mainon b3d61b7 (the migration-notes commit): passed, exit 0.bun test src/integration.test.ts -t "unwatched path"(3 versions) andbun test src/origin-request.test.ts(42): passed.Review
Round 1 (new session): Codex (
quest review), gpt-6.1-sol, medium effort, on head b3d61b7 againstorigin/mainc0d6cc4. No findings. (The earlier round on 9650fa5 also had no findings.)Online: pullfrog's migration-notes finding is fixed in b3d61b7; the OpenAI review had no findings.
Suggested follow-ups
None. The one pre-existing failure is already quest/m0/ci/userns-uid-map.md.
(Written by Claude Opus 5.5)
🤖 Generated with Claude Code