Skip to content

fix(mux): a TS export re-acquires on an unmarked step back a reorder bound proves - #7221

Merged
moq-bot[bot] merged 10 commits into
mainfrom
quest/m1/ts-reliability/step-back
Nov 4, 2026
Merged

moq-bot[bot] merged 10 commits into
mainfrom
quest/m1/ts-reliability/step-back

Conversation

@kixelated

@kixelated kixelated commented Oct 29, 2026 •

Copy link
Copy Markdown
Collaborator

Problem

An unmarked backward timeline step larger than the TS export's delay, but within a source group, left video clamped to the old decode timeline or failed the declared clock's depth check, and audio could fail a decode deadline.

Approach

Track::steps_back (rs/moq-mux/src/container/ts/export.rs) runs as each frame is read, before decode timestamps are reconstructed. It counts a frame as a synthetic restart/skip marker pair only where a reorder bound proves the frame falls outside valid reordering, and only when the frame is more than the export's delay below the highest PTS on the timeline:

  • Audio never reorders, so any such frame counts.
  • Video counts only when its rendition declares a catalog reorder, and the frame follows more frames than that depth in presentation order (DeclaredClock::reorders_past, factored out of push).
  • Video with no declared reorder is never checked: no detection, no rewrite, no error.

A synthesized marker reuses the existing restart path, which now also clears the old keyframe and leading-picture floor, and the jitter buffer's generation path. Restart and skip rise together, so loss-recovery accounting is unchanged. Placed tracks keep their arrival-time behavior, and nothing is detected without a delay.

