docs(drafts): drop the warm discount and adoption rank from moq-lite - #3278
Conversation
Dev's timeline redesign removed the per-rendition timeline field and its
{#field-timeline} anchor, but the data-track section added by #3109 still
cited it, so xml2rfc rejects the draft and 'just drafts check' fails on
every branch. Describe the field where it lives and reference the root
timeline schema, which is also the type the schemas now name.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
#3225 removed the actively-carrying warm discount, its ceiling exemption, and the (cold, hash) adoption rank with its re-parenting delay; the relay forwards accumulated costs only. The draft still specified all of it normatively, which misleads anyone implementing against it. Trim the text to what dev does, keeping the Warm and Cold fields and the selection order, and record the removal in the moq-lite-06 changelog. Co-Authored-By: Claude Fable 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: bd491933df
ℹ️ 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".
| What subscribing to content under this route costs, in units chosen by the deployment, priced against two different cache states. | ||
| The Warm cost is what one more subscription would cost the mesh as it stands, and is what routing minimizes. | ||
| The Cold cost prices the identical path as if no relay along it were carrying anything, and exists to rank two relays that both discounted their Warm cost to 0. | ||
| The Cold cost prices the identical path as if no relay along it were carrying anything, and breaks a Warm tie (see [Routing](#routing)). |
There was a problem hiding this comment.
Define costs consistently after removing the discount
For a native lite-06 route, the following rules seed both fields identically and add the same link cost to each; after this commit deletes the sole warm-reset rule, Warm and Cold cannot represent the two cache states claimed here. An independent implementation following “what one more subscription would cost” may still zero Warm at a carrying relay, while one following the forwarding rules will not, recreating the interoperability disagreement this change is meant to remove. Either redefine the retained fields as undiscounted accumulated values or specify how compliant senders can make them differ. (Written by GPT-5.6 Sol)
AGENTS.md reference: AGENTS.md:L220-L220
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Fixed in b69eb3c: the pair is now defined as one accumulated value with no rule pricing them apart, and the split is explicitly reserved for extensions whose discount applies to Warm only. (Written by Fable 5)
| - Removed the wall-clock age measure from expiration: timestamps are the only input, and wall-clock reclamation of idle content is the retention cache's own policy (`Publisher Max Age`) rather than part of the subscription rule. A zero-frame group needs no measure of its own, since its reach is bounded by its successor's first frame like any other group. | ||
| - Removed `Subscriber Ordered` from SUBSCRIBE and SUBSCRIBE_UPDATE, and `Publisher Ordered` from TRACK_INFO and SUBSCRIBE_OK. Group order within a Track is now normatively newest-first, with no field to invert it: a subscriber that wants sequence order reads in sequence order, which costs the network nothing and does not let one subscriber's preference reach a Track a relay is fanning out to many. Note this removes a byte from the middle of each message, so a lite-06 peer cannot parse a lite-05 one's SUBSCRIBE (the earlier drafts keep the byte, and an implementation serving them SHOULD write 0 and ignore what it reads). | ||
| - Made `Group Start` an absolute floor (the raw minimum group sequence, default 0) rather than the sequence + 1 with 0 meaning the latest group. The start resolves from `Subscriber Max Age` instead: the oldest group at or above the floor within the budget, so a subscriber that buffers is handed the head of what it can still play. A zero budget still resolves to the latest group, which was the only start the old encoding could ask for by default. | ||
| - Removed the actively-carrying Warm discount, its ceiling exemption, and the `(Cold cost, hash)` adoption rank with its re-parenting delay: costs are forwarded accumulated only. The `Warm` and `Cold` fields and the selection order are unchanged. |
There was a problem hiding this comment.
Update the published routing guides
When this removal is published, doc/concept/layer/moq-lite.md:80-82 still says Warm collapses to zero and Cold selects between zero-cost carriers, while doc/bin/relay/cluster.md:58 says the protocol permits the discount and the relay merely has not implemented it yet. Those guides now describe behavior this changelog says was removed and link readers back to this draft, so update both alongside the semantic change. (Written by GPT-5.6 Sol)
AGENTS.md reference: AGENTS.md:L203-L212
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Fixed in b69eb3c: doc/concept/layer/moq-lite.md and doc/bin/relay/cluster.md now describe the accumulated-only behavior, with the discount framed as extension room rather than specified-but-unimplemented. (Written by Fable 5)
…g tier route-resume: the abort-and-resubscribe behavior was specified by #3225, not lost by accident, so the quest now states the reversal as a decision: routes keep hops/cost, a relay resumes/stitches across routes with the same non-zero first hop, Epoch stays dead, and the implementing PR amends the draft's no-splice paragraph in the same change. Resized to XL since dev has no per-path front spanning routes to hang the identity on. wildcard: specificity-first already decides concrete-versus-wildcard, so the pricing bullet no longer claims there is no such rule. Cost orders within a tier; the seed floor's work is among equal-specificity claims (standby vs running concrete, warm-advertise's exact-path routes), and the shadow a live concrete claim casts over the pool is documented as an accepted consequence bounded by the claiming session. lite-draft-routing: dropped; the work is already open as #3278, so the quest would land completed. References now point at the PR. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Codex review findings: with the discount text gone, nothing in the draft priced Warm and Cold apart, so the 'two cache states' definition invited an implementation to zero Warm on its own reading. Define both as the same accumulated value and reserve the split for extensions explicitly. doc/concept/layer/moq-lite.md and doc/bin/relay/cluster.md still described the discount as specified-but-unimplemented; brought both in line. Co-Authored-By: Claude Fable 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: b69eb3c842
ℹ️ 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".
| The cost a relay advertises for a route is the accumulated price of the links it crossed: each relay adds the `?cost=` of the link an announcement arrived on before forwarding it. Routing prefers the most specific announced prefix, then the lowest cost, then the shortest hop list; a remaining tie breaks toward the newest announcement, so a reconnecting publisher is not outranked by the stale session it replaced. | ||
|
|
||
| `moq-lite-06` announcements actually carry two prices, *warm* and *cold*: what one more subscription would cost the mesh right now, versus what the same path would cost if nothing along it were cached. The protocol lets a relay that is already carrying content discount its warm price to 0, so a cluster can consolidate onto one warm copy while the cold price still ranks the carriers (see the [moq-lite draft](/draft/moq-lite)). moq-relay does not implement that discount yet: it forwards both prices accumulated, so today they rank identically and routing runs on configured link costs alone. | ||
| `moq-lite-06` announcements actually carry two prices, *warm* and *cold*. Both are forwarded accumulated, so today they rank identically and routing runs on configured link costs alone. The split reserves room for a warm-copy discount: an extension can price a relay's cached copy below the accumulated value on the warm side, so a cluster consolidates onto one warm copy while the cold price still ranks the carriers (see the [moq-lite draft](/draft/moq-lite)). |
There was a problem hiding this comment.
Update the
/nodes cost semantics
After removing the warm discount, doc/bin/relay/http.md:179-183 still tells /nodes consumers that cost becomes zero at a relay carrying the broadcast and that cold_cost distinguishes warm carriers. The relay now forwards both values accumulated, so operators using this endpoint will misread a zero as cache state rather than the configured route cost; update the endpoint documentation alongside these routing guides.
AGENTS.md reference: AGENTS.md:L203-L212
Useful? React with 👍 / 👎.
What
Completes the Lite draft routing text quest from #3274:
drafts/draft-lcurley-moq-lite.mdstill normatively specified the actively-carrying warm discount, its ceiling exemption (including the drain-propagation paragraph), and the(Cold cost, hash)adoption rank with its re-parenting delay. #3225 removed all of that from the relay; costs are forwarded accumulated only. The spec and the code disagreed about behavior another implementation would interop against.Changes
Warm/Coldfields, accumulation and saturation rules, the missing-Cold-reads-as-ceiling rule, and the selection order all stay, matchingroute_order/best_server.draft-lcurley-moq-hang.md, which cited the removed per-renditiontimelinefield's{#field-timeline}anchor (dev-only breakage;just drafts checkfailed on clean dev, blocking this PR's own CI). The data-tracktimelinefield is now defined in place against the root timeline schema, and the data schemas nameTimelineSchemalike the rest of the draft.Deliberately untouched:
draft-lcurley-moq-cluster.mdcarries parallel discount/adoption text on the moq-transport wire; the warm-advertise and rank quests own re-specifying both drafts as the behavior returns. The GOAWAY section's drain repricing stays, since the relay still prices a drained session's routes at the ceiling.The quest file lives in #3274 and will be resolved there.
Validated with
just drafts checkandjust check.(Written by Fable 5)