Skip to content

quest(m1): cluster routing as generic per-node routes and path-less announces - #4694

Merged
kixelated merged 4 commits into
mainfrom
quest/cluster-routing-generic
Oct 2, 2026
Merged

kixelated merged 4 commits into
mainfrom
quest/cluster-routing-generic

Conversation

@kixelated

@kixelated kixelated commented Oct 2, 2026 •

Copy link
Copy Markdown
Collaborator

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

  • ✅ Generic routing: one protocol for any topology. Edge and core become config, not node roles.
  • CDN now, mesh later
  • Wire generic, CDN first

Endpoints

  • ✅ Any node with more than one link routes (relay, app, browser, drone)
  • Relays only

Layering

Wire references

  • ✅ Implicit stream-local Route IDs: ROUTE_START carries the node id once, and ROUTE_UPDATE, ROUTE_END and ANNOUNCE reference the local id (maintainer: "can the peer count every unique ROUTE, like ANNOUNCE does?")
  • Node id on every ANNOUNCE

Announce authority

  • ✅ Store every neighbour's announces, but follow the current next hop toward the origin (metric, then HRW). Failover when a neighbour drops is instant. No cycle of stale neighbours can keep a dead broadcast alive, because Babel's next hops toward an origin form a tree.
  • Pure union plus a per-announce seqno

Origin pinning in SUBSCRIBE

  • ✅ No pinning; every hop re-selects (maintainer: pins break aggregation, and a stale pin has no good answer)
  • Pin the origin chosen by the first relay

Transit

Link cost

  • ✅ One metric on the wire; cost policy stays local (static by default, measured opt-in)
  • Static only

Route trust

  • ✅ Trusted cluster links may advertise any node. A client link's node ids are session-scoped. A peer grant can promote a link.
  • Trust every link

Between clusters

  • ✅ One node id space, no cluster ids as hops. A swarm split into islands still reaches itself through the CDN.
  • Keep cluster ids at boundaries

Sequencing

  • ✅ Topology now, wire later: moq.pro migrates on lite-06 with upstream links
  • Pause the migration until the split lands

Simulator gate

  • ✅ moq.pro's simulator compares the split with path vector, on tiers and on a synthetic drone mesh, before the wire is written
  • No gate

Client wire

  • ✅ Every session speaks ROUTE and ANNOUNCE; js/net decodes it in the same quest
  • Cluster links only

Milestones

  • Routes in m1, mesh pieces in m2
  • ✅ Everything in m1, including measured link quality
  • Split to m2

Docs

  • ✅ The concept page walks both the CDN tiers and the drone mesh through the same rules
  • Operator CDN only

P2P offload (follow-up round)

  • ✅ A direct peer wins only when it is the origin, or a routing node such as moq-cli --p2p or a customer relay. Otherwise the CDN serves. Maintainer: "Customers should host their own relay in their network if they want to deduplicate."
  • A carrying peer re-originates (one P2P level)
  • Local preference among feasible routes

P2P link pricing

  • ✅ The node sets its own costs through Peers
  • The relay declares an egress price

Multi-CDN ranking (maintainer: moq.pro primary, Cloudflare secondary)

  • ✅ Link preference first, then metric, like LOCAL_PREF. Metrics from different operators are never added together.
  • Additive metric

Multi-CDN placement

  • ✅ New quest in the m1 line
  • Fold into Selection

Standby pricing (review round)

  • ✅ Keep an announce-local, per-prefix origin cost that is untouched in transit. Maintainer requirement: "announce transcode/** cost=10 and transcode/foobar cost=1 from the same node". Total cost = seed + route metric, and feasibility runs on the route metric alone.
  • Drop standby pricing

Zero-cost links vs Babel's strictly increasing metric

  • Link cost >= 1, with 0 refused
  • ✅ Hidden +1 per hop, so operators keep configuring cost 0

Changes

  • README.md: rewrites the goal and decisions.
  • transit.md: reshaped from the per-node cluster.transit bool to a per-link upstream attribute.
  • New quests:
    • 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.
  • Deleted:
    • path-hunting.md: absorbed into routes.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.
  • Reference fixes:
    • 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 the m1/README.md description.
  • P2P (m2):
    • cost-scopes.md is rewritten as "Direct peers win".
    • transit.md (JS transit) is deleted: a tab never re-serves what it receives.
    • README, watch, signal and harness are updated to match.
  • New multi-cdn.md: per-upstream preference in client config, and failover across CDNs that splices for epoch paths.
  • m1 order: Epoch primitive and Broadcast epochs move above Cluster routing, which now requires them.

Public API and wire impact

None in this PR (plans only). The planned changes:

  • An upstream peer attribute and a tls:// qmux scheme.
  • A ROUTE and ANNOUNCE split in the wip lite version for every session, with the hop list and per-announce cost leaving that version.
  • A node scope in peer grants.

