Skip to content

quest: a path is the only content identity - #4761

Merged
kixelated merged 3 commits into
mainfrom
claude/quest-path-identity
Oct 4, 2026
Merged

kixelated merged 3 commits into
mainfrom
claude/quest-path-identity

Conversation

@kixelated

Copy link
Copy Markdown
Collaborator

Summary

Planning for #4741, which makes a path, with its @<uuidv7> epoch, the only content identity. Quest changes only; nothing outside quest/.

  • Broadcast epochs move to m0 (quest/m0/broadcast-epoch/), ranked after Wildcard as a new identity track, and gate the next release: since fix(net)!: resume route changes by reading the routes' copies; a path is one broadcast #4741, a publisher that restarts its groups under the same name resumes into the old broadcast and stalls viewers. fix(net)!: resume route changes by reading the routes' copies; a path is one broadcast #4741 can merge to main; no release ships until first-party publishers mint epochs. moq.pro pins release, so the gate covers it too.
  • Remove --hop joins that line (quest/m0/broadcast-epoch/hop-removal.md): an optional --epoch replaces --hop/MOQ_HOP/--origin and is minted per run when omitted. A plain publisher declares a random Hop ID per process, and --cluster-id stops falling back to --hop. Folded in: drop the per-session hop stamp, and remove NO_CAPACITY (every refusal is terminal) from code, js/net, and the in-progress lite-07 and cluster-02 drafts.
  • New m1 quest: Transcoders start at group boundaries. A subscription at (N, M>0) starts at (N+1, 0), a mid-group FETCH is refused, and output mirrors source groups, so two transcoders are interchangeable.
  • Wildcard: double claims are settled by interchangeable output (group-boundary starts, deterministic catalog), not route identity. The lite-07 reply Origin and the "never splice across Origins" rule are dropped. The line branch must remove its Origin/Identity/Pin code and feat(net): re-resolve once on a NO_CAPACITY refusal #4050's NO_CAPACITY re-resolution when it next merges main.
  • Reconciled:
    • same-epoch importers;
    • cluster-routing (selection, routes, multi-cdn, route-trust);
    • route-wakes (no pin sets);
    • ietf-cluster-off (topology rationale only);
    • untimed-model, transport-upgrade, JS track handover, 2991;
    • m2 ietf-cluster-peers, m2 p2p cost-scopes, m3 routing-cost-domains.

The moq.pro half is moq-dev/moq.pro#2165.

Open for review

Decisions (2026-10-03 planning interview)

Goal. Proposed: "Nothing in moq or moq.pro treats who published a route as what it carries: a path (with its @epoch) is the only content identity, and every first-party publisher that can restart mints a fresh epoch, so dropping identity in #4741 stalls nobody."

  • ✅ Yes, as stated
  • Narrower: identity only
  • Broader: all hop semantics

Scope (multi-select)

  • ✅ Publishers mint epochs
  • ✅ --hop becomes --epoch
  • Drop hop stamping (initially out: "keep stamping hops to avoid routing loops"; reversed below)
  • ✅ Reconcile stale plans

Priority of the broadcast-epoch line

Wildcard double claims

  • Worker epoch in the path
  • Keep Origin for claim output
  • Prevent double claims
  • ✅ Other: "Could we make transcoders deterministic? That's already kind of a requirement since we advertise the catalog ahead of time."

A plain publisher's Hop ID after --hop goes

  • ✅ Random per process
  • Declare nothing (0)

NO_CAPACITY re-resolution

  • The refusing route
  • Drop re-resolution
  • Leave to wildcard line
  • ✅ Other: "remove NO_CAPACITY I don't want it."

What "deterministic" transcoders means

  • Framing, accept a glitch
  • Bit-exact output
  • Framing plus a lease
  • ✅ Other: "transcoding MUST start at group boundaries. If you subscribe to a transcoder at (N, M), then it will actually start at (N+1, 0)"

