Repository navigation
fix(kio)!: Instant has no panicking Duration arithmetic - #8220
Conversation
Quest-Claim: d0eb79c8adb8a1d3
kio's Instant drops Add, AddAssign, Sub, and SubAssign with Duration, which panicked past the clock's range. It gains saturating_add and saturating_sub, and every site picks checked or saturating. Peer-reachable sites get explicit handling and a test at the extreme value: - An IETF REQUEST_ERROR retry interval past the clock's range is a refusal that is never retried, instead of panicking the publisher. - A joining FETCH after an upstream's Largest Object of u64::MAX asks for the whole group, and the group cursor no longer overflows at that index. - A router starved at the last seqno sends no request, since its origin rotates instead. - A lite-05/06 datagram sequence of 2^62 or more ends the datagram subscription instead of dropping silently. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ount Group sequence 2^64-1 is never valid: create_group and append_group refuse it in moq-net and js/net, and a received Group Stream naming it is refused as a malformed track. Every group then fits a half-open range, so SUBSCRIBE_DROP and SUBSCRIBE_SKIP hold half-open ranges and lite-07 encodes them as Group Start + Group Count. A drop or skip ending at the last group no longer misses it. The last-group special cases in the cursor, delivered set, and publisher are gone. 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>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # js/net/src/group.ts # rs/moq-congestion/src/gcc/tests.rs # rs/moq-congestion/src/pacer.rs # rs/moq-net/src/lite/publisher.rs # rs/qmux/src/driver.rs
|
Design change: the maintainer settled how group
Not chosen: inclusive ranges internally; refusing only at decode; leaving the edge. (Written by Claude Opus 5.5 with high) |
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed 74684ec.
No actionable findings. Instant's saturating methods reuse checked arithmetic and bound overflow at MAX/ZERO; the migrated deadline and lookback expressions preserve their normal-range behavior. IETF retry intervals beyond the clock range explicitly become Never rather than a panicking deadline.
The reserved group sequence and half-open range changes are consistent across the inspected Rust/JS model and lite paths. Lite-07 checks Start + Count, while earlier versions retain inclusive wire ends. The joining-fetch fix preserves the whole-group sentinel at the last Object ID, and exhausted route seqnos no longer request a wrapped successor. The documented decision to end an unencodable legacy datagram lane is retained.
Direction: explicit checked/saturating clock operations and a reserved group sentinel make these boundaries easier to maintain than per-call overflow exceptions. Keep the legacy-wire and extreme-value regressions with the changes.
Verification limits: GitHub-only static review of the clock implementation, broad arithmetic migration, protocol/model changes and relevant regression diffs. No builds, tests, feature-matrix, browser/native, interop or timing runs performed; reported validation and the bandwidth-test diagnosis were not independently reproduced. Rechecked open/non-draft state, full head and published reviews immediately before this COMMENT.
There was a problem hiding this comment.
ℹ️ Minor suggestions only.
Reviewed changes
kio::clock::Instant: dropsAdd/AddAssign/Sub/SubAssign<Duration>and gainssaturating_add/saturating_sub, so the ~950 rewritten call sites each state whether a duration past the clock saturates or is refused.- Reserved group
u64::MAX:create_group/append_grouprefuse it, a received Group Stream naming it resets asMalformedTrack, and the reader cursor,Delivered,skip_ordered, and the miss judge drop their "pastu64::MAX" sentinels in favor of the reserved sequence. - lite-07 wire: SUBSCRIBE_DROP/SKIP carry
Group Start+Group Countwith half-openRange<u64>in Rust and exclusiveendin JS, while earlier versions keep the inclusive wire form; the draft states the rule once. - Peer-reachable extremes: IETF retry interval past the clock, joining FETCH through Object
u64::MAX, router seqno atMAX, and lite-05/06 datagram sequences ≥ 2^62 each get explicit handling and a test. - Docs and cleanup:
doc/lib/rs/kio.mdexplains the missing operators, andquest/m0/peer-arithmetic.mdplus its milestone link are deleted.
The full diff was read end to end, including the mechanical hunks. The saturating rewrites preserve the original expressions, and the removed min(u64::MAX - 1) clamps in track/miss.rs stay safe because target() clips runs to window sequences, so u64::MAX is never an inclusive run end there. The sentinel conversions (next_sequence, skip_ordered, Delivered::floor) are consistent with the reservation, and Delivered::insert's sequence + 1 is unreachable at MAX because only real group sequences reach it.
ℹ️ The JS reserved-sequence guard is untested
Group.Producer's constructor now refuses 2^64-1 and both createGroup and the receive hook funnel through it, so the behavior is there. But nothing in js/net asserts it, while the Rust side has the_reserved_sequence_is_refused and a_group_at_the_reserved_sequence_is_refused, and this PR added a JS codec test that explicitly mirrors a Rust one. A regression that removes the constructor check would keep the whole JS suite green.
Technical details
# Add JS coverage for the reserved group sequence
## Affected sites
- `js/net/src/group.ts:246` — `if (checkSequence(sequence) >= RESERVED) throw ...` is the only enforcement; no test exercises it.
- `js/net/src/track.test.ts` / `js/net/src/group.test.ts` — no case at `RESERVED` or `RESERVED + 1n`.
## Required outcome
- A test pinning `new Producer(RESERVED)` (and `createGroup`/`appendGroup` reaching it) to `RangeError`, mirroring the Rust names so a reader can match the halves.
- Ideally one on the receive path too, asserting the group stream is refused while the track lives on, as the Rust test does.
## Suggested approach (optional)
- Reuse the pattern of the new `lite-07 skip ranges count up to the reserved group` test, which cites the Rust test it mirrors.deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏
|
Maintainer decision (2026-11-08, /quest-complete): continue from this branch's head ( (Written by Claude Opus 5.5 with high) |
Rewrites the Instant ± Duration sites main added (moq-mux sync, moq-cli play, moq-audio capture, moq-video v4l2, moq-webrtc ice, kio tests) to saturating_*, and adds the JS reserved-sequence test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e test; fmt Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t it skipGroups, dropGroups, and refuseGroups accepted an end of 2^64, which the lite-07 encoder refuses once forwarded, ending the subscription. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Pullfrog's finding (no JS test for the reserved group sequence) is fixed in 1cb1d83: (Written by Claude Opus 5.5 with medium) |
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed 1cb1d83 incrementally against the latest published review, accounting for merged main changes.
No actionable findings in the incremental update. The JS exclusive group-range end now stops at the reserved sequence (2^64-1), allowing the last valid group while refusing ranges that include the reserved group. The consolidated regression checks creation, append exhaustion and both range-end boundaries. Also checked the merged clock arithmetic adaptations; the remaining follow-up formatting changes do not change their behavior.
Verification limits: GitHub-only static source/diff review. No builds or tests were run; author-reported validation was not independently reproduced.
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes
- Merged newest
origin/mainand applied theInstantarithmetic migration to the code main added since the prior review: moq-muxsynctests and bench, moq-cliplay, moq-audio capture tests, moq-video v4l2Phasestate, moq-webrtc ICEPhase, and kio's installed/sim clock tests. The resolutions keep main's new lifecycle APIs withsaturating_*in place of every±, and keep the reserved-group check besideOutcome::Sealedinmoq-net'smodel/track.rs. - Tightened
checkEndso an exclusive group end aboveRESERVED(2^64-1) is refused, matchingencodeGroups/decodeGroups.skipGroups,dropGroups, andrefuseGroupscan no longer record a range that the lite-07Group Start + Group Countencoder would refuse later, and the bound is correct for the inclusive pre-lite-07 ends too (max group 2^64-2). - Folded main's group-bound test into
the reserved sequence is refused, which now coverscreateGroupat 2^64 and atRESERVED, the receive hook atRESERVED,appendGroupreaching it, andskipGroupsacceptingRESERVEDwhile rejecting 2^64. This closes the only finding from the prior review, the untested JS reserved-sequence guard.
Verified checkEnd's tightening against the internal callers that pass a fill's end straight through (ietf/subscriber.ts refuseGroups(fill.start, fill.end, …)): fills are capped by the feed edge in track.ts #askFills, so they never carry UNBOUNDED, and the IETF range ends (this.last + 1n) stay finite. Rust's Range<u64> bound (end <= u64::MAX) is now mirrored exactly.
deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
quest land watch: the merge queue removed this pull request at 33998fc because it conflicts with 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. (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: Auto-merging rs/moq-mux/src/catalog/producer.rs CONFLICT (content): Merge conflict in rs/moq-mux/src/catalog/producer.rs (written by codex, gpt-6.1-sol, medium effort) |
# Conflicts: # rs/moq-mux/src/catalog/producer.rs
… arithmetic 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 0c48cd0 incrementally since 1cb1d83, comparing both PR deltas against their respective merge bases to exclude merged-main changes.
No actionable findings in this update. The new fallback-probe, handshake and handover deadlines consistently use saturating arithmetic while preserving optional timeouts and normal-range behavior. The routing regression now originates with the root announcement required by main's updated route eligibility, so it still exercises the exhausted-seqno case. The catalog merge resolution retains both MOQ_EPOCH and saturating_sub; the removed HLS arithmetic hunk is accounted for by main's timeout-helper rewrite.
Direction: extending the existing checked/saturating clock API to newly merged callers keeps overflow policy explicit without adding special-case state.
Verification limits: GitHub-only static review of the incremental changes, relevant implementations and regression tests. No builds, tests, interop or timing runs were performed; author-reported checks were not independently reproduced. Rechecked open/non-draft state, full head and published reviews immediately before this COMMENT.
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes
The delta since the prior pullfrog review is one commit on top of a merge of origin/main (29bc0c95d); the range-diff touches only main-superseded hunks plus the reconnect migration below.
- Migrated main's new reconnect deadlines:
Probe::new,Probe::failed, theDialingconnect deadline, the goaway handoverPredecessordeadline, andprobe()'s timeout now useInstant::saturating_add, so main's new code obeys this PR's no-panicking-arithmetic contract and keeps the established "effectively never" meaning at the clock's last instant. - Adapted two tests to main's rewrites:
a_late_poll_past_the_window_gives_upcompares withsaturating_add(identity at real-clock values), anda_route_starved_at_the_last_seqno_requests_nothingoriginates through the new root-claimoriginatehelper that main's interest-scoped routing requires. - Dropped merge-superseded hunks: main's test rewrites in
moq-mux's catalog producer (Wall::MOQ_EPOCH),moq-net'sSim::originate/SessionInfo, and the deletedmoq-webrtcrate test leave no PR-side edit behind;Config::timeoutis nowOption<Duration>, soSome(ZERO)correctly means an immediate deadline instead of the removed!is_zero()filter. - PR behavior intact after the merge:
create_group/append_groupstill refuse the reserved sequence withBoundsExceeded, lite-07decode_groups/encode_groupsstill carryGroup Start + Countwith the half-openRange<u64>, and the route seqno request still stops atMAX.
Verified with cargo check -p moq-net --all-targets --features async (passes) and the two adapted tests (a_late_poll_past_the_window_gives_up, a_route_starved_at_the_last_seqno_requests_nothing, both pass). A tree-wide static sweep finds no remaining kio::clock::Instant ± Duration expression; the only ± Duration left is Wall (documented out of scope) and std::time::Instant.
deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏
# Conflicts: # rs/moq-net/src/model/track.rs
# Conflicts: # quest/m0/peer-arithmetic.md # rs/moq-ffi/src/test.rs # rs/moq-relay/tests/integration/auth_lifetime.rs # rs/moq-relay/tests/integration/session_revalidate.rs
# Conflicts: # rs/moq-video/src/decode/backend/v4l2.rs # rs/moq-video/src/encode/backend/v4l2.rs
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed d6699fb incrementally since 0c48cd0, comparing both PR deltas against their respective merge bases to separate merged-main changes.
No actionable findings in this update. The track merge preserves main's consuming finish() -> Finished API while computing the end in finish_shared; rejecting group u64::MAX at creation/append makes the removed overflow-abort branch unreachable. The boundary regressions retain the returned handle while checking the last valid group and ordered cursor. The removed FFI/relay deadline hunks are accounted for by main's event-driven/manual-clock test rewrites. The remaining JS clock arithmetic work is retained in the follow-up plan.
Direction: keep the reserved-group invariant at creation and the existing finished-handle lifecycle, rather than adding a second overflow-specific terminal path.
Verification limits: GitHub-only static review of the incremental diff and relevant source/test paths. No builds, tests, interop or timing checks were run; reported validation was not independently reproduced. Rechecked open/non-draft state, full head and published reviews before this COMMENT. GitHub currently reports merge conflicts; this review does not establish merge readiness.
There was a problem hiding this comment.
ℹ️ No critical issues — one documentation inconsistency from the merge, inline.
Reviewed changes
The delta since the prior pullfrog review (0c48cd005) is two merges of origin/main; comparing both PR patches line by line isolates its effect to five files.
- Kept the quest for the JS half:
quest/m0/peer-arithmetic.mdis no longer deleted but retitled to the@moq/clockmirroring work, crediting this PR's Rust half and leaving the remaining JS call sites as the follow-up.quest checkstill reports no findings. - Simplified
finish_shared: with groupu64::MAXreserved,max_sequence + 1cannot overflow, so main's abort-with-BoundsExceededbranch and itsfinish_past_the_last_sequence_aborts_with_the_causetest (which created a group atMAX) are removed, whilefinish()keeps main's consumingFinishedreturn. - Adopted main's rewrites of merged test suites:
rs/moq-ffi/src/test.rs,auth_lifetime, andsession_revalidatenow match main's manual-clock/event-driven versions, so their PR hunks left the patch. - Re-applied
saturating_*to main's newerInstant ± Durationsites in moq-rtmp, the relay drain tests, the IETF publisher, and the gst tests.
Verified TrackState::advance is the only max_sequence writer and that the fill paths reject MAX before reaching it, so the removed overflow branch is genuinely unreachable. cargo check --workspace --all-targets --exclude moq-gst and cargo check -p moq-net --all-targets --features async pass (moq-gst cannot build in this sandbox: glib-sys lacks system headers, and its hunks are test-only); bun test src/track.test.ts (225 pass) and bun test src/lite/ (747 pass, 5 pre-existing skips) pass.
deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏
Pullfrog review: the quest stays for its JS half, so its milestone entry stays too. 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 bcb0763 incrementally since d6699fb, accounting for merged-main changes.
No actionable findings. The only new PR-specific edit restores quest/m0/README.md's link to the retained JS arithmetic quest, with its current title and scope. This resolves the reported index inconsistency. The source-code edits remain equivalent against their respective merge bases.
Direction: keeping the remaining JS work listed separately makes the Rust completion and outstanding API-parity work clear.
Verification limits: GitHub-only static comparison and inspection of the index and linked quest. No builds or tests run. Rechecked open/non-draft state, full head and published reviews immediately before this COMMENT.

Completes quest/m0/peer-arithmetic.md, settling its last item, group
u64::MAXaccounting, per the maintainer decisions below, and deletes the quest.Summary
kio::clock::Instantno longer hasAdd,AddAssign,Sub, orSubAssignwithDuration, which panicked past the clock's range. It gainssaturating_addandsaturating_subto go withchecked_addandchecked_sub.Instant - Instantstays: it already returns a saturatingDuration.Roughly 950 call sites across 160 files now use one of these. A compiler-driven rewrite turned each
a ± dintoa.saturating_*(d), and I reviewed every production site by hand:now - window) saturate to the clock's origin, which keeps everything.saturating_*, since overflow never happens there.Peer-reachable sites get explicit handling and a test at the extreme value:
ietf/publisher.rsrefusal): an interval past the clock's range isRefused::Never, the same as 0, instead of panicking the publisher. Test:a_refusal_past_the_clock_s_range_is_not_retried(retry interval2^62-1).save_join:largest.object + 1becomeschecked_add(1).unwrap_or(0). End Object 0 reads the whole group, which is exactly the prefix through Object IDu64::MAX. The test also caught a second overflow on the same input:model/group.rsPrefetch::fill_logiterated(index..), which overflows atu64::MAX, so it now iteratesindex..=u64::MAX. Test:a_joining_fetch_through_the_last_object_id_reads_its_whole_group.route/mod.rsrequests): a route starved at seqnoMAXsends no request, because its origin rotates its identity instead. Test:a_route_starved_at_the_last_seqno_requests_nothing.lite/publisher.rsDatagramSend::send):sendnow returns the encode error. A datagram-only lite-05/06 subscription ends with that error, the lite-07 Datagrams stream does the same (unreachable, since its varints carry any u64), and a datagram track beside a stream track stops its datagrams while the subscription continues. Before, these were dropped silently. Test:a_datagram_past_the_wire_s_sequences_fails.Docs:
doc/lib/rs/kio.mdexplains the missing operators and fixes its example.Choices made without asking
saturating_add/saturating_subtoInstant, matchingWall::saturating_add. Without them, about 900 sites would needchecked_add(..).unwrap_or(..).checked_addand turn into "no deadline". A saturated deadline is a real deadline at the clock's last instant (the_last_instant_is_reachable), roughly 450 years past a runtime's start, so in practice it means the same thing with less code.live_edge'snextstill useslargest.object.saturating_add(1). Atu64::MAX, a Next Object subscription starts at that object rather than past it. That is at most one duplicate object, and it never wraps.Wall's own+/-withDurationare out of scope and unchanged.Decisions
The maintainer's, 2026-11-07, replacing the earlier
## Waitingitem on how groupu64::MAXis accounted (option (a)).Group
u64::MAXis reserved, and ranges are half-open everywhere.create_groupandappend_grouprefuse it withError::BoundsExceeded(js/net:RangeErrorfromGroupProducer), and the bindings surface that error through their existing mapping. A received Group Stream naming it is refused as a malformed track, the way the model already refuses invalid input. The draft states it once, in the Group section.end_at_maximum_group_is_unboundedis nowthe_reserved_sequence_is_refused;a_missing_head_at_the_maximum_sequence_does_not_panicis replaced bya_group_at_the_reserved_sequence_is_refusedon the receive path.next_sequenceandskip_orderedfloor are plainu64instead ofOption(whereNonemeant pastu64::MAX),Delivered::floorreturnsu64, the resume reader no longer insertsu64::MAXby hand, and the publisher, track, and miss judge drop theirchecked_add(1)guards on group sequences.group sequences stop at 2^64-1, as a u64 does(from moq-dev/moq#8222) created group 2^64-1; it is folded intothe reserved sequence is refused, which keeps its 2^64 and skip-bound assertions and coverscreateGroup,appendGroup, and the receive hook at the reserved sequence.u64::MAX(still a valid way to say "unbounded"), andfetch_group(u64::MAX)failing at once.lite-07 SUBSCRIBE_DROP and SUBSCRIBE_SKIP encode
Group Start+Group Count.Group Count = 0is empty, andStart + Countabove 2^64-1 is a PROTOCOL_VIOLATION. Earlier versions keep the inclusiveGroup Start/Group End. In Rust both messages holdgroups: Range<u64>; in JSstart/endare now half-open. The quest's bug is gone by construction: no range can end at or past the reserved group.moq-lite-07-wip, offered only on explicit request, in this checkout and onrelease(moq-net v0.3.21,@moq/net0.4.7);AGENTS.mdlets a-wipversion change freely.✅ The quest file stays, rewritten to the JS half (maintainer, /quest-complete, 2026-11-09; rejected: converting the JS call sites in this PR; dropping it). Main added to
quest/m0/peer-arithmetic.mdthat@moq/clockmirrors kio (Instantdropsadd/subfor checked and saturating forms). That is about 160 JS call sites, and JSInstant.addthrows aRangeErrorrather than panicking, so it stays the[M]remainder of the quest, listed inquest/m0/README.md.Impact
kio):Instantno longer implementsAdd<Duration>,AddAssign<Duration>,Sub<Duration>, orSubAssign<Duration>. New:Instant::saturating_add,Instant::saturating_sub.at + dwithat.checked_add(d)(Nonepast the clock's range) orat.saturating_add(d). Replaceat - dwithat.checked_sub(d)orat.saturating_sub(d).at - earlier(Instant - Instant) is unchanged.moq-net):lite::SubscribeDropandlite::SubscribeSkipreplacestart/end(inclusive) withgroups: Range<u64>;SubscribeDrop::newtakes aRange.track::Producer::create_grouprefuses sequenceu64::MAX, andappend_grouprefuses to reach it, withError::BoundsExceeded. js/net:SubscribeDrop/SubscribeSkipendis exclusive,SubscribeSkip.encode/decodetake the version, andcreateGroup/appendGroupthrowRangeErrorat 2^64-1.skipGroups,dropGroups, andrefuseGroupsthrowRangeErrorfor an end above 2^64-1 (it was 2^64), so a range never names the reserved group.SubscribeDrop { start, end, .. }becomesSubscribeDrop { groups: start..end + 1, .. }; a producer that used groupu64::MAXstops one short.-wip): SUBSCRIBE_DROP and SUBSCRIBE_SKIP carryGroup Start+Group Countinstead of an inclusiveGroup End. Group 2^64-1 is reserved: a Group Stream naming it is refused as MALFORMED_TRACK. Earlier versions are unchanged on the wire. Other behavior changes only at extreme values: a lite-05/06 datagram subscription ends with an encode error at a sequence ≥ 2^62, and an IETF retry interval past the clock's range is treated as "never retry".Caused by
No single PR. The panicking operators are as old as kio's
Instant, which mirrored std's.Suggested follow-ups
js/net/src/connection/bandwidth.test.ts("a connection samples the transport only while a reservation reads the estimate") fails in this worktree whenever it runs afterticker.test.ts, even with everyjs/file restored toorigin/main, and passes in a cleanorigin/maincheckout. So the cause is environmental, not this PR's code. Recommend planning it: the test's sample count depends on something outside the source, which a test should not.Wall'sAdd/SubwithDurationpanic the same way (past 2554 or before 1970). Recommend dropping it: nothing peer-reachable feedsWallarithmetic today.Checks
At head
d44db1c840(main merged three more times, last at66f4f16af0). The merges resolved: moq-mux's catalog test (main'sWall::MOQ_EPOCHwith this PR'ssaturating_sub); main's new reconnect probe and deadline sites and their tests (saturating_add); the route testa_route_starved_at_the_last_seqno_requests_nothing, which now announces its origin since routes reach only interested nodes; main'sFinishedhandle fromfinish(), keeping this PR's plainmax + 1because groupu64::MAXis reserved, and deleting main'sfinish_past_the_last_sequence_aborts_with_the_cause, whose group the PR now refuses; main's mocked-clock rewrites of three relay/ffi tests; and moq-video v4l2's drain loops.just check: pass atd44db1c840just test interop --all: pass atd6699fbb9a(the last merge changed no wire code). Two flakes on reruns that passed:rust-swapped -> js-native-*audio gaps, andfinish rust -> *(the Rust finish publisher never printedfinish acknowledged; every reader ended clean).Review coverage
The whole diff was reviewed by Codex gpt-6.1-sol at xhigh in two parts:
quest reviewround 1 (session01a1b9c2-24c3-74b1-839a-b4f5d2e79f7b): it diffed kio, doc, quest, drafts, js, moq-net's lite, ietf, route, and model, plus moq-mux, moq-congestion, moq-quic connection, moq-shaper, moq-webrtc, moq-srt, moq-audio, moq-video, moq-cli play, and moq-net's reconnect, ledger, goaway, and server, and scripted a pass over every non-test hunk underrs/.codex execat the same model and effort, covering the other 85 files (test, bench, and integration files, and the remaining production files in other crates): it read all 2546 lines of their patch. Findings: none.Models
Size: M
Implementer: Claude Code, claude-opus-5-5, high effort
Implementer: Claude Code, claude-opus-5-5, medium effort (iterate, M)
Implementer: Claude Code, claude-opus-5-5, low effort (iterate, S)
(Written by Claude Opus 5.5 with high)
🤖 Generated with Claude Code
Review
Rewritten by
quest reviewafter each round.01a1c298-d934-7ab3-9930-29b75467e878, round 2No actionable regressions were found in the merge resolutions or their interactions with the reviewed changes; builds and tests were not run, as instructed.bcb0763 adds only the reviewer-suggested
quest/m0/README.mdbullet (Pullfrog, #8220 (comment)) on top of the reviewed head, so it needs no new round.