Follow-ups not done here

  • The Wildcard line's branch README has stale links (cluster-routing/memory.md, warm-advertise).
  • Delete the branches quest/m1/cluster-routing/roles (claim commits only) and quest/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.
  • moq.pro: routing-sim-tiers.md gains the split candidate and a drone mesh, and edge-core swaps roles for upstream links (separate PR).

🤖 Generated with Claude Code

(written by Claude Opus 5.5)

…nnounces

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

coderabbitai Bot commented Oct 2, 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 21 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: 3ed052f5-de2f-45de-b74d-0b6e272766a8

📥 Commits

Reviewing files that changed from the base of the PR and between 651f199 and 6e6d043.

📒 Files selected for processing (24)
  • quest/m1/README.md
  • quest/m1/auth/peer-grant.md
  • quest/m1/cluster-routing/README.md
  • quest/m1/cluster-routing/inter-cluster.md
  • quest/m1/cluster-routing/link-quality.md
  • quest/m1/cluster-routing/multi-cdn.md
  • quest/m1/cluster-routing/path-hunting.md
  • quest/m1/cluster-routing/route-trust.md
  • quest/m1/cluster-routing/routes.md
  • quest/m1/cluster-routing/selection.md
  • quest/m1/cluster-routing/sim.md
  • quest/m1/cluster-routing/transit.md
  • quest/m1/cross-relay-bursts.md
  • quest/m1/hop-removal.md
  • quest/m1/ietf-cluster-off.md
  • quest/m1/route-cost.md
  • quest/m2/ietf-cluster-peers.md
  • quest/m2/p2p/README.md
  • quest/m2/p2p/cost-scopes.md
  • quest/m2/p2p/harness.md
  • quest/m2/p2p/signal.md
  • quest/m2/p2p/transit.md
  • quest/m2/p2p/watch.md
  • quest/m3/routing-cost-domains.md
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Autopilot is currently an internal CodeRabbit preview.


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.

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

Copy link
Copy Markdown
Collaborator Author

