Skip to content

v1.0.3

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 21 Jun 13:54

v1.0.3 — 2026-06-21

Highlights

Smart Router v1.0.3 introduces two breaking changes that require immediate operator action: the --geolocation CLI flag has been removed entirely, and the deprecated static-providers: and backup-providers: YAML configuration keys are no longer read. Invocations passing --geolocation will now fail with an "unknown flag" error, and operators must rename the legacy configuration keys to direct-rpc: and backup-direct-rpc: to prevent startup failures, while also updating any dashboards that rely on the dropped geo_location attribute in optimizer-QoS metrics. Beyond these breaking changes, this release implements a group-aware cross-validation engine that evaluates responses across diverse provider sets using per-method policies, exposing validation failures through a new disagreeing-providers header and dedicated mismatch metrics. WebSocket connections now support JSON-formatted requests and assign unique wire IDs to safely multiplex concurrent calls without re-dialing closed sockets. Connection resilience is adjusted by increasing the maximum consecutive connection attempts from 5 to 50 and removing the dead per-socket isHealthy selection gate, while the provider optimizer now calculates sync scores using per-endpoint blocks. Finally, the /debug/pprof endpoint is no longer exposed on the cache metrics port to prevent unintended profiling access.

Changes

⚠ Breaking changes

  • chore!: remove geolocation entirely from smart-router (#134) afe1805
    • the --geolocation CLI flag is removed. Invocations that pass --geolocation will now fail with "unknown flag". The emitted optimizer-QoS metric also drops its geo_location attribute. Update any scripts, deployments, or dashboards that reference them.
  • chore!: drop deprecated static-providers/backup-providers config keys (#135) 1735bdc
    • smart-router no longer reads "static-providers:" or "backup-providers:" YAML keys. Configs still using them must rename to "direct-rpc:" / "backup-direct-rpc:" or the router fails to start with "requires direct-rpc endpoints configuration".

New Features

  • feat(cross-validation): add provider group-label spine (Phase 0.1) (#102) 47a337a
  • feat(cross-validation): per-method policy resolver (Phase 1.1 core) (#102) d8f6808
  • feat(cross-validation): wire per-method policy resolver into selection (Phase 1.1) (#102) 080d114
  • feat(cross-validation): group-aware quorum termination + gate (Phase 1.2b/1.2c) (#102) 2388b8c
  • feat(cross-validation): group-aware provider selection (Phase 1.2a) (#102) 8f7beab
  • feat(cross-validation): group + finality mismatch metrics (Phase 1.3) (#102) 9ed936d
  • feat(cross-validation): disagreeing-providers header + validation-set scope guard (#102) 0b2a3ac
  • feat(cross-validation): per-group quorum (Phase 2.3) (#102) ff0b56a
  • feat(cross-validation): close PRD-contract gaps + restore golangci-lint (#102) e3ae66e
  • feat(rpcsmartrouter): warn when CV group-diversity rests on small groups (#102) f9cd04c
  • feat(changelog): flag breaking changes in Highlights and Changes (#136) eed776e

Bug fixes

  • fix(smart-router/health): stop gating selection on the per-socket isHealthy bit (#100) e868552
  • refactor(smart-router/health): rip out the dead per-socket healthy bit & its debug reset (#100) 4f5f208
  • fix(smart-router/health): guard against a nil direct-connection element (#100) 39bbe65
  • fix(protocol/lavasession): increase max consecutive connection attempts from 5 to 50 (#100) 1c67b2f
  • fix(cross-validation): address Phase 0/1.1 review findings (#102) 5d2cff8
  • fix(cross-validation): tighten min-groups capacity, float parsing, guard fail-closed (#102) 6bab82c
  • fix(cross-validation): diverse-quorum selection, post-filter capacity, failure reason (#102) ae4c7ba
  • fix(cross-validation): preserve response hashes + scope mismatch metric to outliers (Section 1.3) (#102) 513409a
  • fix(cross-validation): surface failure-reason header on request-time fail-fast (#102) cd4f5ad
  • fix(cross-validation): set fail-fast reason on all-sessions-failed-consistency path (#102) e675c83
  • fix(cross-validation): per-group selection prefers groups that can reach threshold (#102) 6940865
  • fix(cross-validation): per-group nil-reply early-exit + runtime capacity guards (#102) d8bafac
  • fix(cross-validation): count request-time fail-fast in CV metrics; doc accuracy (#102) b6f7244
  • fix(scripts): correct make target and config path in setup scripts (#102) 584925f
  • fix(scripts): point UC-1 test at reachable Lava mainnet endpoint; keep router up (#102) e2aea61
  • fix(cross-validation): close 4 review findings (caller policy weakening, dropped pin, failure-reason + outlier mislabels) (#102) 8e05be4
  • fix(cross-validation): close review findings 5-7 (header MinGroups default, nil early-exit, fail-fast reason precedence) (#102) ffa38d6
  • fix(relaycore): canonicalize response before cross-validation hashing (#102) b154d8b
  • refactor(cross-validation): drop intPtr helper for Go 1.26 new(expr) (#102) 22e51f9
  • refactor(cross-validation): extract default group label into a constant (#102) 8daa448
  • refactor(lavasession): name the group-blind selection sentinels (#102) f030eca
  • refactor(relaycore): name the no-cross-validation default knob value (#102) c81a8b5
  • refactor(relaycore): extract selectQuorumWinner with unit tests (#102) 1b929b0
  • refactor(rpcsmartrouter): require integer cross-validation knobs (#102) 5984395
  • refactor(rpcsmartrouter): extract policyKeySeparator constant (#102) 3687599
  • refactor(rpcsmartrouter): filter policies by key prefix, not split-compare (#102) e33eac9
  • fix(cross-validation): reconcile main's CV-mode hashing gate + test signatures after rebase (#102) f925ac0
  • fix(cache): stop exposing /debug/pprof on the cache metrics endpoint (#128) 10d8464
  • fix(provider-optimizer): use per-endpoint block for sync-score (MAG-1748) (#132) d329b9c

Documentation updates

  • docs(smart-router/health): note the nil-connection guard is defensive (#100) e57a7b2
  • docs(smart-router/health): spell out the 5→50 backoff leniency tradeoff in the relay-path comment (#100) 3a79c18
  • docs(cross-validation): document CV config, headers, outlier behavior (Phase 2.4) (#102) 61f94fa
  • docs(cross-validation): tighten outlier-behavior accuracy (#102) 6aaef2e
  • docs(metrics): note structural fail-fasts in CV requests/failed totals (#102) e1a994f
  • docs(relaycore): name common.DefaultProviderGroup in group-folding comments (#102) df053f3
  • docs(lavasession,rpcsmartrouter): name common.DefaultProviderGroup in group comments (#102) ba03abc

Build process updates

  • ci: validate PR artifact on dev-sim-prtests (#123) fe45489
  • ci: rename dev-sim PR validation workflow (#124) 171cfca
  • ci: add dev-sim runtime PR validation (#125) 9264e2a
  • ci: add dev-prtests Kubernetes rollout validation (#126) a15654c
  • ci: run automation readiness in PR gate (#127) 58d64d5

Other work

  • add support for send request as json format to websocket (#68) 92c4013
  • Enhance WebSocketDirectRPCConnection to support unique wire IDs for concurrent requests and ensure closed connections do not re-dial. Added tests for concurrent requests with the same caller ID and verified behavior after connection closure. (#68) 7688977
  • solana init enviroment scripts (#100) 14c3dd9
  • docs+test(cross-validation): correct mismatch metric text + glue test (Section 1.3 P3) (#102) 4ffb1fa
  • style(relaycore): gofmt import ordering in two files (#102) 77c70f6
  • chore!: remove geolocation entirely from smart-router (#134) afe1805
  • chore!: drop deprecated static-providers/backup-providers config keys (#135) 1735bdc