Stamping (first asked; answered "It means we would not advertise a route back to the original publisher"; checked: split horizon rests on via and own-hop checks, and the stamp never equals any id, so it doesn't)

  • ✅ Drop stamping
  • Keep stamping

moq.pro recording key

  • ✅ Key by full epoch path
  • One recording per name

moq.pro 0.16 adoption

  • ✅ moq.pro questline gates it
  • Bump first, fix after

Transcoder rule placement

  • ✅ Upstream quest + moq.pro quest
  • moq.pro only

moq.pro milestone

  • ✅ m1
  • m0

Epoch line rank in upstream m0

  • ✅ After Wildcard
  • Right after Branch flip

Wildcard lite-07 reply Origin field

  • ✅ Drop it
  • Keep for observability

Stamping and NO_CAPACITY removal

  • One m1 quest
  • ✅ Fold into Remove --hop

Remove --hop placement

  • Stay in m1
  • ✅ Join m0

moq.pro derived services (overlay, voice response, .dash)

  • ✅ Mirror source, group-boundary
  • Every instance mints an epoch
  • Per service

(Written by Claude Opus 5.5)

🤖 Generated with Claude Code

Record the 2026-10-03 decisions that follow #4741 dropping first-hop
identity: broadcast epochs move to m0 and gate the next release, --hop
removal joins that line (with the hop stamp and NO_CAPACITY removed),
same-epoch importers re-key to --epoch, wildcard double claims are
settled by interchangeable output, and a new quest makes transcoders
start at group boundaries. Stale reply-Origin, first-hop, and resume.rs
references across the routing, handover, and untimed quests now match.

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

coderabbitai Bot commented Oct 3, 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 4 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: 0ab79f02-0096-41ef-a8e0-927369da14e4
📥 Commits

Reviewing files that changed from the base of the PR and between abfb00d and dfa7b7a.

📒 Files selected for processing (37)
  • quest/README.md
  • quest/m0/README.md
  • quest/m0/broadcast-epoch/README.md
  • quest/m0/broadcast-epoch/apps.md
  • quest/m0/broadcast-epoch/bindings.md
  • quest/m0/broadcast-epoch/gateways.md
  • quest/m0/broadcast-epoch/gst-obs.md
  • quest/m0/broadcast-epoch/hop-removal.md
  • quest/m0/broadcast-epoch/origin.md
  • quest/m0/broadcast-epoch/ts-restart.md
  • quest/m0/wildcard/README.md
  • quest/m1/2991-net-coalesce-dynamic-tracks-and-preserve-sequences-across.md
  • quest/m1/3021-moq-gst-anchor-generated-media-timelines-to-wall-clock.md
  • quest/m1/README.md
  • quest/m1/cluster-routing/README.md
  • quest/m1/cluster-routing/multi-cdn.md
  • quest/m1/cluster-routing/route-trust.md
  • quest/m1/cluster-routing/routes.md
  • quest/m1/cluster-routing/selection.md
  • quest/m1/e2ee/README.md
  • quest/m1/hop-aligned-import.md
  • quest/m1/hop-removal.md
  • quest/m1/ietf-cluster-off.md
  • quest/m1/js-group-handover.md
  • quest/m1/route-wakes.md
  • quest/m1/transcode-group-start.md
  • quest/m1/transport-upgrade/README.md
  • quest/m1/transport-upgrade/js.md
  • quest/m1/transport-upgrade/rust.md
  • quest/m1/untimed-model.md
  • quest/m2/README.md
  • quest/m2/catalog-tracks.md
  • quest/m2/ietf-cluster-peers.md
  • quest/m2/p2p/cost-scopes.md
  • quest/m2/quic-careful-resume.md
  • quest/m3/routing-cost-domains.md
  • quest/m3/rtsp-import.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.

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

P2: The new group-boundary rule needs to survive caching relays, not just requests reaching the transcoder (quest/m1/transcode-group-start.md:5-10). See the inline finding.

Direction: making epochs the content identity and gating the release on publisher migration is a useful simplification. Removing route identity is only safe once the replacement content contract holds end to end; deterministic catalogs and matching group numbers alone do not establish that. Make the cached-relay failover case a prerequisite of the wildcard double-claim change.

Verification: static review of the quest changes, current stats/transcoder publishing paths, and #4741's pump/cache implementation. No tests or live failover were run; this is a planning-contract finding, not a claim that an implementation test failed.

(Written by OpenAI)

Comment on lines +7 to +9
two encoders' output mid-group. moq-transcode (`rs/moq-transcode`, and
`moq transcode` in moq-cli) resolves a subscription that starts at (N, M>0)
to (N+1, 0), and refuses a FETCH that starts mid-group. Output groups mirror

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.

