v1.0.3
Pre-releasev1.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