Files
natsnet/docs/plans/2026-02-27-batch-23-routes-design.md
Joseph Doherty c05d93618e Add batch plans for batches 23-30 (rounds 12-15)
Generated design docs and implementation plans via Codex for:
- Batch 23: Routes
- Batch 24: Leaf Nodes
- Batch 25: Gateways
- Batch 26: WebSocket
- Batch 27: JetStream Core
- Batch 28: JetStream API
- Batch 29: JetStream Batching
- Batch 30: Raft Part 1

All plans include mandatory verification protocol and anti-stub guardrails.
Updated batches.md with file paths and planned status.
2026-02-27 16:33:10 -05:00

6.6 KiB

Batch 23 Routes Design

Date: 2026-02-27
Batch: 23 (Routes)
Scope: Design only. No implementation in this document.

Problem

Batch 23 ports NATS route/cluster behavior from golang/nats-server/server/route.go into .NET.

  • Features: 52 (currently deferred)
  • Tests: 5 (currently deferred)
  • Dependencies: batches 16, 18
  • Go source: server/route.go
  • Batch status: pending

This batch is the route control plane: route connect negotiation, route INFO gossip, per-account route subscriptions, route pooling, route lifecycle, and compression negotiation.

Context Findings

Collected with:

  • dotnet run --project tools/NatsNet.PortTracker -- batch show 23 --db porting.db
  • dotnet run --project tools/NatsNet.PortTracker -- batch list --db porting.db
  • dotnet run --project tools/NatsNet.PortTracker -- report summary --db porting.db

Key findings:

  • Most Batch 23 methods do not yet exist in .NET runtime code.
  • Existing route surface in .NET is mostly type definitions (Routes/RouteTypes.cs) and some route-adjacent stubs in NatsServer.Lifecycle.cs.
  • The 5 mapped tests are all in RouteHandlerTests and currently deferred.
  • Existing ProtocolParserTests and ServerTests already cover route-adjacent parser/compression helpers and should be part of the feature verification gate.

Constraints and Success Criteria

Constraints:

  • Follow .NET 10 and project standards (xUnit 3, Shouldly, NSubstitute, no FluentAssertions/Moq).
  • Keep implementation idiomatic C# while preserving Go behavior semantics.
  • No placeholder implementations or fake-pass tests.
  • Feature groups must be <= ~20 features.
  • Batch status changes require evidence and guarded update cadence.

Success criteria:

  • All 52 Batch 23 features are implemented and promoted with evidence (deferred -> stub -> complete -> verified) or explicitly deferred with blocker reason.
  • All 5 mapped Batch 23 tests are real behavioral tests and passing.
  • Route-related regression gates pass (ProtocolParserTests, ServerTests, lifecycle route tests, and mapped route ImplBacklog tests).

Approaches

Approach A: Single large route partial

Implement all route behavior in one large NatsServer.Routes.cs + one ClientConnection.Routes.cs file.

Trade-offs:

  • Pros: fewer files.
  • Cons: very large diff, difficult review, high regression risk, weak checkpointing.

Split route implementation into bounded domains aligned with route.go sections and Batch 23 grouping.

Trade-offs:

  • Pros: clear ownership boundaries, strong per-group build/test gates, easier status evidence, lower merge risk.
  • Cons: more files and more coordination.

Approach C: Tests-first for all 5 mapped tests before feature work

Rewrite all five mapped tests first, then implement features until tests pass.

Trade-offs:

  • Pros: immediate test signal.
  • Cons: only 5 mapped tests under-cover 52 features, so this risks false confidence without strict per-feature verification.

Use Approach B.

Architecture

Organize Batch 23 into three feature domains:

  1. Route protocol parsing and permission handling (inbound route msgs, account sub/unsub, permission checks, route info processing)
  2. Route subscription propagation and route creation pipeline (remote sub/unsub map operations, protocol emission, route object creation)
  3. Route lifecycle and cluster connectivity (start routing, reconnect/validate routes, duplicate handling, gossip/implicit route handling, route iteration helpers)

Mapped tests are executed after feature groups, with additional regression gates from parser/server test classes before complete -> verified promotion.

Proposed File Map

Primary production files:

  • Create: dotnet/src/ZB.MOM.NatsNet.Server/ClientConnection.Routes.cs
  • Create: dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Routes.InfoAndPerms.cs
  • Create: dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Routes.Subscriptions.cs
  • Create: dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Routes.Connections.cs
  • Create: dotnet/src/ZB.MOM.NatsNet.Server/Routes/RouteHandler.cs
  • Modify (as needed): dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Lifecycle.cs
  • Modify (as needed): dotnet/src/ZB.MOM.NatsNet.Server/Protocol/IProtocolHandler.cs
  • Modify (as needed): dotnet/src/ZB.MOM.NatsNet.Server/Protocol/ProtocolParser.cs
  • Modify (as needed): dotnet/src/ZB.MOM.NatsNet.Server/Routes/RouteTypes.cs

Primary mapped test files:

  • Modify: dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/RouteHandlerTests.Impltests.cs

Related regression test files:

  • dotnet/tests/ZB.MOM.NatsNet.Server.Tests/Protocol/ProtocolParserTests.cs
  • dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ServerTests.cs
  • dotnet/tests/ZB.MOM.NatsNet.Server.Tests/Server/ServerLifecycleStubFeaturesTests.cs

Data and Control Flow

  • Route connection establishment: connect -> route CONNECT/INFO exchange -> route registration -> sub interest sync.
  • Route message path: parse routed protocol args -> permission checks -> route/local interest updates -> inbound delivery handling.
  • Route topology updates: implicit route processing + forwarding new route info to known remotes + duplicate-route handling.

Error Handling Strategy

  • Mirror Go error semantics for parse and negotiation failures (return error / close connection path).
  • Use explicit guard clauses for malformed protocols and invalid route state transitions.
  • Keep blocked infrastructure behavior deferred with explicit reason instead of stubs.

Verification Strategy

  • Per-feature loop: read Go implementation, implement minimum C# behavior, build, run smallest related tests, record evidence.
  • Per-group gates: mandatory stub scan, build gate, targeted test gate.
  • Pre-verify gate: all related route test classes and mapped tests must pass before promoting any Batch 23 feature to verified.

Risks and Mitigations

  • Risk: Route lifecycle races/regressions due lock-sensitive logic.
    • Mitigation: keep route iteration/removal code in focused partials; include lifecycle regression tests in every gate.
  • Risk: Placeholder test ports in ImplBacklog produce false green.
    • Mitigation: explicit anti-stub scans and assertion quality checks before status updates.
  • Risk: Large route.go surface causes drift in status updates.
    • Mitigation: strict ID chunking (<=15 per update) and evidence ledger per update.

Design Approval Basis

This design is derived from the explicit request for Batch 23 planning, mandatory verification protocol parity with Batch 0, anti-stub guardrails, and grouped execution without implementation.