Skip to content

quest: settle typed-timedness object stamps, plan the HLS first catalog - #4836

Merged
kixelated merged 4 commits into
mainfrom
quest/plan-2026-10-05-timedness-hls
Oct 5, 2026
Merged

kixelated merged 4 commits into
mainfrom
quest/plan-2026-10-05-timedness-hls

Conversation

@kixelated

Copy link
Copy Markdown
Collaborator

Problem

quest/m1/typed-timedness.md (#4835) left open what a receiver does with object-scope timing on an IETF track accepted as untimed (imquic publishes this way), and didn't say which PR rewrites the timestamp draft. Separately, moq-hls import can publish its first catalog with only the first rendition (found by Dryvnt in #4824), and no quest tracks it.

Approach

Quests only:

  • typed-timedness: timestamps are all-or-nothing per track on the wire too. Object-scope TIMESCALE/Timestamp on an untimed track are ignored; on a TIMESCALE track, an object with no TIMESTAMP is malformed (moq-transport's malformed-track rules); object-scope overrides are never applied. Its PR updates drafts/draft-lcurley-moq-timestamp.md (SHOULD stamp becomes required, arrival-time fallback becomes malformed, overrides dropped) and checks the lite draft.
  • untimed-model: agrees with the above, and its draft work narrows to the remaining arrival-time mandates (no TIMESCALE, before properties arrive).
  • New hls-first-catalog [XS], ranked right after import-first-frame: hold moq-hls import's first catalog until every rendition from the master playlist is reserved, with a regression test.

Maintainer decisions (2026-10-05)

Object stamps on an untimed IETF track (imquic)

  • ✅ Ignore
  • Refuse
  • Decide in the mock-up

Missing TIMESTAMP on a TIMESCALE track

  • ✅ Malformed, reset/refuse
  • Repeat the latest timestamp
  • Arrival-time fallback

When the drafts change

  • ✅ With the implementation (typed-timedness PR)
  • A draft PR now

moq-hls first catalog

  • ✅ m1 [XS]
  • Skip

Impact

  • Public API and wire: none from this PR (quests only).
  • The planned typed-timedness PR changes receive semantics on published IETF drafts: object-scope stamps on an untimed track are ignored, and a TIMESCALE track missing a TIMESTAMP is malformed.

Alternatives

Listed under each decision above.

Follow-ups

  • typed-timedness now carries the IETF receive rule and draft edits on top of the type mock-up; it may deserve [M] instead of [S].
  • Before landing typed-timedness, check which objects the malformed rule covers (status-only objects, empty LOC end markers) and that our publishers and TIMESCALE-sending interop peers stamp every covered object.

(Written by Claude Opus 5.5)

🤖 Generated with Claude Code

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated
kixelated marked this pull request as ready for review October 5, 2026 18:02
@coderabbitai

coderabbitai Bot commented Oct 5, 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 11 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
  • Configuration used: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 9b56b39a-76aa-430b-8103-9d991784f415
📥 Commits

Reviewing files that changed from the base of the PR and between fa1d23e and cce75b0.

📒 Files selected for processing (4)
  • quest/m1/README.md
  • quest/m1/hls-first-catalog.md
  • quest/m1/typed-timedness.md
  • quest/m1/untimed-model.md
  • Autopilot · 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

Comment @coderabbitai help to get the list of available commands.

It now carries the IETF receive rules and the timestamp-draft edits on
top of the type mock-up.

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

@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.

👍 No actionable findings in the quest-only changes at 4168258. Checked the timing decisions and draft ownership against the related Rust/JS quests and timestamp draft, and traced the HLS reservation proposal through TrackState::ensure_map, Import::step, and the catalog reservation gate. The status-only/empty-object applicability question is explicitly retained for implementation validation.

Validation: quest check passed (474 documents); git diff --check passed. No runtime tests run because this PR changes plans only.

Public API/wire impact: none in this PR; the planned breaking API and IETF receive-semantics changes are documented.

(Written by GPT-6)

@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: 4168258

No actionable defect found. Overall direction is coherent: the pass-scoped HLS catalog hold addresses lazy, sequential rendition reservation without tying publication to the shared Input lifetime. The timedness quests consistently assign receive semantics and draft ownership. The status-only/empty-marker coverage check remains an explicit prerequisite before implementing the malformed-object rule.

Verification limits: reviewed the complete four-file diff against 4d207b3 and relevant HLS code, timestamp draft, and adjacent import/clock quests. The update since the earlier read-only inspection at 0bb78f8 only changes typed-timedness's estimate from [S] to [M]; base is unchanged. Documentation-only review; no runtime tests or external-peer interoperability checks executed.

@kixelated

Copy link
Copy Markdown
Collaborator Author

Grok review: MERGE (full review, head 4168258a41607f3a55c12f185cdfe2d8831fd052)

Quest-only PR. I checked the claims against main. The moq-hls description matches the code: TrackState::ensure_map mints each importer through Sink::importer, which calls catalog.reserve() (rs/moq-hls/src/import.rs:318-322, :504-528), and step already holds a pass-wide timeline().reserve() with the quoted comment (:727-732). The timestamp-draft rules being changed also match their current text (drafts/draft-lcurley-moq-timestamp.md:87, :111-113). All links resolve. CI (Check, Quest, Test) was still running when I looked.

No blocking issues. Non-blocking:

  1. Open feat(net)!: carry untimed tracks faithfully #4822 implements the opposite object-scope rule (typed-timedness.md:43-61). Dryvnt's #4822 (open, currently conflicting) rewrites the same draft so that "an object-scope TIMESCALE applies on a track without one, and a publisher MAY send one there". It also makes the Rust publisher write object-scope Timescale on every timed object for drafts 14-16, and on a relay that serves a track without its own TIMESCALE (doc/concept/standard.md and tests/untimed.rs::object_units_keep_a_frame_timed_without_track_units in that PR). If both land as written, our own receivers would ignore the timing our own relays and draft-14-16 publishers send, and the typed-timedness PR would have to undo feat(net)!: carry untimed tracks faithfully #4822's draft edits instead of the main text this quest describes. It's worth a line here naming feat(net)!: carry untimed tracks faithfully #4822, saying it must drop object-scope reading and writing (or that typed-timedness reverts it), and stating the result: drafts 14-16 stay untimed from us, since they can't carry TIMESCALE.
  2. The draft has a fourth per-object rule this quest doesn't list (typed-timedness.md:57-60). draft-lcurley-moq-timestamp.md:84 lets a LOC-implementing receiver read a bare Timestamp on a track with no TIMESCALE as microseconds. That conflicts with "the track stays untimed". Either add it to the rules that change, or say it survives.
  3. "says so" reads as present tense (typed-timedness.md:19-25). Today the draft says the opposite: arrival-time fallback for a missing Timestamp (:112), and the override applies (:87). "...and the draft must say so" would keep an implementer from thinking this is already specified.
  4. The malformed rule versus keep-alives (typed-timedness.md:68-71). The current draft explicitly exempts "keep-alives or gap markers" as intentionally unstamped objects on a TIMESCALE track (:112). Add those to the "which objects the rule covers" check next to status-only objects and LOC end markers, so the draft rewrite doesn't make a deliberately unstamped gap marker reset the track.
  5. The HLS goal promises more than the guidance delivers (hls-first-catalog.md:5-7 vs :27-31). A hold that ends with the first pass can't cover a rendition whose playlist has no segments yet. That rendition never reaches an EXT-X-MAP, so ensure_map never runs. Nor can it cover one whose init fetch fails under OnError::Warn. The guidance is right not to wait for those. Narrowing the goal to "every rendition that loads its init segment in the first pass" makes the regression test's target exact. Also worth a sentence: the hold has to be taken after ensure_tracks and before the first ingest, the same spot as the timeline reservation.

The latest push (0bb78f8e...4168258a) only resizes typed-timedness from [S] to [M], which matches the body's own follow-up.

Verdict: MERGE. Item 1 is the one worth settling before either PR lands.

This is an automated review, not the maintainer's decision
(Written by Grok)

@kixelated

Copy link
Copy Markdown
Collaborator Author

Landing. Merged main in (clean, quest check passes with 475 documents) and applied the Grok review's non-blocking notes as wording fixes, with no change to the decisions:

  • typed-timedness: the timestamp draft "must say so (today it says the opposite)", since the current text still has the arrival-time fallback. A fourth draft rule now changes too: a LOC receiver may no longer read a bare Timestamp on a track without TIMESCALE as microseconds, because that track stays untimed. The malformed-rule coverage check also lists the keep-alives and gap markers the draft exempts today.
  • hls-first-catalog: the goal is narrowed to renditions that load their init segment in the first pass. The hold goes after ensure_tracks and before the first ingest, next to the timeline reservation. A rendition with no segments, or one whose init fetch fails under OnError::Warn, does not withhold the catalog.
  • Review item 1 (feat(net)!: carry untimed tracks faithfully #4822 doing the opposite) was already covered: both typed-timedness and untimed-model say feat(net)!: carry untimed tracks faithfully #4822 waits on and adapts to this shape, and ietf-timestamp-units already plans for drafts 14-16 to go out untimed.

(Written by Claude Opus 5.5)

@kixelated
kixelated enabled auto-merge October 5, 2026 19:02
@kixelated
kixelated disabled auto-merge October 5, 2026 19:02
@kixelated
kixelated enabled auto-merge (squash) October 5, 2026 19:02
@kixelated
kixelated merged commit 58affea into main Oct 5, 2026
5 checks passed
@kixelated
kixelated deleted the quest/plan-2026-10-05-timedness-hls branch October 5, 2026 19:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant