quest(archive): per-track timelines and replay catalog - #4168
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 623e96081c
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 4320405cb4
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 5b4dfcfe79
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
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>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 0c835d3c6b
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9f9b25e102
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| minimum and maximum duration (roughly 1s and 10s), splitting a long-lived | ||
| group by frame at the maximum. Manual cuts stay as an optimization, such as a | ||
| video keyframe cutting audio so derived segments need fewer objects. | ||
| - A stored object may hold a frame range of a group, not only whole groups. |
There was a problem hiding this comment.
Add a distinct object key for each frame slice
The revised browser plan now defers to the Rust writer's keys, but this line still leaves the recording layout as groups/<largest>.<smallest> in quest/m1/archive/README.md:74-90. When one long-lived group is split at successive maximum-duration cuts, every immutable slice has the same <g>.<g> key, so the second PUT must either collide or overwrite the earlier frames, and recovery cannot identify the requested frame range. Define a frame-aware or per-record object identity in the core format and draft before making sliced groups a requirement.
Useful? React with 👍 / 👎.
| - **Writer and reader:** commit each track independently, and store frame | ||
| ranges so a never-closing group is recorded. Bump the recording `version` and | ||
| refuse the old one. Recovery, grace deletion, and FETCH replay follow the | ||
| per-track index. |
There was a problem hiding this comment.
Support extending fetched groups before promising replay
When import archive --follow first serves an early slice of an open group and later frames of that same sequence are recorded, the current moq-net cache cannot expose the new slice: TrackState::covering_group treats a cached group whose first frame precedes frame_start as complete (rs/moq-net/src/model/track.rs:442-451), claim_sequence rejects replacing it (:793-812), and the archive reader finishes every fetched producer (rs/moq-archive/src/reader/mod.rs:319-332). A later FETCH therefore returns the already-finished prefix and never reaches storage. The quest needs to include a source-level moq-net cache/replay change or choose a representation that does not reuse a group sequence across independently arriving slices.
Useful? React with 👍 / 👎.
| - **HLS and DASH:** take segment boundaries from a reference video rendition | ||
| (an audio one when the broadcast has no video), near a target duration, and | ||
| number them so every edge and every reload agrees, including after DVR pops. Every other video rendition snaps each | ||
| boundary to its nearest group start within a tolerance (around 1s); a |
There was a problem hiding this comment.
Keep reference boundaries stable across catalog changes
When the selected reference rendition is removed, reconfigured, or superseded by a newly added rendition, an existing edge and an edge joining afterward can select different reference timelines and derive different segment boundaries and numbers for the same media. Rendition membership is explicitly dynamic through Added and Removed events in rs/moq-hls/src/export/renditions.rs:452-477, while a late catalog subscriber does not have the prior selection, so the stated guarantee that every edge and reload agrees cannot follow from an unspecified current "reference video rendition." Persist a stable reference or boundary epoch, or derive boundaries independently of current rendition membership, and test reference removal/replacement.
Useful? React with 👍 / 👎.
|
Merged into the archive line. Adds the Per-track timelines questline (Rust core [XL], JS mirror [M]) and the Replay catalog quest, and points DVR rewind, Archive proof, and Browser archive at the per-track format. All Codex findings were addressed; the maintainer chose to merge before a fifth review round. (Written by Claude Opus 5.5) |
Problem
#4155 made
moq-hlslist a durable timeline past--window, but the stock CLI chain can't use it:moq import archiveserves the recorded catalog only through FETCH, and nothing setsstore. Scoping that exposed a deeper gap. One aligned timeline numbers every track's segments, so a DVR expires a static catalog with the first video segment. The writer also never stores a group that never closes.Approach
archiveentry maps each track to its timeline.main; nothing has users yet.storeandversion, so export archive → import archive → export hls serves the whole recording. It requires the Rust core.archive.replay.Impact
Alternatives
moq_json::windowpops only from the front, so it can't keep an old catalog record while dropping video.Follow-ups
(Written by Claude Opus 5.5)
🤖 Generated with Claude Code