P2: Preserve the group-boundary restriction through cached relays. Suppose worker A and worker B produce different encoded bytes for group N at the same derived path, each behind a relay. A downstream has consumed A's frames 0..M, then switches to B's relay, which already cached B's whole group for another viewer. That relay can serve (N,M+1) directly without any request reaching the transcoder, so the rule here never runs. #4741's pump continues the existing group (even a partial frame) by index and assumes duplicate bytes are identical; its track cache also satisfies a covering mid-group FETCH directly. The result can combine A's keyframe/reference state with B's predictive frames. Require an end-to-end group-only resume contract that caches preserve, or byte-identical output / distinct identities, and add a two-caching-relay failover test rather than only direct transcoder SUBSCRIBE/FETCH tests.

@kixelated

Copy link
Copy Markdown
Collaborator Author

Review (dfa7b7a)

Moves broadcast epochs to m0 as a release gate for #4741's path-only identity, folds --hop/stamp/NO_CAPACITY removal into that line, adds the transcoder group-boundary quest, and retargets the dependent quests. Link retargeting after the m1→m0 move looks complete.

Blocking

None.

Non-blocking

  1. Wildcard double-claim → m1 dependency. quest/m0/wildcard/README.md now settles double claims by interchangeable output and points at quest/m1/transcode-group-start.md, but only as Related. Under fix(net)!: resume route changes by reading the routes' copies; a path is one broadcast #4741, two claim workers at one path can still be resumed mid-group until that m1 quest lands. Consider promoting it to Required on the Wildcard line (or noting the ship-order risk next to the double-claim decision) so m0 Wildcard cannot be treated as done without it.

  2. Stay vs fix(net)!: resume route changes by reading the routes' copies; a path is one broadcast #4741 cheaper-route takeover (already in Open for review). quest/m1/route-wakes.md keeps the Wildcard Stay rule (serving fronts move only on failover), while fix(net)!: resume route changes by reading the routes' copies; a path is one broadcast #4741 still takes a cheaper covering route. Docs are consistent with the Wildcard plan; just confirm Stay remains the intent once Wildcard merges onto the pump world.

  3. Stats epochs outside the release gate (already flagged). quest/m0/broadcast-epoch/README.md sends moq-stats to quest/m1/stats-epoch.md. If a release ships with fix(net)!: resume route changes by reading the routes' copies; a path is one broadcast #4741 + first-party epochs but without stats epochs, a restarted stats node under a reused name can still stall its viewers the same way. Worth an explicit "accepted for stats" (or gate) note on the release paragraph.

  4. quest/m1/qos/final-lag-sample.md still talks about spliced segments (already flagged). Will bitrot when fix(net)!: resume route changes by reading the routes' copies; a path is one broadcast #4741 deletes the splicer; fine to leave for a follow-up, but it is now stale relative to this planning pass.

  5. CI on this head: Check and Test are green; Auto-merge skipped (expected for docs).

Verdict: MERGE

Cross-check: #4741 still open (planning companion; prior Grok MERGE with NBs that epochs are still required — this PR is that plan). moq.pro#2165's blob/main/quest/m0/broadcast-epoch/ and quest/m1/transcode-group-start.md links become valid once this merges.

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

@kixelated

Copy link
Copy Markdown
Collaborator Author

Merge summary

Merged main in (clean) and addressed the Grok review on dfa7b7a:

  1. Wildcard double claims: added a ship-order note on the decision; transcode-group-start stays in m1 as Related rather than Required. Promoting it is left to the maintainer.
  2. Stay vs. cheaper-route takeover: no change; the Wildcard Stay rule stands until that line lands. Still open for confirmation.
  3. Stats epochs: the broadcast-epoch README now says moq-stats is outside the release gate and can stall viewers until Stats epochs lands. Whether to gate the release on it is open.
  4. final-lag-sample.md: left unchanged since it has open PR quest(qos): block the line on the #4298 splice lag findings #4381; a follow-up once fix(net)!: resume route changes by reading the routes' copies; a path is one broadcast #4741 lands.

