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.
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(currentlydeferred) - Tests:
5(currentlydeferred) - 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.dbdotnet run --project tools/NatsNet.PortTracker -- batch list --db porting.dbdotnet 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 inNatsServer.Lifecycle.cs. - The 5 mapped tests are all in
RouteHandlerTestsand currently deferred. - Existing
ProtocolParserTestsandServerTestsalready cover route-adjacent parser/compression helpers and should be part of the feature verification gate.
Constraints and Success Criteria
Constraints:
- Follow
.NET 10and 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:
- Route protocol parsing and permission handling (inbound route msgs, account sub/unsub, permission checks, route info processing)
- Route subscription propagation and route creation pipeline (remote sub/unsub map operations, protocol emission, route object creation)
- 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.csdotnet/tests/ZB.MOM.NatsNet.Server.Tests/ServerTests.csdotnet/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
ImplBacklogproduce 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.