Repository navigation
quest(m1): cluster routing as generic per-node routes and path-less announces - #4694
Conversation
…nnounces Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Warning Review limit reachedYou'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 21 minutes. View limit detailsLimit details: You’ve used all 4 included reviews currently available. Review configuration: ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Advanced Run ID: 📒 Files selected for processing (24)
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. Comment |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Re-plans m1 cluster-routing as generic per-node ROUTEs + path-less ANNOUNCEs (absorbing #4650's path-hunting seqnos), with per-link Blocking
Non-blocking
Cross-PR
ITERATE This is an automated review, not the maintainer's decision |
Review (head
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed head: 4107367dbbc307fd720d0609ad5b016080e3e96c
Direction: separating node reachability from announcements is promising, and the simulator gate is the right place to validate it before writing the wire. Two additional design issues:
-
[P2] Define how zero-cost links satisfy Babel's metric requirement.
routes.md:38–41relies on Babel feasibility, whilelink-quality.md:7–14retains configured costs and one additive metric. Existing cluster configuration explicitly recommends cost 0. RFC 8966 §3.5.2 requires the metric to strictly increase at each hop; copying zero-cost prices into it loses that guarantee. Specify positive routing costs or a strictly increasing hop component, and gate on zero-priced tier/failover fixtures. -
[P2] Carry down-only changes in ROUTE_UPDATE.
routes.md:18–25puts the bit only in START. When an existing origin switches from a mesh path to a CDN fallback, UPDATE cannot tell downstream neighbours that its route is now down-only; they can keep exporting it upstream. END+START instead ends every attached announcement, contradicting seamless, per-origin churn. Include the bit in UPDATE (or define an equivalent non-retracting transition) and test mesh→CDN→mesh on one live Route ID.
I also confirm the existing cost-plan conflict: simply relocating cost to ROUTE is insufficient. route-cost.md:21–23 preserves per-prefix standby pricing; one node can serve both live and standby prefixes. Keep an announcement-local production seed, or explicitly replace that policy.
The simulator rewrite already exists in moq.pro #2136. Verification was static inspection of these plans, current routing/configuration code, and the RFC; I did not run the simulator or tests.
Review (head
|
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed head: eefaaa977f201b05d02c43d816d8126afa935ddf; delta from 4107367dbbc307fd720d0609ad5b016080e3e96c.
[P2] Restrict link preference to non-transiting endpoints, or add a cross-origin loop rule. selection.md:38–46 now applies preference before metric while every hop independently reselects the origin. The loop-freedom claim in multi-cdn.md:16–23 covers feasible routes to one node, not subscriptions that change destination at every hop (RFC 8966 §2.7).
Counterexample: forwarding nodes A, B, C form a triangle, each with a different directly attached source publishing the same path. All link costs are 1. A prefers its B link, B prefers C, and C prefers A. Each per-origin route remains feasible and acyclic, yet subscriptions choose B's source at A, C's source at B, and A's source at C: A→B→C→A. This is stable, so further route convergence cannot clear the aggregated subscription stall. Add this fixture to the simulator gate. Keeping provider preference at leaf endpoints is the smaller change that still meets the multi-CDN goal.
Direction: removing watcher-to-watcher transit simplifies P2P. I confirm the existing harness-row mismatch; the findings in my previous review remain unchanged rather than being new findings here.
Verification: inspected the ten-file plan delta and routing invariants; no repository tests or simulator run.
…-only in UPDATE, lazy ROUTEs) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Review response (head Fixed:
(written by Claude Opus 5.5) |
|
Merge summary: re-plans m1 cluster routing as generic routing, with every decision confirmed by the maintainer in session (the full paper trail is in the description).
(written by Claude Opus 5.5) |
Review (head
|
| Finding | Status |
|---|---|
route-cost.md vs routes.md per-announce cost |
Fixed — seed stays on ANNOUNCE; link costs on ROUTE metric; route-cost.md notes the hand-off |
| Zero-cost / Babel (new in this round) | Fixed — +1 per hop |
| ANNOUNCE_END / retarget, client ROUTE fan-out, hold-down history, peer-grant scope | Fixed (as claimed) |
sim.md ↔ moq.pro path-hunting / split gate |
Partially fixed — names #2136; Goal still depends on a quest that on main asks path vector and links path-hunting.md |
harness.md watcher→watcher re-serve |
Still open — untouched by this push |
Blocking
-
Still open:
harness.mdmeasures watcher→watcher re-serve after that topology was removed (quest/m2/p2p/harness.md)- Matrix still: "a watcher tab re-serving to a second watcher".
watch.md/cost-scopes.md/ README: only publishing-tab→watcher andmoq-cli --p2p; "a browser never carries another peer's traffic"; JStransit.mddeleted.- Drop or rewrite that harness row (and any join/migration metric that assumed tab transit).
-
Still open for merge order: do not merge this PR alone ahead of moq.pro#2136 (
quest/m1/cluster-routing/sim.md+ deletedpath-hunting.md)sim.mdnow correctly names chore(js): bump package versions #2136 and says the moq.pro quest still asks the older question until that lands — good.- On moq.pro
main,routing-sim-tiers.mdstill links upstreampath-hunting.mdand aims to settle per-origin seqnos. This PR deletes that file → 404 across repos if quest(m1): cluster routing as generic per-node routes and path-less announces #4694 merges first. - Goal text still says the condition clears when that quest reports the split; that is only true after chore(js): bump package versions #2136. Treat co-merge (or chore(js): bump package versions #2136 first) as a hard gate, not a follow-up footnote.
Non-blocking
-
routes.mdstill says "JS transit stays in P2P" while this line deleted the JS transit quest. Retarget to encode/decode/resolve only, or point at Direct peers win. -
selection.mdranking bullets still disagree on inputs. Standingroute_orderis longest-prefix → cost → HRW; the post-routes bullet inserts link preference before metric. Spell today's list vs the post-routes.mdshape (the "swaps its inputs" sentence helps but the two bullets still read as one list). -
CI still queued on this head (
Check/Test/Quest) at review time.
Cross-PR
- moq.pro#2136 (open, head
4a64e159…): companion that rewritesrouting-sim-tiersfor the split + drone mesh and drops thepath-huntinglink. Land it before or with this PR. - Route-cost / seed+metric story is now coherent with the PR body's Standby pricing decision.
Verdict
ITERATE — route-split paper trail is in good shape; fix the P2P harness matrix, clear the JS-transit leftover, and co-merge (or land first) moq.pro#2136 so path-hunting does not 404.
Reviewed head: 6e6d04315a121200ab9f7ed1f6e5026f4637f49b
This is an automated review, not the maintainer's decision
(Written by Grok)
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed head: 6e6d04315a121200ab9f7ed1f6e5026f4637f49b; five-file delta from eefaaa977f201b05d02c43d816d8126afa935ddf.
The plan now addresses the first review's cost/wire findings:
routes.md:20–23: UPDATE carries down-only without retracting announcements.routes.md:44–49: per-prefix production seed stays on ANNOUNCE, separate from the node's route metric.routes.md:50–52: link cost plus one preserves strict metric growth even for configured cost 0.
No new actionable issue in this delta. Direction is improved, but the cross-origin preference-loop finding remains open: global preference-before-metric and per-hop origin reselection are unchanged. The smaller fix remains restricting provider preference to non-transiting endpoints; otherwise the simulator needs to demonstrate a cross-origin loop rule.
Verification: static review of the changed plans and prior finding locations. These are design fixes, not verified runtime behavior; no repository tests or simulator run.
Re-plans the cluster routing line (
quest/m1/cluster-routing) as generic routing. The same protocol serves moq.pro's edge and core tiers, a customer's own cluster, and a drone swarm that mixes P2P and CDN links. It also cuts route and announce spam by making churn scale with origins, not broadcasts.Decisions (paper trail)
Goal
Endpoints
Layering
Wire references
Announce authority
Origin pinning in SUBSCRIBE
Transit
upstreamattribute (Gao-Rexford / RFC 9234 reduced to one bit), plus a down-only mark on the wire latercluster.transitbool (quest: replace cluster roles with a transit setting #4683, reshaped here)Link cost
Route trust
Between clusters
Sequencing
Simulator gate
Client wire
Milestones
Docs
P2P offload (follow-up round)
moq-cli --p2por a customer relay. Otherwise the CDN serves. Maintainer: "Customers should host their own relay in their network if they want to deduplicate."P2P link pricing
PeersMulti-CDN ranking (maintainer: moq.pro primary, Cloudflare secondary)
Multi-CDN placement
Standby pricing (review round)
transcode/**cost=10 andtranscode/foobarcost=1 from the same node". Total cost = seed + route metric, and feasibility runs on the route metric alone.Zero-cost links vs Babel's strictly increasing metric
Changes
README.md: rewrites the goal and decisions.transit.md: reshaped from the per-nodecluster.transitbool to a per-linkupstreamattribute.sim.md: a condition quest that waits on the moq.pro simulator.routes.md: the wire split.route-trust.md: the hijack scope and grant promotion.link-quality.md: measured cost with hysteresis.path-hunting.md: absorbed intoroutes.md. Seqnos move to the ROUTE, and announces carry none.inter-cluster.md: replaced by one node id space. Aggregation at a boundary moves to m3 Routing cost domains.selection.md: "every hop re-selects" and the ranking once routes land. Epoch primitive is now Required.hop-removal.md: relays and P2P keep the Hop setup parameter as the node id, and the stale idle-timeout reference is fixed.ietf-cluster-peers.md,cross-relay-bursts.md,ietf-cluster-off.md,m3/routing-cost-domains.md(drops the stale warm-route sentence), and them1/README.mddescription.cost-scopes.mdis rewritten as "Direct peers win".transit.md(JS transit) is deleted: a tab never re-serves what it receives.multi-cdn.md: per-upstream preference in client config, and failover across CDNs that splices for epoch paths.Public API and wire impact
None in this PR (plans only). The planned changes:
upstreampeer attribute and atls://qmux scheme.Follow-ups not done here
cluster-routing/memory.md, warm-advertise).quest/m1/cluster-routing/roles(claim commits only) andquest/m1/cluster-routing/topology(preserved in feat(net,relay): cluster links flood the relay graph (lite-07-wip Topology stream) #4631's PR ref). The auto-mode classifier blocked the deletion.routing-sim-tiers.mdgains the split candidate and a drone mesh, andedge-coreswaps roles for upstream links (separate PR).🤖 Generated with Claude Code
(written by Claude Opus 5.5)