Re-plans m1 cluster-routing as generic per-node ROUTEs + path-less ANNOUNCEs (absorbing #4650's path-hunting seqnos), with per-link upstream replacing #4683's cluster.transit. Reviewed head 4107367dbbc307fd720d0609ad5b016080e3e96c.

Blocking

  1. quest/m1/route-cost.md still puts the one cost on ANNOUNCE; this PR removes per-announce cost.
    routes.md (wire sketch): "The hop list and per-announce cost leave this version" — metric lives on ROUTE_*.
    route-cost.md Plan (unchanged): the next wip lite version "carries a single route cost in ANNOUNCE_START and ANNOUNCE_UPDATE".
    Both are m1 Required and target the same wip version. Update route-cost.md so the single cost is the ROUTE metric (and lite-06 translation stays clear), or explicitly sequence/supersede that quest from this line. As written, implementers get two incompatible wire plans.

Non-blocking

  1. routes.md never shows how a single broadcast ends while the origin stays up. Goal/README say ending a broadcast is one fact; the sketch only has ANNOUNCE_START and notes ROUTE_END tears down every announce on that route. Spell out path-less ANNOUNCE_END / ANNOUNCE_UPDATE (or say they are gone and what replaces them). The open item about "an origin's END" crossing a next-hop change is ambiguous without that.
  2. Merging deletes path-hunting.md while moq.pro still points at it. moq.pro quest/m1/routing-sim-tiers.md links to .../cluster-routing/path-hunting.md and still frames the sim as settling per-origin seqnos. This PR's sim.md correctly waits on a ROUTE/ANNOUNCE split report, and the PR body lists a separate moq.pro update — open that (or land it first) so main does not leave a 404 across repos. edge-core still speaking roles / roles.md is the same bucket.
  3. Path-hunting history is mostly dropped. fix(net): replace the cursor hold with a cluster-link hold-down #4644 / fix(moq-net): hold route updates so a withdrawal retracts once #4642 / moq.pro#2116 rationale (why hold-down was rejected, seamless-failover constraint) lived in the deleted quest; routes.md keeps the acceptance-test pointer only. A short "why not hold-down" note would help the implementer.
  4. CI still queued (Check / Test / Quest) at review time — re-check before merge.

Cross-PR

ITERATE

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

@kixelated

Copy link
Copy Markdown
Collaborator Author

Review (head 4107367dbbc307fd720d0609ad5b016080e3e96c)

Replans cluster routing from per-broadcast path vector to per-node ROUTE + path-less ANNOUNCE, with per-link upstream replacing #4683's cluster.transit. Clear paper trail and a coherent CDN + drone-mesh story.

Blocking

  1. sim.md gates the wire on a moq.pro quest that does not ask for the split (quest/m1/cluster-routing/sim.md)
    • Goal says the condition clears when routing-sim-tiers.md reports a ROUTE/ANNOUNCE split (Babel DV, path-less announces, next-hop follow) on tiers and a synthetic drone mesh.
    • On moq.pro main that quest still: models tiered path vector with role/non-transit; aims to settle upstream path-hunting.md (per-origin seqnos); has no ROUTE layer, no Babel candidate, no drone mesh.
    • This PR deletes path-hunting.md, so after merge the moq.pro Required/edit link 404s, and routes.md stays Required on a condition that cannot clear as written.
    • Fix: land (or at least open) the moq.pro edit first — rewrite routing-sim-tiers.md Goal/Plan for the split + drone mesh, drop the path-hunting dependency — or change sim.md so it names that rewrite as the work to start, not a report the current quest already promises. PR follow-ups already call this out; it needs to be a gate, not a footnote, because it blocks the XL child.

Non-blocking

  1. Wire sketch never mentions ANNOUNCE_UPDATE / retargeting (routes.md)

    • Today restart/failover can ride ANNOUNCE_UPDATE (see retired path-hunting / draft). After the split, can an announce change Route ID when the serving node changes (same epoch, different origin node), or only END+START?
    • Add to the sketch or to Open so the implementer does not invent a silent incompatibility with Selection's splice rule.
  2. Client session route fan-out unbounded (routes.md / README "every session speaks it")

    • "A relay advertising routes to a client sends them as usual" plus full per-origin ROUTEs can push the whole CDN origin table to every browser.
    • Say whether client sessions are interest-scoped, announce-driven only, or intentionally full-table (and what caps that).
  3. route-trust.md stretches peer-grant beyond its current Goal

    • peer-grant.md is about serving granted paths on a direct session (hop-bound POP). Fleet route advertisement is a second authority.
    • One sentence in either quest that the grant gains an advertise/node-scope purpose (or a pointer to a dedicated auth child) will keep the auth line from missing it.
  4. CI still queued on this head (Check / Test / Quest) — re-check before merge; no result yet at review time.

Verdict

ITERATE — fix the sim.md ↔ moq.pro condition mismatch (and preferably the moq.pro path-hunting link) before treating the simulator gate as real; the NBs can land with the wire/auth children.

Reviewed head: 4107367dbbc307fd720d0609ad5b016080e3e96c

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

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.

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–41 relies on Babel feasibility, while link-quality.md:7–14 retains 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–25 puts 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.

@kixelated

Copy link
Copy Markdown
Collaborator Author

Review (head eefaaa977f201b05d02c43d816d8126afa935ddf)

Notable push since 4107367dbbc307fd720d0609ad5b016080e3e96c: adds Multi-CDN endpoints (link preference ahead of metric; non-ROUTE CDN is just a link), folds preference into Selection's post-routes ranking, and rewrites m2 P2P so a direct peer wins only as origin / routing node — deleting JS transit.md and retitling cost-scopes to Direct peers win.

Blocking

  1. Still open: sim.md gates on a moq.pro quest that does not ask for the split (quest/m1/cluster-routing/sim.md)

    • Condition still requires routing-sim-tiers.md to report a ROUTE/ANNOUNCE split + drone mesh.
    • moq.pro main still models tiered path vector with role/non-transit and aims to settle upstream path-hunting.md — which this PR deletes (404 after merge).
    • Unchanged by this push; still blocks treating the simulator gate as real.
  2. Still open: route-cost.md puts the one cost on ANNOUNCE; routes.md removes per-announce cost

    • routes.md: "The hop list and per-announce cost leave this version" — metric on ROUTE_*.
    • quest/m1/route-cost.md Plan (unchanged on this head): wip lite "carries a single route cost in ANNOUNCE_START and ANNOUNCE_UPDATE".
    • Both m1 Required / same wip target → incompatible wire plans. This push did not touch route-cost.md.
  3. New: harness.md still measures watcher→watcher re-serve after this push deleted that topology (quest/m2/p2p/harness.md)

    • Matrix still includes "a watcher tab re-serving to a second watcher".
    • watch.md / cost-scopes.md / README now: only publishing-tab→watcher and moq-cli --p2p; "a browser never carries another peer's traffic"; transit.md removed.
    • Drop or rewrite that harness row (and any join/migration metric that assumed transit) so the plan matches the decision.

Non-blocking

  1. selection.md ranking bullets disagree on inputs. The standing route_order bullet is still longest-prefix → cost → HRW; the re-select bullet (this push) inserts link preference before metric. Spell which is today's route_order vs the post-routes.md shape so implementers do not treat them as one list.

  2. routes.md still says "JS transit stays in P2P" while this push deleted the JS transit quest. Retarget that sentence (encode/decode/resolve only, or point at Direct peers win).

  3. Prior NBs still open if you care before the wire children: path-less ANNOUNCE_END / retarget, client ROUTE fan-out scope, peer-grant advertise/node scope.

  4. CI still queued on this head (Check / Test / Quest) at review time.

Cross-PR

  • moq.pro routing-sim-tiers + edge-core upstream-links rewrite remains a separate prerequisite (called out in the PR body; still not landed).
  • P2P m2 now depends on m1 routes.md for origin node ids / metrics (cost-scopes.md Required) — consistent with the cluster-routing paper trail.

Verdict

ITERATE — prior sim + route-cost wire contradictions remain; fix the harness matrix against the no-tab-transit decision from this push. Multi-CDN quest itself looks coherent with Selection.

Reviewed head: eefaaa977f201b05d02c43d816d8126afa935ddf

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

Copy link
Copy Markdown
Collaborator Author

Review response (head 6e6d04315a121200ab9f7ed1f6e5026f4637f49b):

Fixed:

  • route-cost vs per-announce cost: the single cost stays on ANNOUNCE as the origin's per-prefix seed and is untouched in transit. Link costs move to the ROUTE metric. This covers the maintainer's requirement that transcode/** at 10 and transcode/foobar at 1 be announceable from one node. route-cost.md notes the hand-off.
  • Zero-cost links vs Babel: each hop adds its link cost plus one, so the metric strictly increases (maintainer chose this over refusing cost 0).
  • Down-only bit: now also carried in ROUTE_UPDATE, so a mesh-to-CDN switch doesn't retract.
  • ANNOUNCE_END / ANNOUNCE_UPDATE: spelled out. An announce never changes its Route ID; another origin means another ANNOUNCE.
  • Client fan-out: a stream carries a ROUTE only while an ANNOUNCE on it references it.
  • Hold-down history: a "why not a hold-down" note is in routes.md.
  • Peer grant: peer-grant.md links route-trust.md as the grant's second purpose.
  • sim.md vs moq.pro: sim.md now names moq-dev/moq.pro#2136, which rewrites the simulator quest for the split and removes the path-hunting.md link. It should land before or with this PR.

(written by Claude Opus 5.5)

@kixelated

Copy link
Copy Markdown
Collaborator Author

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

  • Routing model:
    • Per-node ROUTE plus path-less ANNOUNCE on one stream, with implicit Route IDs.
    • Babel feasibility keyed by node; an ANNOUNCE is live only from the next hop toward its origin.
    • No origin pinning: every hop re-selects.
  • Policy:
  • Costs:
    • Announce-local per-prefix seed cost, plus a route metric with a hidden +1 per hop.
    • Multi-CDN uses link preference first.
    • Measured link quality is opt-in.
  • P2P: a direct peer wins only when it is the origin or a routing node; JS transit is deleted.
  • Sequencing: the wire is gated on the moq.pro simulator (moq-dev/moq.pro#2136, which should land with this). moq.pro's edge/core rollout proceeds on lite-06.

(written by Claude Opus 5.5)

@kixelated
kixelated enabled auto-merge (squash) October 2, 2026 00:36
@kixelated

Copy link
Copy Markdown
Collaborator Author

Review (head 6e6d04315a121200ab9f7ed1f6e5026f4637f49b)

Notable push since eefaaa977f201b05d02c43d816d8126afa935ddf: address-review on the route split — announce-local seed cost + ROUTE metric with hidden +1/hop, down-only on UPDATE, lazy ROUTEs, ANNOUNCE_END/UPDATE spelled out, hold-down history, peer-grant → route-trust link, and sim.md naming moq.pro#2136.

Prior findings

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

  1. Still open: harness.md measures 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 and moq-cli --p2p; "a browser never carries another peer's traffic"; JS transit.md deleted.
    • Drop or rewrite that harness row (and any join/migration metric that assumed tab transit).
  2. Still open for merge order: do not merge this PR alone ahead of moq.pro#2136 (quest/m1/cluster-routing/sim.md + deleted path-hunting.md)

Non-blocking

  1. routes.md still 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.

  2. selection.md ranking bullets still disagree on inputs. Standing route_order is longest-prefix → cost → HRW; the post-routes bullet inserts link preference before metric. Spell today's list vs the post-routes.md shape (the "swaps its inputs" sentence helps but the two bullets still read as one list).

  3. CI still queued on this head (Check / Test / Quest) at review time.

Cross-PR

  • moq.pro#2136 (open, head 4a64e159…): companion that rewrites routing-sim-tiers for the split + drone mesh and drops the path-hunting link. 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 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 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.

@kixelated
kixelated merged commit 0966ddb into main Oct 2, 2026
4 checks passed
@kixelated
kixelated deleted the quest/cluster-routing-generic branch October 2, 2026 01:09
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