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

147 lines
6.6 KiB
Markdown

# 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.
### Approach B (Recommended): Domain-segmented route partials
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.
## Recommended Design
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.