Importers already fill the catalog reorder from the SPS (max_num_reorder_frames / sps_max_num_reorder_pics), so the catalog value is the single declared bound. The earlier time bounds (the inferred clock's observed reach, the SPS lookahead, the catalog jitter) are dropped from the check. reach was observation rather than a bound. The SPS lookahead is a B-pyramid heuristic: max_num_reorder_frames bounds frames, not presentation time. The catalog jitter also covers encoder latency and segment buffering.

Decisions

Contract for video without a reorder bound (maintainer, 2026-11-03):

  1. ✅ Detect a backward step only where a reorder bound proves the frame falls outside valid reordering. Streams with undeclared reordering are left untouched: no detection, no rewrite, no error.
  2. Replan detection around codec picture ordering or deferred classification so undeclared sources keep automatic recovery.

Choices made while applying it, for review:

  • The delay gate stays for declared video. "Only where" is a necessary condition, so a step back within the delay that exceeds the declared depth still fails the export, as export_declared_zero_reorder_decodes_at_presentation requires. quest/m1/ts-small-step-back.md owns those smaller steps. This PR removes its Required link, so that quest is now unblocked.
  • A keyframe is checked against the previous group's declared clock. The depth bounds the whole stream, so a group stepped back whole restarts as well.
  • The decision is recorded in the TS reliability epic, since this PR deletes the finished step-back.md.

Design change comment.

Impact

  • Public API: none.
  • Wire format: none.
  • A video rendition with a declared reorder, and audio, re-acquire on a step back larger than the delay, instead of clamping video, failing the declared clock, or failing an audio deadline.
  • Video with no declared reorder behaves as on main.

Alternatives

Weakening the shared jitter buffer's backward rule would mistake placed MPEG-1/2 B-picture PTS for steps, and would miss part of a step hidden inside a shared audio PES. Detecting before decode reconstruction and reusing markers keeps that policy in the TS exporter.

Validation

On d3509992e43af2b2ad710bbe37c3a10dc09a709b:

  • cargo test -p moq-mux --all-features: 2,020 passed, 3 ignored.
  • cargo clippy -p moq-mux --all-targets --all-features -- -D warnings: clean. cargo fmt: clean.
  • quest check --base origin/main: ok.
  • New a_declared_reorder_bounds_a_step_back covers four cases at reorder depth 2:
    • an in-bound pyramid: 0 steps;
    • an out-of-bound −560 ms step within a group: 1 step;
    • a group stepped back whole: 1 step;
    • an in-bound two-frame reorder presented 960 ms back: 0 steps.
  • New undeclared_reordering_never_steps_back covers two undeclared cases, both at 0 steps:
    • the reproduced 0, 1600, 800 ms reorder at a 500 ms delay;
    • a −560 ms step.
  • an_unmarked_step_keeps_the_export_rendering: the +4.7 h and +2 s steps run on both clocks, the −560 ms step on declared video, each at three audio lags. No drops, and at least 6 groups rendered after the step.
  • A local probe, not committed, sent undeclared and declared video with steps of −1 to −400 ms at three lags:
    • Steps of −100 ms or less pass with no drops.
    • A −200 ms step fails an audio decode deadline at lag 0 on either clock. That is a step within the delay, which ts-small-step-back.md owns.
    • Undeclared video at −400 ms still drops 105 frames, as on main.

main was merged twice; the only conflict was the epic's Required list. moq-dev/moq#7727 (TS timing on a stalled PCR) is still open and does not touch this code.

Review

mechanical fix by quest land watch: merged main at 55d5a14fbac345e11237ed74183865b73f12304f with the quest merge driver (head 6e0c077)

  • Codex gpt-6.1-sol, medium effort, new session 01a1a3f1-abbc-7750-b6d9-b023deeb4ae1 (started with --new after the design change).
  • Round 1 on d3509992e43af2b2ad710bbe37c3a10dc09a709b: no findings.
  • Pullfrog's undeclared-B-pyramid finding: fixed by the decision above. An undeclared rendition is never checked, and undeclared_reordering_never_steps_back pins it.

Follow-ups

None new. Steps within the delay are already quest/m1/ts-small-step-back.md.

🤖 Generated with Claude Code

(Written by Claude Opus 5.5)

kixelated and others added 5 commits October 28, 2026 23:14
A source whose timeline steps back by more than the export's delay, mid-group
and with no marker, now restarts the track's decode clock and opens a new
jitter generation, as a declared marker would. Before, the video decode clock
clamped every DTS after the step onto the old timeline, so the video arrived
late until it caught up, and audio with slack left decoded before what it had
already sent, which failed the export on a missed decode deadline.

Finishes quest/m1/ts-reliability/step-back.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A rendition that declares its catalog `reorder` bounds reordering by frames,
not time, so a low frame rate pyramid can present a frame further below the
highest PTS than the delay. Such a frame only steps the timeline when the
declared clock would also refuse it as reordered past its depth. The inferred
clock's bound also takes the reordering it has seen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated kixelated changed the title A small step back keeps the TS export's video fix(mux): a TS export re-acquires on a small unmarked step back Nov 1, 2026
@kixelated
kixelated marked this pull request as ready for review November 1, 2026 23:26
@coderabbitai

coderabbitai Bot commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

You'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 8 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used all 4 included reviews currently available.

Learn how review limits work.

Review configuration:

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 39dbae9c-8d98-4d17-9768-818b8d9a60b7
Commits

Reviewing files that changed from the base of the PR and between 55d5a14 and 6e0c077.

Files selected for processing: 6
  • quest/m1/ts-reliability/README.md
  • quest/m1/ts-reliability/step-back.md
  • quest/m1/ts-small-step-back.md
  • rs/moq-mux/src/container/declared.rs
  • rs/moq-mux/src/container/ts/export.rs
  • rs/moq-mux/src/container/ts/export_timing_test.rs
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

Share

@kixelated kixelated left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review by review (OpenAI)

Reviewed commit: 384dd9c376096a706a70c1b8ba4412d663f4d571.

No additional actionable bugs established in the changed code. The direction is sound for the stated >delay rewind: detecting it before DTS reconstruction and reusing the marker path is simpler than weakening the shared jitter buffer's backward-step rule. Keeping synthetic restart/skip counts paired preserves loss-recovery semantics; the declared-depth guard also avoids treating valid declared reordering as a restart. The regression matrix exercises both clocks and audio/video arrival skew.

Verification limits: static inspection of the diff, surrounding queue/release/rebind paths and both decode clocks; I did not run tests or validate the reported test results. The PR's acknowledged undeclared low-frame-rate first-reorder ambiguity remains unverified, as does the explicitly deferred <=delay rewind case; this review does not establish support for those cases.

(Written by OpenAI)

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ℹ️ No blocking issues — the timeline state machine holds on every reset path I traced. One acknowledged edge is worth pinning.

Reviewed changes

  • An unmarked step back becomes a marker of the track's own — Track::steps_back (rs/moq-mux/src/container/ts/export.rs:538) counts a frame read more than bound below the track's running high PTS as one marker, bumping steps and the frame's restart/skip together so the recovery gap is unchanged. Placed kinds are skipped.
  • The decode clock restarts on the synthesized break — the pending.restart != self.restart branch in Track::queue now also clears keyframe/leading_floor, and pending.restart/skip carry the accumulated steps.
  • DeclaredClock::reorders_past — the depth test is factored out of push and reused to bound a declared rendition by frame count.
  • DecodeClock::reach — exposes the reordering already seen, so the inferred bound includes it.
  • Test — an_unmarked_step_keeps_the_export_rendering adds a −560 ms step across inferred and declared (reorder: 2) video at three audio lags, asserting zero drops and at least six groups rendered after.
  • Quest — deletes the finished step-back.md and sizes the childless epic [L].

ℹ️ An undeclared deep B-pyramid can fabricate a restart

steps_back runs before the frame reaches the decode clock, so bound never counts the reordering of the frame being read, only what the clock has already seen (DecodeClock::reach, updated in push). For a rendition that declares no catalog reorder and whose SPS declares none either, Timing::inferred yields (0,0) and bound is just the export delay at the first reordered frame: a B-pyramid whose (2^depth - 1) frame span exceeds delay then satisfies high - pts > bound and synthesizes a spurious step at startup. The declared path is gated by reorders_past's frame count; the inferred path has no equivalent gate. This is the narrow case the PR body already records as a follow-up — a test like the one in this PR, but with an undeclared pyramid narrow enough that its span clears the delay, would pin whether the frame-count gate belongs on the inferred path too.

Technical details
# Inferred-path step bound carries no frame-count gate

## Affected sites
- `rs/moq-mux/src/container/ts/export.rs:546` — `bound = delay.max(lookahead).max(self.timing.jitter).max(self.clock.reach())`; for an undeclared rendition with no SPS reorder, `lookahead == 0` (via `Timing::inferred`, lines 978-984) and `jitter == 0`, leaving `bound == delay`.
- `rs/moq-mux/src/container/ts/export.rs:547-551` — `reordered` is a frame-count gate only when `self.declared` is `Some`; on the inferred path it is `true`.
- `rs/moq-mux/src/container/ts/export.rs:602` — `steps_back` runs before the frame is pushed, so `self.clock.reach()` reflects only frames already read.

## Required outcome
- A healthy inferred B-pyramid whose reorder span exceeds `delay` must not fabricate a step on its first reordered frame.

## Suggested approach (optional)
- Gate the inferred path by frame count too, or seed `bound` from the SPS-declared reorder even when the catalog declares none, and pin the chosen behavior with an end-to-end test using an undeclared pyramid whose span exceeds `delay`.

Pullfrog  | Fix it ➔ | View workflow run | Using deepseek-v4.1-flash (free via Pullfrog for OSS) | 𝕏

@kixelated
kixelated enabled auto-merge (squash) November 1, 2026 23:40
@kixelated
kixelated added this pull request to the merge queue Nov 2, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Nov 2, 2026
@moq-bot

moq-bot Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

quest land watch: the merge queue removed this pull request at 384dd9c because its merge_group build failed (failed_checks).

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.

Queue / Queue (job) failure at step Check:

…de-general-category v1.1.0
   Compiling sctp-proto v0.10.5
   Compiling combine v4.6.8
   Compiling simple_asn1 v0.6.4
   Compiling pin-project-internal v1.1.13
   Compiling gstreamer-audio-sys v0.25.4
   Compiling sha1 v0.10.7
   Compiling sha-1 v0.10.1
   Compiling pbkdf2 v0.12.2
   Compiling pem v3.0.6
   Compiling kstring v2.0.5
   Compiling option-operations v0.6.1
   Compiling keyed_priority_queue v0.4.2
   Compiling streaming-stats v0.2.3
   Compiling bstr v1.13.1
   Compiling self_cell v1.3.0
   Compiling take-until v0.2.0
   Compiling epaint_default_fonts v0.36.2
   Compiling bitstream-io v2.6.0
   Compiling array-init v2.1.0
   Compiling byteorder-lite v0.1.0
   Compiling jiff-core v0.1.1
   Compiling nohash-hasher v0.2.0
   Compiling fallible-iterator v0.3.0
   Compiling prometheus-client v0.25.1
   Compiling test-env v0.0.1 (/var/cache/github-runner-work/moq/moq/rs/test-env)
   Compiling arraydeque v0.5.1
   Compiling muldiv v1.0.1
   Compiling srt-protocol v0.4.4
   Compiling pin-project v1.1.13
   Compiling sdp-types v0.1.8
   Compiling epaint v0.36.2
   Compiling jiff v0.2.37
   Compiling image v0.25.10
   Compiling h264-reader v0.8.0
   Compiling jsonwebtoken v11.1.0
   Compiling stun-types v2.0.3
   Compiling uniffi_internal_macros v0.32.2
   Compiling str0m v0.24.1
   Compiling gstreamer v0.25.4
   Compiling gst-plugin-version-helper v0.8.4
   Compiling http-cache v1.0.0-alpha.8
   Compiling rind-rustls v0.1.2
   Compiling p384 v0.14.0
   Compiling p256 v0.14.0
   Compiling m3u8-rs v6.0.1
   Compiling http-auth v0.1.10
   Compiling reqwest-middleware v0.5.2
   Compiling calloop v0.14.5
   Compiling pkcs1 v0.7.5
   Compiling tokio-stream v0.1.19
   Compiling prometheus-client-derive-encode v0.5.1
   Compiling accesskit v0.24.1
   Compiling quick_cache v0.7.0
   Compiling pretty-hex v0.4.2
   Compiling dtoa v1.0.11
   Compiling atomic_refcell v0.1.14
   Compiling retina v0.4.21
   Compiling moq-archive v0.0.11 (/var/cache/github-runner-work/moq/moq/rs/moq-archive)
   Compiling egui v0.36.2
   Compiling calloop-wayland-source v0.4.1
   Compiling srt-tokio v0.4.4
   Compiling moq-auth v0.2.1 (/var/cache/github-runner-work/moq/moq/rs/moq-auth)
   Compiling http-cache-reqwest v1.0.0-alpha.9
   Compiling axum-server v0.8.0
   Compiling moq-gst v0.4.12 (/var/cache/github-runner-work/moq/moq/rs/moq-gst)
   Compiling moq-stats v0.2.12 (/var/cache/github-runner-work/moq/moq/rs/moq-stats)
   Compiling wayland-protocols-experimental v20250721.0.1
   Compiling wayland-protocols-misc v0.3.12
   Compiling sd-notify v0.5.0
   Compiling sysinfo v0.39.6
   Compiling bytesize v2.7.0
   Compiling toml v0.9.12+spec-1.1.0
   Compiling moq-relay v0.17.2 (/var/cache/github-runner-work/moq/moq/rs/moq-relay)
   Compiling smithay-client-toolkit v0.20.0
   Compiling moq-hls v0.5.11 (/var/cache/github-runner-work/moq/moq/rs/moq-hls)
warning: unused import: `Io`
  --> rs/moq-relay/src/listener.rs:20:34
   |
20 | pub(crate) use idle::{Admission, Io};
   |                                  ^^
   |
   = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default

   Compiling moq-ice v0.1.0 (/var/cache/github-runner-work/moq/moq/rs/moq-ice)
   Compiling gstreamer-base v0.25.4
   Compiling uniffi_pipeline v0.32.2
   Compiling openh264 v0.9.9
   Compiling gstreamer-audio v0.25.4
   Compiling web-time v1.1.0
   Compiling uniffi_meta v0.32.2
   Compiling cbindgen v0.29.4
   Compiling moq-rtc v0.3.12 (/var/cache/github-runner-work/moq/moq/rs/moq-rtc)
   Compiling smithay-clipboard v0.7.3
   Compiling proc-macro2-diagnostics v0.10.1
   Compiling camino v1.2.6
   Compiling moq-srt v0.3.11 (/var/cache/github-runner-work/moq/moq/rs/moq-srt)
   Compiling moq-rtsp v0.1.0 (/var/cache/github-runner-work/moq/moq/rs/moq-rtsp)
   Compiling arboard v3.7.0
   Compiling rind-object-store v0.1.2
   Compiling moq-rtmp v0.3.11 (/var/cache/github-runner-work/moq/moq/rs/moq-rtmp)
   Compiling tower-http v0.7.1
   Compiling terminal_size v0.4.4
   Compiling type-map v0.5.1
   Compiling vte v0.15.0
   Compiling cargo-platform v0.3.3
   Compiling semver v1.0.28
   Compiling vt100 v0.17.0
   Compiling cargo_metadata v0.23.1
   Compiling egui-wgpu v0.36.2
   Compiling egui-winit v0.36.2
   Compiling uniffi_macros v0.32.2
   Compiling duplicate v2.0.1
   Compiling moq-c v0.7.0 (/var/cache/github-runner-work/moq/moq/rs/moq-c)
   Compiling moq-shaper v0.0.1 (/var/cache/github-runner-work/moq/moq/rs/moq-shaper)
   Compiling uniffi_core v0.32.2
   Compiling rand_xorshift v0.5.0
   Compiling unarray v0.1.4
   Compiling core_detect v1.0.0
   Compiling proptest v1.12.0
   Compiling eframe v0.36.2
   Compiling egui_dock v0.21.1
   Compiling moq-scene v0.1.0 (/var/cache/github-runner-work/moq/moq/rs/moq-scene)
   Compiling uniffi v0.32.2
error: `moq-relay` (lib) generated 1 warning (run `cargo clippy --fix --lib -p moq-relay` to apply 1 suggestion)
error: warnings are denied by `build.warnings` configuration
warning: build failed, waiting for other jobs to finish...
      Timing report saved to /var/cache/github-runner-work/moq/moq/target/cargo-timings/cargo-timing-20261102T102137968Z-efcac1b57bcf5093.html
error: command `/nix/store/85lxjwg78jw6rf7pqkf3vcq6291nrlfh-cargo-1.98.1-x86_64-unknown-linux-gnu/bin/cargo '--color=auto' test --no-run --message-format json-render-diagnostics --package 'path+file:///var/cache/github-runner-work/moq/moq/demo/carla/bridge#moq-carla-bridge@0.1.0' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/hang#0.21.11' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-audio#0.1.10' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-boy#0.5.12' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-c#0.7.0' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-cli#0.14.2' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-ffi#0.4.12' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-gst#0.4.12' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-hls#0.5.11' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-mux#0.10.11' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-rtc#0.3.12' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-rtmp#0.3.11' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-rtsp#0.1.0' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-scene#0.1.0' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-srt#0.3.11' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-studio#0.1.0' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-transcode#0.1.10' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-video#0.1.10' --package moq-video --package moq-audio --tests --features 'moq-video/capture moq-audio/capture moq-audio/playback moq-cli/play moq-cli/openh264' --timings --locked` exited with code 101
mbx[cache]: object cache: 418 hits, 300 misses, 18 not looked up, 2 bypassed; 0 B downloaded, 0 B uploaded, 2.7 GiB stored locally
mbx[cache]: 2m 52s session; 3m 47s estimated compiler time avoided (summed across compilations)
mbx[cache]: 18 compilations had no usable prior inputs or matching prediction for a lookup
mbx[cache]: bypass reasons: 2 unsupported-crate-type
mbx[cache]: Cargo artifact reuse and CI cache archive transfers are not included above
mbx[savings]: has saved 8d 4h across 11699 builds. this line is the only thanks it needs.
error: recipe `test` failed on line 284 with exit code 101
error: recipe `test-changed` failed on line 82 with exit code 101
##[endgroup]
ci: seconds per module
    55  check rs
   173  test rs (failed)
    18  check markdown
    10  check gh
    50  test gh
     0  check drill
     3  check quest
    26  check shell
     0  check large_files
     0  check toml
     0  check nix
     1  check justfile
   228  wall time
error: recipe `ci` failed on line 107 with exit code 101
##[error]ci: test rs failed
##[error]Process completed with exit code 101.
##[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: 274d322f0846b6e7a93ba69261ab1e5f5213bb3e
  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 80048
Finished uploading artifact content to blob storage!
SHA256 digest of uploaded artifact is cd273769ed37458b28255a4db386e3b40072507c4f7f768584ac93e92efe0b80
Finalizing artifact upload
Artifact cargo-timings successfully finalized. Artifact ID 13132618915
Artifact cargo-timings has been successfully uploaded! Final size is 80048 bytes. Artifact ID is 13132618915
Artifact download URL: https://github.com/moq-dev/moq/actions/runs/41428001748/artifacts/13132618915
Post job cleanup.
##[start-action display=Run jdx/mr-boxington-action@47ce49b32025d93a7a2f4570815afaa2b7092240;id=__af65561a-cf62-40de-94e9-e5517e0233eb.mbx]
##[end-action id=__af65561a-cf62-40de-94e9-e5517e0233eb.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/2b66ba20-84af-4631-bfb0-7068e0132a88' 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 1614 objects and 0 action results (2.8 GiB logical); 50.0 GiB logical remain
dropped 2 stale checkout records
dropped 6 session event streams
removed 0 learned incremental units and 2 checkout directories (3.7 KiB logical); 140 units (4.7 GiB logical) remain
evicted 0 objects and 0 action results (0 B logical); 50.0 GiB logical remain
removed 2 target directories (13.7 MiB logical, 2 abandoned and 0 live); 6.0 GiB logical remain
Cleaning up orphan processes

(written by quest land watch)

@moq-bot
moq-bot Bot added this pull request to the merge queue Nov 2, 2026
@moq-bot

moq-bot Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

codex / Codex land fixer note:

The logged failure is an unused Io re-export in rs/moq-relay/src/listener.rs, with warnings denied. Base commit 1eaff23 introduced that re-export after this PR's branch point. This PR changes mux timing and quest documents, not the relay import or the failing check, so blame is unset. The pinned PR head remains unchanged. Its mux and relay tests passed with warnings denied and clippy-driver enabled; the relay library also passed clippy with no default features and warnings denied. The base should be checked independently.

(written by codex / Codex)

@moq-bot

moq-bot Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

quest land watch: re-enqueued this pull request at 384dd9c, at the back of the merge queue, unchanged, since the land fixer judged the failure flaky: test rs: moq-relay unused import &#96;Io&#96; (warnings denied).

(written by quest land watch)

@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Nov 2, 2026
@moq-bot

moq-bot Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

quest land watch: the merge queue removed this pull request at 384dd9c because its merge_group build failed (failed_checks).

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.

Queue / Queue (job) failure at step Check:

…til v0.1.21
   Compiling rcgen v0.14.10
   Compiling futures v0.3.34
   Compiling tower-http v0.6.11
   Compiling hyper-rustls v0.27.10
   Compiling kio v0.6.2 (/var/cache/github-runner-work/moq/moq/rs/kio)
   Compiling ebml-iterable v0.7.1
   Compiling wayland-backend v0.3.17
   Compiling tokio-tungstenite v0.30.0
   Compiling moq-net v0.3.10 (/var/cache/github-runner-work/moq/moq/rs/moq-net)
   Compiling webm-iterable v0.7.1
   Compiling moq-congestion v0.1.0 (/var/cache/github-runner-work/moq/moq/rs/moq-congestion)
   Compiling reqwest v0.13.5
   Compiling mdns-sd v0.21.5
   Compiling x509-parser v0.18.1
   Compiling moq-quic v0.1.0 (/var/cache/github-runner-work/moq/moq/rs/moq-quic)
   Compiling wayland-client v0.31.15
   Compiling regex-automata v0.4.18
   Compiling wayland-protocols v0.32.13
   Compiling x11rb v0.14.0
   Compiling wayland-csd-frame v0.3.0
   Compiling wayland-cursor v0.31.14
   Compiling regex v1.13.1
   Compiling wayland-protocols-wlr v0.3.12
   Compiling axum v0.8.9
   Compiling calloop v0.13.0
   Compiling bindgen v0.70.1
   Compiling calloop-wayland-source v0.3.0
   Compiling dimpl v0.7.4
   Compiling tempfile v3.27.0
   Compiling smithay-client-toolkit v0.19.2
   Compiling moq-vaapi v0.1.0
   Compiling wayland-protocols-plasma v0.3.12
   Compiling md-5 v0.11.0
   Compiling moka v0.12.16
   Compiling sctk-adwaita v0.10.1
   Compiling object_store v0.14.2
   Compiling str0m-proto v0.7.0
   Compiling winit v0.30.13
   Compiling glib v0.22.10
   Compiling http-cache v1.0.0-alpha.8
   Compiling str0m-aws-lc-rs v0.6.0
   Compiling is v0.11.1
   Compiling gstreamer v0.25.4
   Compiling reqwest-middleware v0.5.2
   Compiling calloop v0.14.5
   Compiling retina v0.4.21
   Compiling calloop-wayland-source v0.4.1
   Compiling str0m v0.24.1
   Compiling http-cache-reqwest v1.0.0-alpha.9
   Compiling srt-tokio v0.4.4
   Compiling gstreamer-base v0.25.4
   Compiling moq-auth v0.2.1 (/var/cache/github-runner-work/moq/moq/rs/moq-auth)
   Compiling axum-server v0.8.0
   Compiling wayland-protocols-experimental v20250721.0.1
   Compiling wayland-protocols-misc v0.3.12
   Compiling smithay-client-toolkit v0.20.0
   Compiling gstreamer-audio v0.25.4
   Compiling moq-ice v0.1.0 (/var/cache/github-runner-work/moq/moq/rs/moq-ice)
   Compiling uniffi_pipeline v0.32.2
   Compiling clap v4.6.7
   Compiling uniffi_meta v0.32.2
   Compiling smithay-clipboard v0.7.3
   Compiling cbindgen v0.29.4
   Compiling rind-object-store v0.1.2
   Compiling arboard v3.7.0
   Compiling egui-wgpu v0.36.2
   Compiling egui-winit v0.36.2
   Compiling moq-c v0.7.0 (/var/cache/github-runner-work/moq/moq/rs/moq-c)
   Compiling uniffi_macros v0.32.2
   Compiling moq-shaper v0.0.1 (/var/cache/github-runner-work/moq/moq/rs/moq-shaper)
   Compiling proptest v1.12.0
   Compiling uniffi v0.32.2
   Compiling eframe v0.36.2
   Compiling moq-json v0.5.8 (/var/cache/github-runner-work/moq/moq/rs/moq-json)
   Compiling moq-loc v0.2.19 (/var/cache/github-runner-work/moq/moq/rs/moq-loc)
   Compiling qmux v0.7.0 (/var/cache/github-runner-work/moq/moq/rs/qmux)
   Compiling moq-archive v0.0.11 (/var/cache/github-runner-work/moq/moq/rs/moq-archive)
   Compiling hang v0.21.11 (/var/cache/github-runner-work/moq/moq/rs/hang)
   Compiling moq-stats v0.2.12 (/var/cache/github-runner-work/moq/moq/rs/moq-stats)
   Compiling moq-tokio v0.19.23 (/var/cache/github-runner-work/moq/moq/rs/moq-tokio)
   Compiling moq-mux v0.10.11 (/var/cache/github-runner-work/moq/moq/rs/moq-mux)
   Compiling moq-relay v0.17.2 (/var/cache/github-runner-work/moq/moq/rs/moq-relay)
   Compiling moq-video v0.1.10 (/var/cache/github-runner-work/moq/moq/rs/moq-video)
   Compiling moq-audio v0.1.10 (/var/cache/github-runner-work/moq/moq/rs/moq-audio)
   Compiling moq-hls v0.5.11 (/var/cache/github-runner-work/moq/moq/rs/moq-hls)
   Compiling moq-rtc v0.3.12 (/var/cache/github-runner-work/moq/moq/rs/moq-rtc)
   Compiling moq-rtmp v0.3.11 (/var/cache/github-runner-work/moq/moq/rs/moq-rtmp)
   Compiling moq-rtsp v0.1.0 (/var/cache/github-runner-work/moq/moq/rs/moq-rtsp)
warning: associated function `new` is never used
  --> rs/moq-relay/src/auth/caps.rs:91:16
   |
89 | impl Pacer {
   | ---------- associated function in this implementation
90 |     /// Pace a live connection by calling `apply` with each new set of caps.
91 |     pub(crate) fn new(apply: impl Fn(Caps) + Send + Sync + 'static) -> Self {
   |                   ^^^
   |
   = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default

   Compiling moq-srt v0.3.11 (/var/cache/github-runner-work/moq/moq/rs/moq-srt)
   Compiling moq-scene v0.1.0 (/var/cache/github-runner-work/moq/moq/rs/moq-scene)
   Compiling moq-gst v0.4.12 (/var/cache/github-runner-work/moq/moq/rs/moq-gst)
   Compiling moq-carla-bridge v0.1.0 (/var/cache/github-runner-work/moq/moq/demo/carla/bridge)
error: `moq-relay` (lib) generated 1 warning
error: warnings are denied by `build.warnings` configuration
warning: build failed, waiting for other jobs to finish...
      Timing report saved to /var/cache/github-runner-work/moq/moq/target/cargo-timings/cargo-timing-20261102T110748957Z-efcac1b57bcf5093.html
error: command `/nix/store/85lxjwg78jw6rf7pqkf3vcq6291nrlfh-cargo-1.98.1-x86_64-unknown-linux-gnu/bin/cargo '--color=auto' test --no-run --message-format json-render-diagnostics --package 'path+file:///var/cache/github-runner-work/moq/moq/demo/carla/bridge#moq-carla-bridge@0.1.0' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/hang#0.21.11' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-audio#0.1.10' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-boy#0.5.12' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-c#0.7.0' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-cli#0.14.2' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-ffi#0.4.12' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-gst#0.4.12' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-hls#0.5.11' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-mux#0.10.11' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-rtc#0.3.12' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-rtmp#0.3.11' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-rtsp#0.1.0' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-scene#0.1.0' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-srt#0.3.11' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-studio#0.1.0' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-transcode#0.1.10' --package 'path+file:///var/cache/github-runner-work/moq/moq/rs/moq-video#0.1.10' --package moq-video --package moq-audio --tests --features 'moq-video/capture moq-audio/capture moq-audio/playback moq-cli/play moq-cli/openh264' --timings --locked` exited with code 101
mbx[cache]: object cache: 75 hits, 24 misses, 4 not looked up, 2 bypassed; 0 B downloaded, 0 B uploaded, 1.3 GiB stored locally
mbx[cache]: 1m 12s session; 3m 7s estimated compiler time avoided (summed across compilations)
mbx[cache]: 4 compilations had no usable prior inputs or matching prediction for a lookup
mbx[cache]: bypass reasons: 2 unsupported-crate-type
mbx[cache]: Cargo artifact reuse and CI cache archive transfers are not included above
mbx[savings]: 8d 5h saved across 11727 builds. put it toward something with a progress bar.
error: recipe `test` failed on line 284 with exit code 101
error: recipe `test-changed` failed on line 82 with exit code 101
##[endgroup]
ci: seconds per module
    62  check rs
    73  test rs (failed)
    13  check markdown
     8  check gh
    58  test gh
     0  check drill
     2  check quest
    19  check shell
     0  check large_files
     1  check toml
     0  check nix
     0  check justfile
   136  wall time
error: recipe `ci` failed on line 107 with exit code 101
##[error]ci: test rs failed
##[error]Process completed with exit code 101.
##[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: b1d70e717d188c87ee0867d8647cce0a9d3169fd
  CHECK_FAIL_FAST: 1
  NEXTEST_TEST_THREADS: 24
  MBX_CACHE_LINKS: 1
  MBX_REMOTE_URL: 
##[endgroup]
With the provided path, there will be 4 files 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 239615
Finished uploading artifact content to blob storage!
SHA256 digest of uploaded artifact is 066e75e59a5ed7c2cf9ffe6bb9f376366154aee7d71fdcf7c4ccf85cde0c5d2e
Finalizing artifact upload
Artifact cargo-timings successfully finalized. Artifact ID 13135273055
Artifact cargo-timings has been successfully uploaded! Final size is 239615 bytes. Artifact ID is 13135273055
Artifact download URL: https://github.com/moq-dev/moq/actions/runs/41434106320/artifacts/13135273055
Post job cleanup.
##[start-action display=Run jdx/mr-boxington-action@47ce49b32025d93a7a2f4570815afaa2b7092240;id=__04b46462-1c62-4c4a-9907-dec19e16b759.mbx]
##[end-action id=__04b46462-1c62-4c4a-9907-dec19e16b759.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/38918b1f-e1ad-4125-b185-ff70cc09f2e9' 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 128 objects and 34 action results (1.4 GiB logical); 49.8 GiB logical remain
dropped 2 stale checkout records
dropped 6 session event streams
removed 0 learned incremental units and 2 checkout directories (3.7 KiB logical); 140 units (4.7 GiB logical) remain
evicted 0 objects and 0 action results (0 B logical); 49.8 GiB logical remain
removed 2 target directories (13.7 MiB logical, 2 abandoned and 0 live); 16.7 GiB logical remain
Cleaning up orphan processes

(written by quest land watch)

@moq-bot

moq-bot Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

codex / Codex land fixer note:

The failure comes from relay code already on base, which this PR does not modify. No PR blame is assigned. The PR merges cleanly with base; its branch remains at the pinned head.

Failure log excerpts:

1016: warning: associated function new is never used
1017: --> rs/moq-relay/src/auth/caps.rs:91:16
1031: error: moq-relay (lib) generated 1 warning
1032: error: warnings are denied by build.warnings configuration

On a detached merge with base, CARGO_BUILD_WARNINGS=deny cargo check --locked -p moq-relay --no-default-features reproduced that warning and failed. CARGO_BUILD_WARNINGS=deny cargo test --locked -p moq-mux --tests passed: 1961 passed, 3 ignored, including an_unmarked_step_keeps_the_export_rendering. The broader command LOCAL_SUPERVISED=1 bash sh/rs/select.sh test /tmp/quest-7221-paths failed locally with "The system library alsa required by crate alsa-sys was not found." ALSA exists in the Nix store but was absent from the package search path.

The required checks cannot pass as supplied, so this is a handback for base lint repair and a fresh validation run.

(written by codex / Codex)

@moq-bot

moq-bot Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

codex / Codex land fixer: CARGO_BUILD_WARNINGS=deny cargo check --locked -p moq-relay --no-default-features failed: "warning: associated function &#96;new&#96; is never used" at rs/moq-relay/src/auth/caps.rs:91; "error: warnings are d. Recommendation: Fi·x the base relay constructor lint for builds without QUIC listener features, then rerun the selected Rust tests and retry this unchanged PR.

warning: associated function `new` is never used
  --> rs/moq-relay/src/auth/caps.rs:91:16
   |
89 | impl Pacer {
   | ---------- associated function in this implementation
90 |     /// Pace a live connection by calling `apply` with each new set of caps.
91 |     pub(crate) fn new(apply: impl Fn(Caps) + Send + Sync + 'static) -> Self {
   |                   ^^^
   |
   = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default

   Compiling moq-srt v0.3.11 (/var/cache/github-runner-work/moq/moq/rs/moq-srt)
   Compiling moq-scene v0.1.0 (/var/cache/github-runner-work/moq/moq/rs/moq-scene)
   Compiling moq-gst v0.4.12 (/var/cache/github-runner-work/moq/moq/rs/moq-gst)
   Compiling moq-carla-bridge v0.1.0 (/var/cache/github-runner-work/moq/moq/demo/carla/bridge)
error: `moq-relay` (lib) generated 1 warning
error: warnings are denied by `build.warnings` configuration

(written by codex / Codex)

@kixelated
kixelated marked this pull request as draft November 2, 2026 15:59
kixelated added a commit that referenced this pull request Nov 2, 2026
#7539 landed, so quic-lb-forward-extras drops its Required on the deleted
relay-quic-lb-forward quest. Follow-ups that extend still-open quest PRs
now require them: ts-small-step-back (#7221), quic-long-type (#7492), and
ts-idle-jitter (#7504). release-fanout-bench notes #7493 landed.

Apply the pending edits whose PRs have landed: lite-07 ranges drops its
fetch-range Required (#7545 landed the miss judging and cached backfill)
and records #7207's range-identity question; quic-lock-contention records
#7531's recommendation to keep the Mutex and RefCell.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
kixelated and others added 3 commits November 3, 2026 15:58
# Conflicts:
#	quest/m1/ts-reliability/README.md
…ves it

A TS export counts an unmarked step back of more than its delay as a
restart only where a reorder bound proves the frame falls outside valid
reordering: audio, which never reorders, and video that follows more
frames than its catalog `reorder` depth declares. Video that declares no
depth is left untouched, so a slow, deep B-frame stream is never mistaken
for a step (maintainer decision 2026-11-03).

Drops the time bounds the inferred clock lent the check (its observed
reach, the SPS lookahead and the catalog jitter), which only guessed, and
the `DecodeClock::reach` accessor they needed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated

Copy link
Copy Markdown
Collaborator Author

Design change: an unmarked step back is now detected only where a reorder bound proves the frame falls outside valid reordering (maintainer decision 2026-11-03).

  • Video counts a step only when its rendition declares a catalog reorder, and the frame follows more frames than that depth in presentation order (DeclaredClock::reorders_past), more than the export's delay below the highest PTS on the timeline.
  • Video with no declared reorder is left untouched: no detection, no rewrite, no error. The inferred clock's time bounds (its observed reach, the SPS lookahead, the catalog jitter) are gone from the check, because they could only guess, and so is the DecodeClock::reach accessor.
  • Audio never reorders, so a step back of more than the delay still counts, as before.

This settles the pullfrog finding on an undeclared deep B-pyramid. An undeclared rendition can no longer fabricate a restart, because it is never checked. undeclared_reordering_never_steps_back pins the reproduced 0, 1600, 800 ms case at a 500 ms delay, plus a −560 ms step, both at zero steps.

A step back within the delay stays out of scope here. quest/m1/ts-small-step-back.md owns it and is now unblocked.

(Written by Claude Opus 5.5)

@kixelated kixelated changed the title fix(mux): a TS export re-acquires on a small unmarked step back fix(mux): a TS export re-acquires on an unmarked step back a reorder bound proves Nov 4, 2026
@kixelated
kixelated marked this pull request as ready for review November 4, 2026 00:27
@kixelated
kixelated added this pull request to the merge queue Nov 4, 2026

@kixelated kixelated left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review by review (OpenAI)

Reviewed head: d350999

The revised detector addresses the earlier undeclared B-pyramid concern: it no longer synthesizes a video restart without a declared reorder depth, and the new cases cover both valid deep reordering and an undeclared step. No additional actionable finding in the changed detector. This is consistent with the recorded maintainer decision; automatic recovery for undeclared video and steps within the delay remain outside this change.

Verification: GitHub-only static review of the detector, decode-clock reset, base-aware changes and regression cases. I did not run the tests or reproduce the timing behavior.

(Written by review, OpenAI)

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found.

Reviewed changes

  • Step detection limited to a proven bound — Track::steps_back now counts a frame as a synthetic marker only when it is more than delay below the highest PTS under the same restart and a reorder bound rules out valid reordering: always for non-video (audio never reorders), and for Kind::Video only when the catalog declares reorder and DeclaredClock::reorders_past says the frame exceeds it.
  • Undeclared video is untouched — no detection, rewrite, or error, which resolves the earlier undeclared B-pyramid false restart.
  • Restart path reuse — steps joins pending.restart/pending.skip so the recovery gap is unchanged, and queue's restart branch now clears keyframe/leading_floor so frames after the step are not judged against the timeline left behind.
  • reorders_past factored out — DeclaredClock::push's depth test is shared (behavior-preserving).
  • Tests — a_declared_reorder_bounds_a_step_back pins the four depth-2 cases, undeclared_reordering_never_steps_back pins the untouched path, and an_unmarked_step_keeps_the_export_rendering now covers the declared −560 ms step on both clocks at three audio lags.
  • Quest — deletes the finished step-back.md, records the maintainer decision in the epic, and unblocks ts-small-step-back.md.

I traced the restart counter (base.0 + source.markers() + steps), the high gate across markers, resubscribe (base absorbs old markers), rebind (continuing preserves them), and the mid-group reset to the inferred clock; the synthetic restart is observed once and keeps loss-recovery accounting unchanged. Steps within the delay and undeclared video remain out of scope as documented.

Pullfrog  | View workflow run | Using deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏

@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Nov 4, 2026
@moq-bot

moq-bot Bot commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

quest land watch: the merge queue removed this pull request at d350999 because it conflicts with main (merge_conflict).

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)

@moq-bot
moq-bot Bot enabled auto-merge November 4, 2026 01:16
@moq-bot

moq-bot Bot commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

quest land watch: armed auto-merge on this pull request at 6e0c077, so it joins the back of the merge queue once its required checks pass, with main at 55d5a14 merged in by the quest merge driver.

(written by quest land watch)

@moq-bot
moq-bot Bot added this pull request to the merge queue Nov 4, 2026
Merged via the queue into main with commit c798f77 Nov 4, 2026
9 of 10 checks passed
@moq-bot
moq-bot Bot deleted the quest/m1/ts-reliability/step-back branch November 4, 2026 02:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant