# Batch 7 (Opts Class Methods + Reload) Design **Date:** 2026-02-27 **Scope:** Design for Batch 7 planning only (`25` features, `63` tests). No implementation in this document. ## Context Snapshot From: - `/usr/local/share/dotnet/dotnet run --project tools/NatsNet.PortTracker -- batch show 7 --db porting.db` - `/usr/local/share/dotnet/dotnet run --project tools/NatsNet.PortTracker -- batch list --db porting.db` - `/usr/local/share/dotnet/dotnet run --project tools/NatsNet.PortTracker -- report summary --db porting.db` Current state: - Batch ID: `7` - Name: `Opts class methods + Reload` - Status: `pending` - Dependency: `Batch 6` - Go files: `server/opts.go`, `server/reload.go` - Features: `25` (all currently `deferred`) - Tests: `63` (all currently `deferred`) - Environment note: use `/usr/local/share/dotnet/dotnet` (`dotnet` is not on PATH in this workspace) Relevant .NET baseline: - `dotnet/src/ZB.MOM.NatsNet.Server/Config/ReloadOptions.cs` contains many reload option types and a `ConfigReloader` stub, but the core reload pipeline methods mapped in Batch 7 are mostly missing. - `dotnet/src/ZB.MOM.NatsNet.Server/Config/ServerOptionsConfiguration.cs` contains static config-string/file processing, while Batch 7 maps receiver-style `ServerOptions` methods from `opts.go`. - Batch 7 mapped tests are concentrated in ImplBacklog classes and many are placeholder-style and not verification-grade. - `LeafNodeProxyTests` mapped by Batch 7 does not currently exist in `ImplBacklog` and must be created. ## Problem Statement Batch 7 is where config parsing receiver methods and live reload orchestration converge. The highest risk is not compilation failure; it is false progress from stubs, shallow tests, or status promotion without evidence. Design must enforce strict feature+test verification and allow explicit deferment for runtime-blocked behaviors instead of fake implementations. ## Constraints and Success Criteria Constraints: - Follow `docs/standards/dotnet-standards.md` (.NET 10, nullable, xUnit 3 + Shouldly + NSubstitute). - Respect dependency ordering: Batch 7 starts only after Batch 6 is complete. - Feature implementation groups must stay <= ~20 features each. - No placeholder source or placeholder tests can be promoted. Success criteria: - Batch 7 features are implemented with Go parity (or explicitly deferred with concrete reasons). - Batch 7 tests are real behavioral tests or explicitly deferred with blocker notes. - `porting.db` status changes are evidence-backed and chunked (`<=15` IDs per update call). ## Candidate Approaches ### Approach A: Keep all work in existing monolith files - Implementation primarily in `ReloadOptions.cs` and `ServerOptions.Methods.cs` without introducing new partial files. - Pros: minimal file churn. - Cons: very high review complexity and high risk of accidental stub retention in a large file. ### Approach B: Split by responsibility with focused partials (Recommended) - Keep option-type classes in `ReloadOptions.cs`, but move core reload orchestration to `NatsServer.Reload.cs` and helper diff/order logic to dedicated config helper partial(s). - Keep `ServerOptions` receiver-style config entry methods in `ServerOptions.Methods.cs` (or a dedicated `ServerOptions.ConfigProcessing.cs` partial). - Pros: direct mapping to Go responsibilities, easier per-feature verification and smaller commits. - Cons: introduces new files and requires careful type visibility. ### Approach C: Implement only thin wrappers and defer most reload internals - Adds minimal API surface and marks most runtime methods deferred. - Pros: fastest short-term movement. - Cons: fails batch intent, leaves large reload behavior gap, and pushes risk forward. ## Recommended Design Use **Approach B**. ### 1. Feature Decomposition (<=20 each) - **F1 Config receiver + reload helper primitives (14):** `2510,2511,2513,2514,2815,2816,2839,2873,2875,2877,2878,2886,2887,2888` - **F2 Reload orchestration and server application path (11):** `2869,2872,2874,2876,2879,2880,2881,2882,2883,2884,2885` ### 2. Test Decomposition - **T1 Options parsing surface (`40`):** `ServerOptionsTests` IDs from `2514..2597` subset in Batch 7 - **T2 Route/leaf/proxy reload behavior (`18`):** `RouteHandlerTests`, `LeafNodeHandlerTests`, `LeafNodeProxyTests` - **T3 Cross-cutting regression (`5`):** `ConfigReloaderTests`, `JwtProcessorTests`, `MqttHandlerTests`, `ConcurrencyTests1`, `NatsServerTests` ### 3. File Strategy Primary feature files: - Modify: `dotnet/src/ZB.MOM.NatsNet.Server/ServerOptions.Methods.cs` - Modify: `dotnet/src/ZB.MOM.NatsNet.Server/Config/ServerOptionsConfiguration.cs` - Modify: `dotnet/src/ZB.MOM.NatsNet.Server/Config/ReloadOptions.cs` - Create (recommended): `dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Reload.cs` - Create (optional helper split if needed): `dotnet/src/ZB.MOM.NatsNet.Server/Config/ReloadDiffHelpers.cs` Primary test files: - Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/ServerOptionsTests.Impltests.cs` - Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/RouteHandlerTests.Impltests.cs` - Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/LeafNodeHandlerTests.Impltests.cs` - Create: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/LeafNodeProxyTests.Impltests.cs` - Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/ConfigReloaderTests.Impltests.cs` - Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JwtProcessorTests.Impltests.cs` - Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/MqttHandlerTests.Impltests.cs` - Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/ConcurrencyTests1.Impltests.cs` - Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/NatsServerTests.Impltests.cs` ### 4. Data and Control Flow - Config reload entry: `NatsServer.ReloadOptions()` normalizes config, merges flag snapshot/boolean overrides, applies baseline defaults, computes diff, applies ordered reload options, then performs post-apply actions (`recheckPinnedCerts`, timestamps, statsz/config metadata updates). - Diff pipeline: `DiffOptions()` + helper functions (`ImposeOrder`, route/proxy diffs, copy-without-TLS helpers) produce an ordered option list for deterministic `ApplyOptions()` behavior. - Authorization/cluster paths: `ReloadAuthorization()`, `ReloadClusterPermissions()`, `ReloadClusterPoolAndAccounts()` run after apply, with side effects explicitly validated by mapped tests or deferred with reason. ### 5. Error Handling and Deferment Model - Unsupported runtime changes return explicit errors (mirroring Go behavior), not silent no-op. - If a feature requires unported server internals, keep feature `deferred` with concrete reason. - If a test requires live runtime topology or unsupported infra, keep test `deferred` with concrete reason. - Stubbing is not an allowed fallback. ### 6. Verification Philosophy - Feature verification is gated by build + related test evidence. - Test verification requires real Arrange/Act/Assert on production behavior. - Status promotion is evidence-driven and chunked. ## Key Risks and Mitigations 1. Reload behavior touches many server subsystems and may expose unported internals. Mitigation: two bounded feature groups, explicit deferment protocol, and checkpoint gates. 2. Existing ImplBacklog placeholders can mask missing behavior. Mitigation: mandatory anti-stub scans and class-level gates before status updates. 3. Batch dependency on Batch 6 may block execution sequencing. Mitigation: preflight dependency gate in implementation plan before any Batch 7 status changes. ## Design Output This design selects **Approach B** and is ready for execution planning with strict, mandatory verification guardrails for both features and tests.