Repository navigation
chore(quest): block C consumers on the cut and the generator switch - #7093
Conversation
Quest-Claim: 3014c570e44a08fe
The hand-written moq-c 0.7 ships at the cut with this interop client and doc/lib/c as its proof, and the generator switch re-cases every C type. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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 25 minutes. 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. |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed commit: 3584062
No actionable bugs found in this planning-only change. The direction is sound: the cut and generator-switch prerequisites preserve the hand-written C release proof and avoid porting consumers twice. Assigning the published-archive smoke client to publication, while keeping retirement dependent on both consumer migration and publication, makes the ownership and ordering consistent without expanding the interop matrix.
Verification: inspected the three changed quest documents and the related C parity, generated C, cut, generator-switch, and documentation policies. No earlier published review baseline was present. Static review only; I did not run quest checks, builds, or tests.
There was a problem hiding this comment.
ℹ️ Minor suggestion only — one cross-quest reference is worth a look.
Reviewed changes
consumers.mdwaits on the cut and the generator switch — adds the two## Requiredentries, records the four 2026-10-31 decisions, and scopes the "nothing in the repository" Goal to exclude the smoke client.c-publish.mdtakes the smoke client — its Goal now movestest/smoke/clients/conto the published generated archive, with the ordering reason recorded in the Plan.c-retire.mdnarrows its reasons — the twoRequiredbullets now name which quest moves which consumer off the hand-written ABI.
Verification: rust2#66 is merged (CamelCase C names), moq-dev/moq#7231 is merged (name-clash finished), and every path cited (test/smoke/clients/c, test/interop/clients/c, c/moq/test/probe.c) exists. The dependency graph stays acyclic: C consumers -> {cut, uniffi-fork}, and the cut's own Required quests only require /quest/m1/README.md, never m2/c/*.
deepseek-v4.1-flash (free via Pullfrog for OSS) | 𝕏
The hand-written moq-c keeps moq_origin_announced_broadcast, so the C smoke client gets request/follow only when c-publish moves it onto the generated archive. Drop C from smoke-bindings-rename and cross-link the two quests. 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 commit: 474d121
Compared with my review of 3584062, excluding changes brought in from main. No new actionable bugs found.
The substantive update fixes Pullfrog's overlapping-ownership finding: smoke-bindings-rename.md now excludes C and c-publish.md explicitly owns its transition to generated request/follow. This is a simpler, consistent handoff: the current C smoke client still calls the hand-written moq_origin_announced_broadcast, while moq-ffi already exposes the new names. My prior review had no open findings.
Verification: static inspection of the two updated quests, current C smoke call site, and moq-ffi origin methods; checked head/base comparisons and existing reviews. No builds, tests, or quest checks run.
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes
smoke-bindings-rename.mddrops the C client — the Goal's registry and client lists now cover only{go,python,kotlin,swift}, with a Plan note that C stays out of scope because the hand-writtenmoq-ckeepsmoq_origin_announced_broadcast.c-publish.mdrecords the rename handoff — its Plan now states the move takes the smoke client off the hand-written ABI onto the generatedrequest/follow, with a cross-link back to the rename quest.
Verification: the generated API does expose follow (rs/moq-ffi/src/origin.rs:472) and request (:499), and test/smoke/clients/c/subscribe.c:130 still calls moq_origin_announced_broadcast, so the handoff is accurate. This addresses the prior cross-link finding (thread 4430582521), which is resolved; no other open threads remain.
deepseek-v4.1-flash (free via Pullfrog for OSS) | 𝕏
|
quest land removed this pull request from the queue: the batch check failed (exit 101). js: selecting docs
..js: selecting reader
...
----------------------------------------------------------------------
Ran 24 tests in 0.382s
OK
python3 sh/js/audit.test.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.069s
OK
python3 sh/rs/test-lints.test.py
.
----------------------------------------------------------------------
Ran 1 test in 2.539s
OK
python3 sh/gh/nightly.test.py
..............
----------------------------------------------------------------------
Ran 14 tests in 1.181s
OK
python3 sh/gh/pages-clean.test.py
....
----------------------------------------------------------------------
Ran 4 tests in 0.052s
OK
python3 sh/gh/bench-report.test.py
............
----------------------------------------------------------------------
Ran 12 tests in 0.440s
OK
bench-ffi: 2 measured entries
bench-rust: failure; no history point
bench-ffi: failure; no history point
bench-rust: failure; no history point
no completed benchmark reports; no history point
bench-rust: 1 measured entries
bench-rust: failure; no history point
no completed benchmark reports; no history point
Paired comparison of c2 against c1: 1 confirmed regressions, 1 targets not compared
- `rust/kio/lock/4`: +40.0% (rounds +30.0%, +40.0%, +50.0%)
- `rust/gst/moq-gst/catalog` not compared: base build failed
Paired comparison of c2 against c1: 0 confirmed regressions, 0 targets not compared
python3 sh/gh/ts-paths.test.py
.....
----------------------------------------------------------------------
Ran 5 tests in 0.001s
OK
sh/go/publish-wrapper.test.sh
publish-wrapper test: no rsync on PATH, skipping
bash .claude/hooks/direnv.test.sh
direnv hook: could not load the dev shell, see the direnv output above.
direnv hook: regression tests passed
python3 sh/rs/uring.test.py
jq: error (at <stdin>:36): null (null) cannot be matched, as it is not a string
rs: selecting moq-relay moq-uring
jq: error (at <stdin>:36): null (null) cannot be matched, as it is not a string
rs: selecting moq-relay
jq: error (at <stdin>:36): null (null) cannot be matched, as it is not a string
rs: selecting kio moq-relay moq-uring
jq: error (at <stdin>:36): null (null) cannot be matched, as it is not a string
rs: selecting moq-unrelated
rs: selecting the workspace
rs: selecting the workspace
rs: selecting the workspace
.
----------------------------------------------------------------------
Ran 1 test in 0.280s
OK
ci: check rs failed
ci: check rs_shapes failed
ci: seconds per module
75 check rs (failed)
77 check rs_shapes (failed)
278 check js
52 test js
13 check markdown
2 check gh
46 test gh
68 check flake
0 check drill
3 check quest
0 check ts_paths
14 check shell
0 check large_files
1 check toml
0 check nix
0 check justfile
392 wall time
error: recipe `ci` failed on line 104 with exit code 101
. |
|
Codex land fixer: @moq/p2p:build | ✍️ Rewriting package.json... @moq/p2p:build | 🔗 Converted @moq/qmux: workspace:^ → ^0.3.3 @moq/p2p:build | 📄 Copying README.md... @moq/p2p:build | 🔍 Running publint... @moq/p2p:build | 📦 Package built successfully in dist/ @moq/p2p:build | Done in 238ms @moq/pattern:build | ✍️ Rewriting package.json... @moq/pattern:build | 📄 Copying README.md... @moq/pattern:build | 🔍 Running publint... @moq/pattern:build | 📦 Package built successfully in dist/ @moq/pattern:build | ✍️ Generating jsr.json... @moq/pattern:build | 📦 jsr.json written @moq/pattern:build | Done in 233ms @moq/publish:build | �[36mvite v8.3.4 �[32mbuilding client environment for production...�[36m�[39m @moq/publish:build | transforming... @moq/publish:build | ✓ 139 modules transformed. @moq/publish:build | rendering chunks... @moq/publish:build | computing gzip size... @moq/publish:build | dist/assets/capture-worker.js 0.64 kB @moq/publish:build | dist/assets/capture-worklet.js 1.37 kB @moq/publish:build | dist/capture-worker-BJ0xkcGF.js 0.81 kB │ gzip: 0.50 kB │ map: 1.00 kB @moq/publish:build | dist/index.js 1.06 kB │ gzip: 0.54 kB │ map: 1.57 kB @moq/publish:build | dist/support/index.js 1.16 kB │ gzip: 0.65 kB │ map: 4.26 kB @moq/publish:build | dist/support/element.js 1.36 kB │ gzip: 0.54 kB │ map: 3.20 kB @moq/publish:build | dist/capture-worklet-CRiEEPvQ.js 1.54 kB │ gzip: 0.70 kB │ map: 1.74 kB @moq/publish:build | dist/video-CKv257p3.js 4.83 kB │ gzip: 1.94 kB │ map: 19.44 kB @moq/publish:build | dist/microphone-BIV2nutQ.js 8.09 kB │ gzip: 2.43 kB │ map: 35.77 kB @moq/publish:build | dist/element.js 10.88 kB │ gzip: 3.19 kB │ map: 40.35 kB @moq/publish:build | dist/ui/element.js 33.96 kB │ gzip: 8.52 kB │ map: 54.90 kB @moq/publish:build | dist/encoder-m79Iaxwg.js 58.93 kB │ gzip: 17.31 kB │ map: 277.56 kB @moq/publish:build | dist/src-BlFDRcol.js 483.22 kB │ gzip: 111.10 kB │ map: 1,872.47 kB @moq/publish:build | @moq/publish:build | �[32m✓ built in 230ms�[39m @moq/publish:build | ✍️ Rewriting package.json... @moq/publish:build | 🔗 Converted @moq/clock: workspace:^ → ^0.1.0 @moq/publish:build | 🔗 Converted @moq/hang: workspace:^ → ^0.5.2 @moq/publish:build | 🔗 Converted @moq/json: workspace:^ → ^0.4.2 @moq/publish:build | 🔗 Converted @moq/net: workspace:^ → ^0.4.2 @moq/publish:build | 🔗 Converted @moq/signals: workspace:^ → ^0.2.5 @moq/publish:build | 🔗 Converted @moq/ui: workspace:^ → ^0.1.0 @moq/publish:build | 🔗 Converted @moq/video: workspace:^ → ^0.1.0 @moq/publish:build | 📄 Copying README.md... @moq/publish:build | 🔍 Running publint... @moq/publish:build | 📦 Package built successfully in dist/ @moq/publish:build | Done in 1.28s @moq/qmux:build | ✍️ Rewriting package.json... @moq/qmux:build | 🔗 Converted @moq/clock: workspace:^ → ^0.1.0 @moq/qmux:build | 📄 Copying README.md... @moq/qmux:build | 🔍 Running publint... @moq/qmux:build | 📦 Package built successfully in dist/ @moq/qmux:build | ✍️ Generating jsr.json... @moq/qmux:build | 📦 jsr.json written @moq/qmux:build | Done in 972ms @moq/room:build | ✍️ Rewriting package.json... @moq/room:build | 🔗 Converted @moq/clock: workspace:^ → ^0.1.0 @moq/room:build | 🔗 Converted @moq/hang: workspace:^ → ^0.5.2 @moq/room:build | 🔗 Converted @moq/json: workspace:^ → ^0.4.2 @moq/room:build | 🔗 Converted @moq/net: workspace:^ → ^0.4.2 @moq/room:build | 🔗 Converted @moq/publish: workspace:^ → ^0.5.2 @moq/room:build | 🔗 Converted @moq/signals: workspace:^ → ^0.2.5 @moq/room:build | 🔗 Converted @moq/watch: workspace:^ → ^0.6.2 @moq/room:build | 📄 Copying README.md... @moq/room:build | 🔍 Running publint... @moq/room:build | 📦 Package built successfully in dist/ @moq/room:build | ✍️ Generating jsr.json... @moq/room:build | 📦 jsr.json written @moq/room:build | Done in 1.50s @moq/signals:build | ✍️ Rewriting package.json... @moq/signals:build | 🔗 Converted @moq/clock: workspace:^ → ^0.1.0 @moq/signals:build | 📄 Copying README.md... @moq/signals:build | 🔍 Running publint... @moq/signals:build | 📦 Package built successfully in dist/ @moq/signals:build | ✍️ Generating jsr.json... @moq/signals:build | 📦 jsr.json written @moq/signals:build | Done in 627ms @moq/ui:build | �[36mvite v8.3.4 �[32mbuilding client environment for production...�[36m�[39m @moq/ui:build | transforming... @moq/ui:build | ✓ 6 modules transformed. @moq/ui:build | rendering chunks... @moq/ui:build | computing gzip size... @moq/ui:build | dist/index.js 7.90 kB │ gzip: 3.00 kB │ map: 23.92 kB @moq/ui:build | @moq/ui:build | �[32m✓ built in 24ms�[39m @moq/ui:build | ✍️ Rewriting package.json... @moq/ui:build | 🔗 Converted @moq/signals: workspace:^ → ^0.2.5 @moq/ui:build | 📄 Copying README.md... @moq/ui:build | 🔍 Running publint... @moq/ui:build | 📦 Package built successfully in dist/ @moq/ui:build | Done in 625ms @moq/video:build | ✍️ Rewriting package.json... @moq/video:build | 🔗 Converted @moq/signals: workspace:^ → ^0.2.5 @moq/video:build | 📄 Copying README.md... @moq/video:build | 🔍 Running publint... @moq/video:build | 📦 Package built successfully in dist/ @moq/video:build | ✍️ Generating jsr.json... @moq/video:build | 📦 jsr.json written @moq/video:build | Done in 336ms @moq/watch:build | �[36mvite v8.3.4 �[32mbuilding client environment for production...�[36m�[39m @moq/watch:build | transforming... @moq/watch:build |quest: fixer agent exited 101 (written by Codex) |
|
quest land removed this pull request from the queue: the batch check failed (exit 1). Checking egui v0.36.2
Checking moq-congestion v0.1.0 (/work/rs/moq-congestion)
Checking ecdsa v0.17.0
Checking tungstenite v0.30.0
Checking calloop-wayland-source v0.4.1
Checking wgpu v30.0.1
Checking scuffle-h265 v0.2.2
Checking primeorder v0.14.0
Checking zbus_names v4.3.4
Checking smithay-client-toolkit v0.19.2
Checking hang v0.21.11 (/work/rs/hang)
Compiling moq-vaapi v0.1.0
Checking webm-iterable v0.7.1
Checking scuffle-av1 v0.1.4
Checking moq-loc v0.2.19 (/work/rs/moq-loc)
Checking wayland-protocols-experimental v20250721.0.1
Checking wayland-protocols-plasma v0.3.12
Checking wayland-protocols-misc v0.3.12
Checking sha2 v0.11.1
Checking http-serde v2.1.1
Checking moq-msf v0.5.1 (/work/rs/moq-msf)
Checking toml v1.1.6+spec-1.1.0
Checking winit v0.30.13
Checking humantime-serde v1.1.1
Checking moq-quic v0.1.0 (/work/rs/moq-quic)
Checking moka v0.12.16
Checking http-cache-semantics v3.0.0
Checking moq-mux v0.10.11 (/work/rs/moq-mux)
Checking zbus v5.19.0
Checking postcard v1.1.3
Checking smithay-client-toolkit v0.20.0
Checking tokio-tungstenite v0.30.0
Checking sfv v0.15.0
Checking spki v0.7.3
Compiling moq-video v0.1.10 (/work/rs/moq-video)
Checking jsonwebtoken v11.1.0
Checking axum-core v0.5.6
Checking x11rb v0.14.0
Checking serde_urlencoded v0.7.1
Checking pkcs1 v0.7.5
Checking qmux v0.7.0 (/work/rs/qmux)
Checking smithay-clipboard v0.7.3
Checking web-transport-proto v0.6.3
Checking rcgen v0.14.10
Checking ashpd v0.13.13
Checking http-cache v1.0.0-alpha.8
Compiling proc-macro2-diagnostics v0.10.1
Checking moq-sock v0.2.0 (/work/rs/moq-sock)
Checking fs-err v3.3.1
Checking p384 v0.14.0
Checking p256 v0.14.0
Checking arboard v3.7.0
Checking reqwest-middleware v0.5.2
Checking web-transport-trait v0.5.2
Checking egui-wgpu v0.36.2
Checking egui-winit v0.36.2
Checking axum v0.8.9
Checking axum-server v0.8.0
Checking moq-auth v0.2.1 (/work/rs/moq-auth)
Checking moq-tokio v0.19.23 (/work/rs/moq-tokio)
Compiling duplicate v2.0.1
Checking moq-stats v0.2.12 (/work/rs/moq-stats)
Checking http-cache-reqwest v1.0.0-alpha.9
Checking eframe v0.36.2
Checking egui_dock v0.21.1
Checking moq-relay v0.17.2 (/work/rs/moq-relay)
Checking pipewire v0.10.1
Checking cpal v0.18.2
Checking moq-audio v0.1.10 (/work/rs/moq-audio)
Checking moq-scene v0.1.0 (/work/rs/moq-scene)
Checking moq-studio v0.1.0 (/work/rs/moq-studio)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 7.20s
info: running `cargo clippy --locked --tests --all-features -- -D warnings` on moq-wasm (33/33)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.24s
mbx[cache]: object cache: 1301 hits, 3 misses, 40 not looked up, 3 bypassed; 0 B downloaded, 0 B uploaded, 86.4 KiB stored locally
mbx[cache]: 1m 12s session; 24m 44s estimated compiler time avoided (summed across compilations)
mbx[cache]: 40 compilations had no usable prior inputs or matching prediction for a lookup
mbx[cache]: bypass reasons: 3 build-script-declarations-pending
mbx[cache]: Cargo artifact reuse and CI cache archive transfers are not included above
mbx[savings]: 9.0 TiB logical of build debris binned so far. cargo clean remains unemployed.
ci: check quest failed
ci: seconds per module
301 check rs
113 test rs
134 check rs_shapes
187 check js
13 test js
24 check markdown
6 check gh
91 test gh
0 check drill
3 check quest (failed)
22 check shell
0 check large_files
0 check toml
1 check nix
0 check justfile
551 wall time
error: recipe `ci` failed on line 106 with exit code 1
. |
|
codex / Codex land fixer: (written by codex / Codex) |

Starting C consumers turned up a sequencing conflict, so this PR has no code. It rewrites the quest to wait for the cut and the generator switch, and records the maintainer's picks.
Why it waits
moq-c0.7 at the cut, and checks "the C interop client and everydoc/lib/csample" against its release archive before the cut. If the interop client moves to the generated API first, the crate that ships at the cut loses its interop coverage.doc/AGENTS.mdsays "Describe only what ships", and noc-v*tag ships before the cut (epic).moq_sessionbecomesMoqSession). A port written now would be redone after the switch.Decisions
Settled by the maintainer (2026-10-31), all as recommended:
Required.Required.test/smoke/clients/cmoves with Published generated C. It checks the published archive, and the generated one publishes only after this quest. The consumers Goal's "nothing in the repository" now excludes the smoke client.Changes
quest/m2/c/consumers.md:Requiredentries for Breaking release cut and Switch to rust2's UniFFI with the reasons above; the Goal excludes the smoke client; the Plan records picks 3 and 4, and that the generated API covers everything the client needs, publishing included.quest/m2/release/c-publish.md: the Goal now includes moving the smoke client onto the published generated archive.quest/m2/release/c-retire.md: the twoRequiredreasons now say which quest moves which consumer off the hand-written ABI.quest/m2/release/smoke-bindings-rename.md: drops the C smoke client, andc-publish.mdtakes over its move torequest/follow. This follows pullfrog's cross-link finding. The hand-writtenmoq-ckeepsmoq_origin_announced_broadcast(test/smoke/clients/c/subscribe.c:130), so the C client gets the new names only whenc-publishmoves it onto the generated API (rs/moq-ffi/src/origin.rs:472,:499). Leaving it in the rename quest would have blocked that XS quest until publication.maintwice (no conflicts).just checkandquest checkpass. Public API: none. Wire: none.Review
quest review, round 1 of a new session)3584062c10found nothing. Pullfrog's one thread on that head is fixed (see Changes).Follow-ups
MoqAudioEncoderFinishedrevert now lives in the generator switch quest.(Written by Claude Opus 5.5)
🤖 Generated with Claude Code