#4741 stays open; nothing here depends on it merging.

(Written by Claude Opus 5.5)

@kixelated
kixelated enabled auto-merge (squash) October 4, 2026 05:42
@kixelated

Copy link
Copy Markdown
Collaborator Author

Re-review (7a78d36)

Follow-up after push from dfa7b7a1dc8cbe0d4293d3acf2b6da9379050d77. Merge of origin/main only brought unrelated release/#4656/#4733 churn; PR-unique change is quest: note ship-order and stats-epoch gaps from review.

Fixed since last review

  1. Wildcard ship-order — quest/m0/wildcard/README.md now states that until transcode-group-start lands, two workers at one path can still be spliced mid-group. Matches the prior NB's "note the ship-order risk" option (not promoted to Required).
  2. Stats epochs outside the gate — quest/m0/broadcast-epoch/README.md now explicitly accepts that a restarted stats node under a reused name can stall viewers until quest/m1/stats-epoch.md lands.

Still open (non-blocking)

  1. Stay vs fix(net)!: resume route changes by reading the routes' copies; a path is one broadcast #4741 cheaper-route takeover — still in Open for review; route-wakes Stay vs pump-world takeover until Wildcard lands.
  2. quest/m1/qos/final-lag-sample.md — still describes spliced segments that fix(net)!: resume route changes by reading the routes' copies; a path is one broadcast #4741 removes; fine as a follow-up.
  3. CI on this head — Check and Test still pending at review time.

Blocking

None.

Verdict: MERGE

Cross-check: #4741 still open (head b10620286798, prior Grok MERGE). moq.pro#2165 still open and depends on this landing for its upstream quest links.

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

@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 7a78d36; follow-up to dfa7b7a, excluding changes inherited from main.

The two new notes usefully expose the wildcard ship-order risk and the stats exception to the release gate. No new actionable bugs found in this delta.

P2 remains: the existing cached-relay finding is not addressed. wildcard/README.md:172–174 now limits the risk to “until that m1 quest lands,” but transcode-group-start.md:7–21 is unchanged and constrains only transcoder requests. A replacement relay with the other worker's group cached can still serve its suffix without contacting that worker, mixing encoder outputs within a group. I independently rechecked #4741's current resume.rs:833–859 and cached-fetch path; they still permit this.

Direction: keep the simpler path/epoch identity, but make an end-to-end group-boundary contract that survives caches, plus a two-caching-relay failover test, a prerequisite of treating claim workers as interchangeable. Otherwise require byte-identical output or distinct paths. The new warning alone does not close this correctness gap.

Verification: static delta and targeted contract/code review only; no tests or live failover run. Existing finding referenced rather than duplicated inline.

@kixelated
kixelated merged commit 51fb087 into main Oct 4, 2026
3 checks passed
@kixelated
kixelated deleted the claude/quest-path-identity branch October 4, 2026 05:50
kixelated added a commit that referenced this pull request Oct 4, 2026
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
kixelated added a commit that referenced this pull request Oct 5, 2026
Main's #4741 makes the path the only content identity, and the wildcard
README (#4761) drops the reply Origin. Take main's code for everything the
line built on Origin: SUBSCRIBE_OK/FETCH_OK Origin, track provenance, front
Identity and Pin (incl. Stay), the datagram hold behind SUBSCRIBE_START, the
JS origin hop, and their tests (pool_failover.rs, lite/origin.test.ts).

Re-applied on main's structure:
- route_order keys its hash on the requested path, so an equal-cost pool
  spreads its paths (Rust and JS spreadHash, pinned to match), plus the
  Spread Hash tie-break in the lite draft and relay cluster docs.
- NO_CAPACITY removed from the lite and cluster drafts and the JS
  StreamCode; a closed dynamic route rejects with Unroutable.
- The equal-cost pool churn benchmark, now with fronts following the
  newcomer as main's front does. The pool resolve bench is dropped: it
  relied on a refusal ending the front.
- js/watch counts hidden service claims when gating renditions.

Main's front still skips a refuser and re-selects (#4741), while the README
decides a refusal is final; the README now records that gap.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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