Repository navigation
feat(studio)!: a two-size program that follows the bandwidth grant, and local source tracks - #21
Conversation
Quest-Claim: fd8ff08aeb866861
The program and each captured source encode a ladder (the picture's size, then 2/3 and 1/3 of it); each rung reserves its ceiling, follows its grant through moq_mux::rate, disables when it cannot be funded, and encodes the smaller sizes only while watched. Catalogs no longer claim bandwidth, so no track is counted twice; the Health panel shows each track's grant. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # README.md # rs/moq-studio/src/engine.rs
|
Maintainer decisions (relayed 2026-11-03):
(Written by Claude Opus 5.5) |
|
Maintainer decision 3 (relayed 2026-11-03): publishing a source's own track is optional and off by default. Each source gets a setting, off by default and saved in the scene file. A source publishes its full-size track only when that setting is on, so by default the program is the only encoding. This replaces #3's always-on per-source tracks and fits the session budget above. Browser sources keep their own rule: an opt-in URL in the layout, never a video track. (Written by Claude Opus 5.5) |
|
Maintainer decision 3, revised (relayed 2026-11-03), replacing the earlier comment: sources are not published to the relay by default. A source's own track still exists locally. It encodes only while something in the studio uses it (an isolated source recording, a replay of that source) and is never announced to the relay. Publishing a source independently, so that a service can move a webcam or overlay itself, becomes a "Published independently" checkbox that also leaves the source out of the composited program. That goes in the layout quest ( (Written by Claude Opus 5.5) |
Takes main's tree whole: the ladder is reworked onto the current code in the next commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nd local source tracks The program publishes the canvas size and half of it, the half size encoding only while watched; each follows its share of the connection's bandwidth and cuts a keyframe for a joining viewer. Sources keep their own tracks in a broadcast the studio never announces, encoding only while on program or read. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n program 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>
…p source rows off relay feedback Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ables them 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 55 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. |
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed head 7065cb9be8e7130b8ec33bcbaf5fab3c0e69f0a7.
- [P2] Keep the canvas rung if the optional half-size probe fails (
rs/moq-studio/src/engine.rs:1163–1170). A backend can open the canvas size but reject the half size. The?discards the successful full-size probe, so startup fails or a resize leaves all video stopped until the next canvas change, rather than dropping only the optional rung. Preserve the full-size probe when the half-size one fails and test that case. - [P2] Clear the fallback threshold after the half-size rung fails (
rs/moq-studio/src/engine.rs:1096–1101, 1225–1228). Removing the failed half-size rung leaves the canvas gate'sPolicy::lowerset to its ceiling. On a constrained probed connection the sole remaining rendition can stay disabled below that threshold, leaving no video. Reconfigure the surviving gate as the only rung and test half-size encoder failure under a low grant. - [P2] Do not select marker-only video for a program replay (
rs/moq-scene/src/replay.rs:270–311;rs/moq-studio/src/replay.rs:92–102). A disabled canvas rendition emits an empty-media discontinuity frame.copy_heldcounts that group as video, so the largest target wins even when it holds no picture and the half-size target has the requested recent media. Require actual video media when choosing a target, and test a replay wholly inside the disabled interval. More generally, prefer coverage of the requested interval over a larger rung with only older partial history. - [P2] React to source-use changes without waiting for a capture frame (
rs/moq-scene/src/publish.rs:514–519;rs/moq-scene/src/source.rs:504). Use is checked only insideVideo::encode, which runs after the next capture frame. ScreenCaptureKit can stop delivering frames when a display is unchanged. A static source taken off program can retain its encoder indefinitely; one captured off program and then shown can fail to start replay history until its pixels change. Drive the use transition independently of incoming frames and make the current picture available when arming it; test both transitions with a paused capture.
Verification: GitHub-only static review of the ladder, source/replay paths, pinned moq behavior and tests. These scenarios are source-traced, not reproduced; I did not run GPU, capture, replay or relay tests.
(Written by review (OpenAI))
There was a problem hiding this comment.
Important
The half-size ladder promises to "drop alone" — the failure handling doesn't fully deliver that. Two paths still let a half-size problem take down the whole output or misreport it as a stopped program.
Reviewed changes
Reviewed all 15 files and 13 commits over 18f2520..7065cb9 (base main at 18f2520). I read the raw diff plus surrounding code in engine.rs, publish.rs, source.rs, collection.rs, replay.rs, health.rs, ui.rs, and scale.rs, and checked the Exporter/rate::Control contracts against the pinned moq SHA fd07f5b7. I could not build or run the tests: the moq/ submodule is empty in this checkout, so the API expectations are verified by reading the pinned source rather than by compiling.
The design is a real improvement — the ladder now follows the grant, the canvas rung keeps its session while skipping, and run_program correctly isolates a runtime half failure by dropping only that rung. The comments below are the places where the half-size story leaks out of that isolation, plus one display issue for canvases that have no half size at all.
Startup abort on half-size probe
publish() does Probe::new(gpu, canvas).await?, so a canvas whose encoder accepts the full size but rejects the half size fails the engine start entirely, even though the body promises the half drops alone. Depending on your intent here (start anyway with one rung, or surface the error but keep the canvas publishing), the fix differs; I flagged it inline rather than prescribing one.
fail_video for a non-program rendition
The fail closure in encode routes both rungs through Stats::fail_video, whose contract is "why the output stopped". For a half-size rung the canvas keeps publishing, yet Health reports "The output stopped" and problems() skips the encoder-behind/drop analysis because it checks local.failed.is_none(). That's the same misreport the isolation was meant to avoid, just in the health surface instead of the ladder.
Half-size column with no half size
ladder::sizes returns a single size when the half's shorter side is under MIN_SIDE, leaving stats.renditions[1] at all zeros, but the Output panel renders a fixed [Load; 2] with a "Half size" heading. Small canvases therefore show a rendition that doesn't exist.
Nothing else in the diff needs a change: the hold: canvas behavior, the Encoder::skip fallback without cuts, and the session/discontinuity accounting all match what the PR body claims.
big-pickle (free) | 𝕏
Recordings read each source's track from the local broadcast, where reading it keeps the source encoding, and the program's file holds its canvas size. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ers, and a source leaving program closes its encoder at once - A half size the encoder refuses at probe leaves the canvas size running, and its failure is reported apart from the video's; the canvas size left alone stops disabling below it. - A replay takes the size whose pictures cover the most of the span, counting no gap marker as a picture. - A source's encoder closes as it leaves program, without waiting on a capture frame a still screen never delivers. - The Output panel shows only the sizes the program has. 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 head b874149 against base 3a4171a.
- [P2] Count the final held picture when ranking coverage (
rs/moq-scene/src/replay.rs:327–365). The new score sums only intervals between pictures and never the last picture's duration to the requested end, although replay keeps displaying that picture until the span ends unless a gap/end marker clears it. For two gap-free ten-second rungs starting together, a 15 fps canvas scores about 9.933 s while a 30 fps half-size rung scores 9.966 s. The half-size rung therefore wins even though both cover the full replay, defeating the intended largest-rung tie-break whenever the canvas drops more frames. Account for the held picture up to the appropriate end or gap boundary and test two complete unequal-frame-rate rungs as well as the partial-history case.
The change fixes the earlier picture-count example where the higher-rate rendition stops partway, but coverage ranking still has this boundary bias. The prior private-recording replay finding remains unchanged.
Verification limits: GitHub-only static review of scoring and replay display paths; I did not run GPU or replay tests.
(Written by review (OpenAI))
There was a problem hiding this comment.
ℹ️ One minor issue in the recording-only audio path, not covered by the existing reviews.
Reviewed changes
Reviewed PR #21 at b874149, focusing on the replay coverage rewrite and the recording-only encoder split. The replay boundary issue at this head is already reported by OpenAI review 5772439939, and the private-recording replay candidate issue by 5772339781; I left both there rather than duplicate them.
- Rank a take by covered time —
Take::coveredsums the time between kept pictures, resetting at gap markers and missing group sequences, andtake()compares coverage before the larger size. - Separate the recording audio copy —
run_audiokeeps the program and recording producers independent, restarts the recording copy on the program clock after a gap, and aborts only the copy that failed. - Private recording broadcast — the program file reads a canvas-size encoder in a broadcast no relay sees; the pinned
moq_muxcatalog releases a rendition's entry on drop.
The inline note is the only new finding: a recording-copy audio failure currently reports the live program output as stopped.
big-pickle (free) | 𝕏
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> # Conflicts: # README.md
…'s to report 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 head d0be9dd3b02659cfebfa1327cf77592d8b262661 against base 501fbb585c3873cf0da768327084ce71d39a178c. Recording-audio finish, discontinuity and write failures now report separately from live program audio, and the Output panel displays the recording warning. No new actionable finding in this update or the overlay integration.
The previously reported final-held-picture coverage bias and the omission of private recording history from program replay remain unchanged. The still-source arming limitation also remains tracked as a follow-up.
Verification: GitHub-only static review; I did not run tests, record media, or exercise GPU/audio devices.
(Written by review (OpenAI))
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes
Reviewed b874149..d0be9dd: the recording audio copy's failures now report separately from the published program audio, plus the merge of origin/main.
- Separated the recording audio copy's failure —
run_audio'sfinish,discontinuity, andwritepaths call the newStats::fail_recording_audio, so a recording-only audio failure no longer marks the live program output stopped; the Output panel shows "recording audio off". The published producer still usesfail_audio. - Merged
origin/main— the overlay module, README, and quest updates came in with the merge; the reordering aroundStats,Ladder::count, and the encodefailclosure is behaviorally identical.
big-pickle (free) | 𝕏
…ture A display or window delivers nothing while its screen stands still, so one put on program or recorded with its encoder closed would encode nothing until the screen changed. Going into use now reopens its capture, which starts with the picture as it is. 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 head d571fd096befa823e6094b7bacccd69535a03585 against base 501fbb585c3873cf0da768327084ce71d39a178c.
[P2] Re-anchor the source clock after reopening capture (rs/moq-scene/src/source.rs:571-577; rs/moq-scene/src/publish.rs:515-522). Each capture open creates a fresh private timestamp epoch, but the existing Video keeps the offset from the old stream. After a display has encoded for a while, goes off program and is later reopened, its new near-zero timestamp maps back near the original start. The container can reject the resumed keyframe as a timestamp rewind, aborting the local track; even a first late use can stamp its history in the distant past. Reset the capture-to-program mapping when reopening, and test a use/off/use cycle with elapsed time and a fresh capture timeline.
The earlier final-picture coverage and private-recording replay findings remain unchanged. This update addresses the separate still-source arming limitation by reopening capture, subject to the clock issue above.
Verification: GitHub-only static review of the changed paths and pinned capture/container code; no device, replay or recording test was run.
(Written by review (OpenAI))
…ck afresh 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 head 07c8dbf5088649d9649fa1a226fcbe0bad5f7446 against base 501fbb585c3873cf0da768327084ce71d39a178c. The reopened-capture timestamp finding is addressed: a successful reopen clears the old mapping before the next frame, and the new test advances the program clock and starts the capture timeline again. No new actionable finding in this update.
The previously reported final-picture coverage bias and omission of private recording history from program replay remain unchanged.
Verification: GitHub-only static review; the regression test simulates reopening rather than exercising a capture device. I did not run tests or record media.
(Written by review (OpenAI))
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes
Reviewed d0be9dd..07c8dbf, the still-source reopen and its timeline re-anchor.
- Reopened a still display or window capture on use —
Video::settlenow wakes on either direction of a used-vs-open disagreement, andsource.rs::devicedrops and reopens the capture forDisplay/Windowsources, so a static screen's local track starts with the current picture instead of waiting for a change. Cameras still arm on their next frame, and thesettlingflag keeps the loop from spinning. - Re-anchored a reopened capture's timeline —
Video::reopenedclearsepoch, so the fresh capture timeline maps onto the program clocknowrather than the old start (the timestamp rewind OpenAI reported ford571fd0). The test asserts the first picture after a reopen is stamped at or after the current clock.
The prior recording-audio finding is confirmed resolved by d0be9dd (recording-copy failures report on recording_audio_error, not the live program's fail_audio); the earlier replay-coverage and private-recording-replay items stay tracked in the OpenAI reviews and are unchanged by this delta.
big-pickle (free) | 𝕏
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> # Conflicts: # rs/moq-scene/src/lib.rs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes
Reviewed 07c8dbf..bb666ea, the merge of origin/main's slide/wipe/move transition refactor (#33) into the branch.
- Merged
origin/main's transitions — the sole conflict,rs/moq-scene/src/lib.rs's module docs, resolves to describe both the newTransitionand the branch'sScaler;ui.rspicks up theTransition/Directionpicker, andengine.rstakes only comment-wording changes ("fading out" → "leaving in a transition"). - Confirmed the half-size path still matches the compositor —
Compositor::program()still returns aCOPY_SRC | TEXTURE_BINDINGRgba8Unormtexture andScaler::scalere-binds it per call, so the merge's newincoming/outgoingtargets do not affect the scaled rendition.Compositor::on_air()now also covers a scene leaving a transition, which correctly keeps its sources encoding while still visible.
The earlier opens remain tracked in the OpenAI reviews and are unchanged by this merge: final-held-picture coverage bias (5772439939), private recording history omitted from program replay (5772339781), and static-source arming as a moq follow-up.
big-pickle (free) | 𝕏
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> # Conflicts: # README.md # rs/moq-studio/src/engine.rs # rs/moq-studio/src/main.rs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Your OpenCode Zen account is out of credit. Top it up, then re-trigger Pullfrog. OpenCode Zen's response
|
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed commit: c95e8e4, against base acd4cd7.
No new actionable finding in the hand-merged audio-mix integration or recording-mix plan. Published and recording audio now consume the selected mix independently; recording demand, gap handling and separate failure reporting are preserved. The capture-clock re-anchor fix is unchanged.
Two prior findings remain open:
- Final-picture coverage bias: rs/moq-scene/src/replay.rs:330–370 still omits the last held picture's interval, so a complete higher-frame-rate half-size rendition can outrank the complete canvas-size rendition. Include that final hold when comparing coverage.
- Private recording history omitted from replay: rs/moq-studio/src/engine.rs:465–505 still builds program replay targets only from the published broadcast. Include retained recording history so an on-demand program with no viewers can replay what its recording captured.
Overall direction: the merge preserves the intended audio split; resolve the two replay findings before calling the replay behavior complete.
Verification limits: GitHub-only static review and base/delta comparison. I did not run GPU, audio, recording or replay tests, or execute quest context; I read its pinned source instead.
(Written by review (OpenAI))

Problem
Live encode control: the studio published one H.264 program rendition at a fixed bitrate, plus every captured source's own track, always encoding. The tracks claimed bitrate on the connection's
bandwidth::Allocatorthrough the catalog, but nothing followed the grant, a viewer on a slow link had no smaller rendition, and every source held a hardware encode session whether or not anything used it.Decisions
Settled by the maintainer (PR comments, 2026-11-03 and 2026-11-04):
moq_video::encode::Producer::demand()and capture's cut-on-join, available since chore(moq): pin moq fd07f5b for the audio capture split and mix router #27 pinned moq fd07f5b. No moq change.This supersedes the earlier draft's 3-rung ladders for the program and every source, and its rewrite of the quest to "Keyframes on request".
Approach
rs/moq-studio/src/ladder.rs,engine.rs): the canvas size, plus half of it when that is at least 180 lines. Each rendition is aGateon the program clock (its ownReservationat 0.07 bits per pixel, amoq_mux::rate::Controlfed the grant every frame, and its track's demand) and an encode thread. The half size ranks one priority above the canvas size, so the allocator funds it first; the canvas size usesPolicy::lower, so when the grant cannot fund it over the half size it is advertisedenabled: falseand resumes on a keyframe. The canvas size keeps today's rule (always, or watched with--on-demand) and holds its session while skipping; the half size closes its encoder, giving the session back, while unwatched. A failed half size drops alone; the canvas size keeps the video.moq_scene::Scalerdraws the program at half size before export (a 4-tap box filter), so zero-copy export still holds. It binds the program texture per frame, since the compositor replaces it on a canvas resize.refresh = 2(capture's ratio) and cuts whenDemand::wanted()passes the track's largest group, once per asked-for group (Joins). An encoder that refusescut()at open (V4L2 without the control) logs and leaves groups to its GOP.set_bitrate; an encoder that cannot retune stays at its ceiling and logs. The catalog no longer claims bandwidth (with_bandwidth), since each track reserves its own ceiling; the audio reserves its 128 kb/s explicitly.moq_scene::publish):Publishowns a broadcast and catalog of its own, on the program's clock, that is never announced.Videoencodes only while its source is on program (Publish::show, fed from the on-air scenes plus the top layer, clones resolved to their capture) or its track is read, and drains its encoder, marking the gap, otherwise. Replay of a source reads that broadcast.moq_scene::publish::Sessionscounts open encoders (program and sources); the Output panel shows it, and the encode work per rendition.Takerefuses a span that holds nothing ("nothing of the last N s is held"); the studio adds "namekeeps a past only while it is on program or recorded". This also covers an--on-demandprogram nobody watched. A gap marker (one empty media frame, read with the rendition's container) is not a picture. A program replay takes the size whose pictures cover the most time inside the span (Take::covered, from each picture to the next, broken by a gap marker or a missing group), the larger on a tie, and a take marks what it holds enabled, so a rendition disabled since still exports.Recorder::newtakes the recording broadcast and the local source broadcast. A source's file reads its local track, and that read keeps the source encoding whether or not it is on program, so feat(studio): record the program, and optionally each source, to MP4 #18'sPublish::on_demandis gone.Role::Record, at the canvas size in arecordingbroadcast announced only on a private origin no relay connection carries. Its gate reserves on an unlimited allocator, so it encodes at its ceiling whatever the grant, and only while a recording reads it, giving its session back otherwise. It has its own exporter, so a program frame is copied once more while recording. The mix on program (#32) is encoded a second time into that broadcast, on anaudio-recordthread besideaudio-encode, following the same pick, only while a recording reads it, marking the gap when the last one stops so the next starts on the program clock. A failure of that copy shows in the Output panel as "recording audio off", leaving the published audio running. The program's file holds that canvas size alone. Without--connect, nobody can watch the published sizes, so the published canvas size opens no session; only the recording's encoder encodes the program.Load::error), not as the video's error, and the canvas size left alone stops disabling (Gate::alone). The Output panel shows only the sizes the program has (Stats::sizes).Video::settle, which wakes on the shown set (awatch) or its track's demand whenever use and the encoder's state disagree. A source leaving use gives its session back at once, even while a still screen delivers no frame. A display or window going into use with its encoder closed reopens its capture, which starts with the picture as it is, and maps the new stream's timeline onto the program clock afresh, so a still screen put on program or recorded encodes its current picture without waiting for its screen to change. A camera keeps delivering, so it waits for its next frame.Stats::recording_audio_error, shown in the Output panel, so Health does not report the published audio stopped.Measurements
Encoder sessions, by construction and checked in tests:
--connectA live scene showing a camera, a display, and a window holds 4 sessions, 5 with the half size watched, and 6 while recording too, within GeForce's 8.
mainheld 1 + one per captured source always (4 for the same three, whatever is shown); the earlier draft's 3-rung ladders would have held up to 12.the_program_reaches_a_relayasserts 1 session before the half size is watched, 2 once it is, 2 while recording (the canvas size and the recording's), and 1 after a resize under 360 lines;the_program_records_without_a_relayasserts 0 sessions before recording and 1 while recording.Encode wall time per frame on this Apple Silicon Mac (release build, 150 frames of a moving I420 pattern, 1080p30 sources, five encoders open at once on one thread; the host was under load from other agents, so read the ratios):
The half size adds about 38% (VideoToolbox) or 26% (openh264) to the program's encode while watched, nothing while not. Three visible 1080p30 sources plus the watched program sum to about one frame period of VideoToolbox time, so on a single-engine Mac, sources on program are what approaches the encoder's throughput, not the ladder.
Impact
dev.moq.studio, and no source track reaches the relay. Migrate by reading the program, or wait for Published independently.refresh; the canvas size may beenabled: falsewhile the grant cannot fund it.--on-demandapplies to the canvas size; the half size is always on demand. Its help says so.Publish::new(clock, kind, sessions)replacesnew(broadcast, catalog, bandwidth, kind), andPublish::on_demand(from feat(studio): record the program, and optionally each source, to MP4 #18) is gone, every source being on demand; newPublish::{consume, catalog, show},Sessions,Scaler,Take::covered;Encoding::newtakesSessions, and gainswatched,demand,cut,set_bitrate,set_enabled, and a publicdiscontinuity;Encodegainsset_bitrate. No wire change beyond the catalog contents above.encode-control.mdis finished and deleted.Choices made without asking
Validation
mediatiming, and a reservation names its join interval (with_interval). The ladder tests pass under the new zero-max-age track default.just cion c95e8e4 (lints with default and all features: capture, openh264, cef; 187 tests): passed. An earlier run failedbun run checkon the join page from a stalenode_modules(an npm@moq/net0.4.7 left from before the merge of feat(studio): renew a joined guest's token while they stay in the room #28); a cleanbun installfixed it, andmainpasses the same check.openh264, on 693188e (and 4 more runs each, all passing):engine::tests::the_program_reaches_a_relay(both sizes through a relay, sessions 1 → 2 → 1, a recording beside it on its own encoder, a clip) andengine::tests::the_program_records_without_a_relay(no session until recording, then only the recording's; a resize going on in a second file; quitting mid-recording): passed. The latter failed 4 of 6 runs while the recording broadcast's catalog went away with the audio thread at quit; held inProgram, it passed 14 of 14.ladder::tests(sizes, priorities, gate follows grant and viewers, a gate left alone never disables, one cut per join),publish::tests::a_video_encodes_while_used(sessions only while on program or read),publish::tests::a_video_leaving_program_closes_its_encoder_at_once,replay::tests::{a_take_of_nothing_is_refused, a_take_of_a_gap_holds_no_pictures, coverage_counts_time_not_pictures},record::tests::the_program_records_its_canvas_size, the Granted and enabled columns inhealth::tests::source_tracks_are_graded_by_source.Follow-ups
Review
Reviewer: Codex, gpt-6.1-sol, medium effort (
quest review --base origin/main --new), a new session after the hand-resolved merge of #32 (mixes). Round 1 reviewed headc95e8e476b22cf62b9b19e6f680d730d3c1d106band reported no findings. The merge kept #32'saudioandaudio-encodethreads, gave the recording's copy its ownaudio-recordthread following the same mix pick, and movedquest/m0/record-mix.mdoff the deletedencode-control.mdonto the recording broadcast.Previous session, after the hand-resolved merge of #29, #31 and #34: Codex, gpt-6.1-sol, medium effort (
quest review --base origin/main --new), a new session after the hand-resolved merge of #29, #31 and #34. Round 5 reviewed headbb666eabb5b42578f64927fa2de9eb789ecdcfd3and reported no findings; e103f9d since is a conflict-free merge of main (#36).source.rs: a still display or window going into use with its encoder closed encoded nothing until its screen changed. Refuted in round 2 as needing a cloneable frame from moq; the reviewer kept it as a regression from gating sources.source.rs: the reopened capture kept the old epoch, stamping its pictures back in time. Fixed in 07c8dbf:Video::reopenedmaps the new timeline afresh, with a test that fails without it.Previous session, after the merge of #18 (design change): round 5 reviewed b874149 with no findings.
replay.rs: a size disabled in the middle of the span counted as covering it. Fixed in 6a994eb: a take counts the pictures inside the span.engine.rs: the recording's audio copy skipped writes while no recording read it but kept its anchor, so a later recording's audio would run behind its video by the idle time. Fixed in 71b3248: the copy marks a discontinuity as the last recording stops, re-anchoring on the next frame.Earlier session, before the merge of #18:
replay.rs: a program replay took the first catalog rendition, so with the canvas size disabled it saved audio only. Fixed in ce95160: one target per size, largest first, taking the first take that holds video.health.rs: the local broadcast's track names can repeat the program's, so a source row picked up the program's grant and viewer feedback. Fixed in ce95160: grants and feedback apply to program rows only; the test now shares a name.replay.rs: a take copiedenabled: false, which the MP4 export filters out. Fixed in 7065cb9: a take marks its renditions enabled.🤖 Generated with Claude Code
(Written by Claude Opus 5.5)