You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Routing table fixes:
- Tombstone entries now set ExpiresAt on withdrawal (RemoveDirectPeer,
InvalidateTransitRoutes) so TickTTL cleans them after TTL instead of
immediately or never
- Same-SeqNo updates can no longer resurrect withdrawn routes — only
strictly newer SeqNo from the origin supersedes a tombstone
- IsExpired boundary fix: exact-boundary timestamps now correctly
treated as expired (!now.Before instead of now.After)
Relay key sync:
- New syncSenderKeys() reuses existing outbound session for on-demand
key fetch instead of opening a fresh TCP connection
- handleRelayMessage accepts optional syncSession parameter to avoid
deadlock on single-reader inboxCh when called from within session loop
- syncPeer auth phase skips up to 5 interleaved non-auth frames
(announce_routes race during handshake)
RPC routing observability:
- New routing_commands.go: fetch_route_table, fetch_route_summary,
fetch_route_lookup with RoutingProvider interface
- New routing_provider.go: bridges node.Service to RPC layer
- PeerTransport filters out disconnected peers via health check
- Console parser rejects extra arguments for no-arg routing commands
- snapshot_at field added to fetch_route_summary response
- Full handler test coverage (handler_routing_test.go)
Documentation:
- Roadmap rewritten to reflect current state (three delivery mechanisms)
- Diagram updated: Node D shows routing-table-based path selection
- New docs/rpc/routing.md with full field specs (EN + RU)
- routing.md updated with snapshot_at and tombstone semantics
Commands marked with `*` are mode-gated: when their provider is nil (standalone node), they are registered as unavailable via `RegisterUnavailable()` — returning 503 and hidden from help. `send_dm` requires DMRouterProvider; chatlog commands require ChatlogProvider; `fetch_traffic_history` requires MetricsProvider.
199
+
Commands marked with `*` are mode-gated: when their provider is nil (standalone node), they are registered as unavailable via `RegisterUnavailable()` — returning 503 and hidden from help. `send_dm` requires DMRouterProvider; chatlog commands require ChatlogProvider; `fetch_traffic_history` requires MetricsProvider; routing commands require RoutingProvider.
197
200
198
201
### Configuration
199
202
@@ -222,7 +225,7 @@ The architecture separates command execution from transport:
222
225
// CommandTable — single source of truth for all commands.
223
226
// RegisterAllCommands is the single registration point — both bootstrap and tests use it.
Команды с `*` являются mode-gated: при nil-провайдере (standalone нода) они регистрируются как недоступные через `RegisterUnavailable()` — возвращают 503 и скрыты из help. `send_dm` требует DMRouterProvider; chatlog-команды требуют ChatlogProvider; `fetch_traffic_history` требует MetricsProvider.
626
+
Команды с `*` являются mode-gated: при nil-провайдере (standalone нода) они регистрируются как недоступные через `RegisterUnavailable()` — возвращают 503 и скрыты из help. `send_dm` требует DMRouterProvider; chatlog-команды требуют ChatlogProvider; `fetch_traffic_history` требует MetricsProvider; routing-команды требуют RoutingProvider.
619
627
620
628
### Конфигурация
621
629
@@ -644,7 +652,7 @@ graph TD
644
652
// CommandTable — единственный источник истины для всех команд.
645
653
// RegisterAllCommands — единая точка регистрации, используемая и bootstrap, и тестами.
0 commit comments