# Batch 22 Monitoring Implementation Plan > **For Codex:** REQUIRED SUB-SKILL: Use `executeplan` to implement this plan task-by-task. **Goal:** Port and verify Batch 22 (`Monitoring`) by implementing 70 deferred monitoring features from `server/monitor.go` and replacing/validating 29 mapped deferred tests with real behavioral assertions. **Architecture:** Implement monitoring runtime in domain-focused `NatsServer` partial files (`Connz`, `Route/Sub`, `Varz`, `Gateway/Leaf`, `Account/JSz`, `Health/Raft`) and keep monitor DTO/sort/query helpers in `Monitor/*`. Execute in six feature groups (each <=20 IDs), then run mapped test waves and only promote `complete -> verified` once all related tests pass. **Tech Stack:** .NET 10, C# latest, xUnit 3, Shouldly, NSubstitute, PortTracker CLI, SQLite (`porting.db`) **Design doc:** `docs/plans/2026-02-27-batch-22-monitoring-design.md` --- ## Batch 22 Scope - Batch ID: `22` - Name: `Monitoring` - Dependencies: `18`, `19` - Go source: `golang/nats-server/server/monitor.go` - Features: `70` - Tests: `29` Reference commands (run before starting work): ```bash dotnet run --project tools/NatsNet.PortTracker -- batch show 22 --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 ``` Primary production files: - Create/Modify: `dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Monitoring.Connz.cs` - Create/Modify: `dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Monitoring.RouteSub.cs` - Create/Modify: `dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Monitoring.Varz.cs` - Create/Modify: `dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Monitoring.GatewayLeaf.cs` - Create/Modify: `dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Monitoring.AccountJsz.cs` - Create/Modify: `dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Monitoring.HealthRaft.cs` - Modify: `dotnet/src/ZB.MOM.NatsNet.Server/Monitor/MonitorTypes.cs` - Modify: `dotnet/src/ZB.MOM.NatsNet.Server/Monitor/MonitorSortOptions.cs` - Modify: `dotnet/src/ZB.MOM.NatsNet.Server/ClientTypes.cs` Primary mapped test files: - `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/MonitoringHandlerTests.Impltests.cs` - `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/RouteHandlerTests.Impltests.cs` - `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/LeafNodeHandlerTests.Impltests.cs` - `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/AccountTests.Impltests.cs` - `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/EventsHandlerTests.Impltests.cs` - `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamJwtTests.Impltests.cs` - `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/ConfigReloaderTests.Impltests.cs` --- ## MANDATORY VERIFICATION PROTOCOL > **NON-NEGOTIABLE:** Every Batch 22 feature and mapped test must follow this protocol. ### Per-Feature Verification Loop (REQUIRED for every feature ID) 1. Read feature metadata and Go implementation first: ```bash dotnet run --project tools/NatsNet.PortTracker -- feature show --db porting.db # then inspect monitor.go around go_line_number/go_line_count ``` 2. Write the mapped C# behavior in the target file only (no placeholders). 3. Build immediately after each feature (or tight pair of coupled features): ```bash dotnet build dotnet/ ``` 4. Run the smallest related test filter immediately: ```bash dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ \ --filter "FullyQualifiedName~MonitoringHandlerTests|FullyQualifiedName~RouteHandlerTests|FullyQualifiedName~LeafNodeHandlerTests|FullyQualifiedName~AccountTests|FullyQualifiedName~EventsHandlerTests|FullyQualifiedName~JetStreamJwtTests|FullyQualifiedName~ConfigReloaderTests" ``` 5. Keep feature ID in `complete-candidate` only if build and related tests are green. 6. If red, fix before moving on. Do not stack unresolved failures. ### Stub Detection Check (REQUIRED after every feature group and test wave) Run these checks before any status promotion: ```bash # Feature/test placeholder detector grep -R -n -E "(NotImplementedException|TODO|PLACEHOLDER|Assert\.True\(true\)|throw new Exception\(\"TODO\"\))" \ dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Monitoring*.cs \ dotnet/src/ZB.MOM.NatsNet.Server/Monitor/*.cs \ dotnet/src/ZB.MOM.NatsNet.Server/ClientTypes.cs \ dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/MonitoringHandlerTests.Impltests.cs \ dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/RouteHandlerTests.Impltests.cs \ dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/LeafNodeHandlerTests.Impltests.cs \ dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/AccountTests.Impltests.cs \ dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/EventsHandlerTests.Impltests.cs \ dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamJwtTests.Impltests.cs \ dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/ConfigReloaderTests.Impltests.cs # Empty-body detector (features) grep -R -n -E "^[[:space:]]*(public|internal|private|protected)[^{;=]*\)[[:space:]]*\{[[:space:]]*\}$" \ dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Monitoring*.cs \ dotnet/src/ZB.MOM.NatsNet.Server/Monitor/*.cs # Fake-test detector for known placeholder pattern in ImplBacklog files grep -R -n -E "var goFile = \"server/|ShouldContain\(\"Should\"\)|ShouldNotBeNullOrWhiteSpace\(\);[[:space:]]*$" \ dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/MonitoringHandlerTests.Impltests.cs \ dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/RouteHandlerTests.Impltests.cs \ dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/LeafNodeHandlerTests.Impltests.cs \ dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/AccountTests.Impltests.cs \ dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/EventsHandlerTests.Impltests.cs \ dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamJwtTests.Impltests.cs \ dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/ConfigReloaderTests.Impltests.cs ``` Any new hit must be fixed or deferred with explicit reason. ### Build Gate (REQUIRED after each feature group) ```bash dotnet build dotnet/ ``` `Build succeeded` is mandatory before moving any feature IDs in that group to `complete`. ### Test Gate (REQUIRED before marking any features verified) All related test classes must pass before any Batch 22 feature moves `complete -> verified`: ```bash dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ZB.MOM.NatsNet.Server.Tests.ImplBacklog.MonitoringHandlerTests" dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ZB.MOM.NatsNet.Server.Tests.ImplBacklog.RouteHandlerTests" dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ZB.MOM.NatsNet.Server.Tests.ImplBacklog.LeafNodeHandlerTests" dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ZB.MOM.NatsNet.Server.Tests.ImplBacklog.AccountTests" dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ZB.MOM.NatsNet.Server.Tests.ImplBacklog.EventsHandlerTests" dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ZB.MOM.NatsNet.Server.Tests.ImplBacklog.JetStreamJwtTests" dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ZB.MOM.NatsNet.Server.Tests.ImplBacklog.ConfigReloaderTests" ``` No feature may be `verified` while these related tests fail or remain placeholder-style. ### Status Update Protocol (REQUIRED) - Max `15` IDs per `feature batch-update` or `test batch-update` command. - Required progression: - `deferred/not_started -> stub` when active work starts. - `stub -> complete` only after stub checks + group build gate. - `complete -> verified` only after full related test gate passes. - Evidence required before each status chunk: - successful build output, - successful related test output, - clean stub scan output, - explicit list of IDs being updated. Example (feature chunk <=15): ```bash dotnet run --project tools/NatsNet.PortTracker -- \ feature batch-update --ids "2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178" \ --set-status complete --db porting.db --execute ``` ### Checkpoint Protocol Between Tasks (REQUIRED) After each major task (every feature group and every test wave): ```bash dotnet build dotnet/ dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ git add dotnet/src/ZB.MOM.NatsNet.Server dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog porting.db git commit -m "" ``` --- ## ANTI-STUB GUARDRAILS (NON-NEGOTIABLE) ### Forbidden Patterns For Batch 22 mapped features and tests, these are forbidden: - `throw new NotImplementedException()` - Empty method bodies for mapped features - `// TODO`, `// PLACEHOLDER`, or temporary fake logic in mapped methods - Trivial default-return stubs for non-trivial behavior (`return null`, `return 0`, `return false`, `return string.Empty`) - Placeholder test bodies that do not execute Batch 22 production code - Literal/self assertions used as fake test pass criteria (for example `"...".ShouldContain("Should")`) - Placeholder signature pattern `var goFile = "server/..."` without real Arrange/Act/Assert on production code ### Hard Limits - Maximum `~20` features per implementation task group - Maximum `15` IDs per status-update command - One active feature-group status cycle at a time (start, implement, gate, update) - Zero tolerance for unresolved stub-scan hits in touched files - Mandatory checkpoint (build + test + commit) between tasks ### If You Get Stuck (REQUIRED) 1. Stop on the blocked feature/test ID immediately. 2. Remove any partial placeholder code; do not keep a stub. 3. Mark as deferred with explicit blocker reason: ```bash dotnet run --project tools/NatsNet.PortTracker -- feature update --status deferred --override "blocked: " --db porting.db dotnet run --project tools/NatsNet.PortTracker -- test update --status deferred --override "blocked: " --db porting.db ``` 4. Continue with next unblocked ID. 5. Do not write fake-pass tests to bypass blockers. --- ## Feature Groups (<=20 IDs each) ### Group 1 (13 IDs): Connz foundations and query decode `2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178` Scope focus: - `newSubsDetailList`, `newSubsList` - `Connz` core + `ConnInfo.fill` - query decode helpers (`decodeBool`, `decodeUint64`, `decodeInt`, `decodeState`, `decodeSubs`) - `/connz` handler ### Group 2 (9 IDs): Route/Sub/stack/ipqueue monitoring `2179,2180,2181,2182,2183,2184,2185,2186,2187` Scope focus: - `Routez`, `Subsz`, sub detail projections - `/routez`, `/subsz`, `/stacksz`, `/ipqueuesz` handlers ### Group 3 (11 IDs): Varz core and root-level metadata `2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198` Scope focus: - uptime and TLS helper projections - root endpoint output - varz creation and reload/runtime update paths - `/varz` handler ### Group 4 (10 IDs): Gateway monitor projections and handlers `2199,2200,2201,2202,2203,2204,2205,2206,2207,2208` Scope focus: - gateway monitor options and inbound/outbound projections - `/gatewayz` handler ### Group 5 (13 IDs): Leaf/Account monitor surfaces and detail projections `2209,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2221` Scope focus: - `Leafz`, `AccountStatz`, `Accountz` - response helper wrappers (`ResponseHandler`, `handleResponse`) - `ClosedState.String` - account import/export/detail projections (`newExtServiceLatency`, `newExtImport`, `accountInfo`, `accountDetail`) ### Group 6 (14 IDs): JSz, healthz, expvar/profile, raftz `2222,2223,2224,2225,2226,2227,2228,2229,2230,2231,2232,2233,2234,2235` Scope focus: - `JszAccount`, `Jsz`, `/jsz` - health type serialization and `/healthz` internals - `/debug/vars` and profile reporting - `/raftz` endpoint and aggregation --- ## Mapped Test Waves (29 IDs) ### Wave 1 (13 IDs): MonitoringHandlerTests `2064,2087,2090,2092,2093,2112,2117,2120,2121,2143,2150,2157,2165` Target file: - `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/MonitoringHandlerTests.Impltests.cs` Execution notes: - Replace placeholder methods with real endpoint behavior assertions. - `Benchmark_*` mapped entries must still assert measurable behavior in deterministic unit-test style if kept as tests; if they must remain benchmark-only, keep deferred with explicit reason. ### Wave 2 (16 IDs): Cross-class monitor dependencies `89,318,1393,1394,1930,1964,1980,1981,1982,2004,2772,2815,2831,2837,2851,2857` Target files: - `AccountTests.Impltests.cs` - `EventsHandlerTests.Impltests.cs` - `JetStreamJwtTests.Impltests.cs` - `LeafNodeHandlerTests.Impltests.cs` - `ConfigReloaderTests.Impltests.cs` - `RouteHandlerTests.Impltests.cs` Execution notes: - Validate each test still maps to Batch 22 features (`Connz`, `Routez`, `Subsz`, `Varz`, `Leafz`, `Accountz`, `Jsz`, `profilez`) and rewrite assertions around those paths. --- ## Task 1: Preflight and Batch Start **Files:** - Read: `docs/standards/dotnet-standards.md` - Read: `docs/plans/2026-02-27-batch-22-monitoring-design.md` - Read: `golang/nats-server/server/monitor.go` **Step 1: Confirm scope and dependencies** ```bash dotnet run --project tools/NatsNet.PortTracker -- batch show 22 --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 ``` **Step 2: Start batch** ```bash dotnet run --project tools/NatsNet.PortTracker -- batch start 22 --db porting.db ``` **Step 3: Baseline gate** ```bash dotnet build dotnet/ dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ ``` **Step 4: Commit checkpoint** ```bash git add porting.db git commit -m "chore(batch22): start monitoring batch" ``` --- ## Task 2: Implement Feature Group 1 (13 IDs) **Files:** - Create/Modify: `dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Monitoring.Connz.cs` - Modify: `dotnet/src/ZB.MOM.NatsNet.Server/Monitor/MonitorTypes.cs` - Modify: `dotnet/src/ZB.MOM.NatsNet.Server/Monitor/MonitorSortOptions.cs` **Step 1: Move IDs to `stub`** ```bash dotnet run --project tools/NatsNet.PortTracker -- feature batch-update --ids "2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178" --set-status stub --db porting.db --execute ``` **Step 2: Execute Per-Feature Verification Loop for all 13 IDs** **Step 3: Run Stub Detection Check + Build Gate** **Step 4: Move IDs to `complete`** ```bash dotnet run --project tools/NatsNet.PortTracker -- feature batch-update --ids "2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178" --set-status complete --db porting.db --execute ``` **Step 5: Run Checkpoint Protocol** --- ## Task 3: Implement Feature Group 2 (9 IDs) **Files:** - Create/Modify: `dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Monitoring.RouteSub.cs` - Modify: `dotnet/src/ZB.MOM.NatsNet.Server/Monitor/MonitorTypes.cs` **Step 1: Move IDs to `stub`** ```bash dotnet run --project tools/NatsNet.PortTracker -- feature batch-update --ids "2179,2180,2181,2182,2183,2184,2185,2186,2187" --set-status stub --db porting.db --execute ``` **Step 2: Execute Per-Feature Verification Loop for all 9 IDs** **Step 3: Run Stub Detection Check + Build Gate** **Step 4: Move IDs to `complete`** ```bash dotnet run --project tools/NatsNet.PortTracker -- feature batch-update --ids "2179,2180,2181,2182,2183,2184,2185,2186,2187" --set-status complete --db porting.db --execute ``` **Step 5: Run Checkpoint Protocol** --- ## Task 4: Implement Feature Group 3 (11 IDs) **Files:** - Create/Modify: `dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Monitoring.Varz.cs` - Modify: `dotnet/src/ZB.MOM.NatsNet.Server/Monitor/MonitorTypes.cs` **Step 1: Move IDs to `stub`** ```bash dotnet run --project tools/NatsNet.PortTracker -- feature batch-update --ids "2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198" --set-status stub --db porting.db --execute ``` **Step 2: Execute Per-Feature Verification Loop for all 11 IDs** **Step 3: Run Stub Detection Check + Build Gate** **Step 4: Move IDs to `complete`** ```bash dotnet run --project tools/NatsNet.PortTracker -- feature batch-update --ids "2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198" --set-status complete --db porting.db --execute ``` **Step 5: Run Checkpoint Protocol** --- ## Task 5: Implement Feature Group 4 (10 IDs) **Files:** - Create/Modify: `dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Monitoring.GatewayLeaf.cs` - Modify: `dotnet/src/ZB.MOM.NatsNet.Server/Monitor/MonitorTypes.cs` **Step 1: Move IDs to `stub`** ```bash dotnet run --project tools/NatsNet.PortTracker -- feature batch-update --ids "2199,2200,2201,2202,2203,2204,2205,2206,2207,2208" --set-status stub --db porting.db --execute ``` **Step 2: Execute Per-Feature Verification Loop for all 10 IDs** **Step 3: Run Stub Detection Check + Build Gate** **Step 4: Move IDs to `complete`** ```bash dotnet run --project tools/NatsNet.PortTracker -- feature batch-update --ids "2199,2200,2201,2202,2203,2204,2205,2206,2207,2208" --set-status complete --db porting.db --execute ``` **Step 5: Run Checkpoint Protocol** --- ## Task 6: Implement Feature Group 5 (13 IDs) **Files:** - Create/Modify: `dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Monitoring.AccountJsz.cs` - Modify: `dotnet/src/ZB.MOM.NatsNet.Server/ClientTypes.cs` - Modify: `dotnet/src/ZB.MOM.NatsNet.Server/Monitor/MonitorTypes.cs` **Step 1: Move IDs to `stub`** ```bash dotnet run --project tools/NatsNet.PortTracker -- feature batch-update --ids "2209,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2221" --set-status stub --db porting.db --execute ``` **Step 2: Execute Per-Feature Verification Loop for all 13 IDs** **Step 3: Run Stub Detection Check + Build Gate** **Step 4: Move IDs to `complete`** ```bash dotnet run --project tools/NatsNet.PortTracker -- feature batch-update --ids "2209,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2221" --set-status complete --db porting.db --execute ``` **Step 5: Run Checkpoint Protocol** --- ## Task 7: Implement Feature Group 6 (14 IDs) **Files:** - Create/Modify: `dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Monitoring.HealthRaft.cs` - Modify: `dotnet/src/ZB.MOM.NatsNet.Server/Monitor/MonitorTypes.cs` **Step 1: Move IDs to `stub`** ```bash dotnet run --project tools/NatsNet.PortTracker -- feature batch-update --ids "2222,2223,2224,2225,2226,2227,2228,2229,2230,2231,2232,2233,2234,2235" --set-status stub --db porting.db --execute ``` **Step 2: Execute Per-Feature Verification Loop for all 14 IDs** **Step 3: Run Stub Detection Check + Build Gate** **Step 4: Move IDs to `complete`** ```bash dotnet run --project tools/NatsNet.PortTracker -- feature batch-update --ids "2222,2223,2224,2225,2226,2227,2228,2229,2230,2231,2232,2233,2234,2235" --set-status complete --db porting.db --execute ``` **Step 5: Run Checkpoint Protocol** --- ## Task 8: Implement Test Wave 1 (MonitoringHandler class) **Files:** - Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/MonitoringHandlerTests.Impltests.cs` **Mapped IDs:** - `2064,2087,2090,2092,2093,2112,2117,2120,2121,2143,2150,2157,2165` **Step 1: Move IDs to `stub` (max 15, one command valid)** ```bash dotnet run --project tools/NatsNet.PortTracker -- test batch-update --ids "2064,2087,2090,2092,2093,2112,2117,2120,2121,2143,2150,2157,2165" --set-status stub --db porting.db --execute ``` **Step 2: Rewrite each mapped test with real Arrange/Act/Assert behavior** **Step 3: Run class filter and stub checks** ```bash dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ZB.MOM.NatsNet.Server.Tests.ImplBacklog.MonitoringHandlerTests" ``` **Step 4: Move passing IDs to `verified`; keep blocked IDs deferred with reason** ```bash dotnet run --project tools/NatsNet.PortTracker -- test batch-update --ids "" --set-status verified --db porting.db --execute # for blocked IDs: dotnet run --project tools/NatsNet.PortTracker -- test update --status deferred --override "blocked: " --db porting.db ``` **Step 5: Run Checkpoint Protocol** --- ## Task 9: Implement Test Wave 2 (Cross-class mapped tests) **Files:** - Modify: `AccountTests.Impltests.cs` - Modify: `EventsHandlerTests.Impltests.cs` - Modify: `JetStreamJwtTests.Impltests.cs` - Modify: `LeafNodeHandlerTests.Impltests.cs` - Modify: `ConfigReloaderTests.Impltests.cs` - Modify: `RouteHandlerTests.Impltests.cs` **Mapped IDs:** - `89,318,1393,1394,1930,1964,1980,1981,1982,2004,2772,2815,2831,2837,2851,2857` **Step 1: Move IDs to `stub` in chunks <=15** ```bash dotnet run --project tools/NatsNet.PortTracker -- test batch-update --ids "89,318,1393,1394,1930,1964,1980,1981,1982,2004,2772,2815,2831,2837,2851" --set-status stub --db porting.db --execute dotnet run --project tools/NatsNet.PortTracker -- test batch-update --ids "2857" --set-status stub --db porting.db --execute ``` **Step 2: Rewrite mapped tests with real production assertions** **Step 3: Run per-class filters + related endpoint filters** ```bash dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~AccountTests" dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~EventsHandlerTests" dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~JetStreamJwtTests" dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~LeafNodeHandlerTests" dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ConfigReloaderTests" dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~RouteHandlerTests" ``` **Step 4: Move passing IDs to `verified`, defer blocked IDs with reason** ```bash dotnet run --project tools/NatsNet.PortTracker -- test batch-update --ids "" --set-status verified --db porting.db --execute dotnet run --project tools/NatsNet.PortTracker -- test batch-update --ids "" --set-status verified --db porting.db --execute ``` **Step 5: Run Checkpoint Protocol** --- ## Task 10: Promote Features to Verified (After Test Gate) **Files:** - Modify: `porting.db` **Step 1: Run full related test gate (all seven classes)** **Step 2: Promote features `2166-2235` from `complete` to `verified` in chunks <=15** ```bash dotnet run --project tools/NatsNet.PortTracker -- feature batch-update --ids "2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180" --set-status verified --db porting.db --execute dotnet run --project tools/NatsNet.PortTracker -- feature batch-update --ids "2181,2182,2183,2184,2185,2186,2187,2188,2189,2190,2191,2192,2193,2194,2195" --set-status verified --db porting.db --execute dotnet run --project tools/NatsNet.PortTracker -- feature batch-update --ids "2196,2197,2198,2199,2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2210" --set-status verified --db porting.db --execute dotnet run --project tools/NatsNet.PortTracker -- feature batch-update --ids "2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225" --set-status verified --db porting.db --execute dotnet run --project tools/NatsNet.PortTracker -- feature batch-update --ids "2226,2227,2228,2229,2230,2231,2232,2233,2234,2235" --set-status verified --db porting.db --execute ``` **Step 3: Checkpoint Protocol** --- ## Task 11: Final Batch 22 Closure **Files:** - Modify: `porting.db` - Generate: `reports/current.md` (via script) **Step 1: Full regression and final stub audit** ```bash dotnet build dotnet/ dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ grep -R -n -E "(NotImplementedException|TODO|PLACEHOLDER|Assert\.True\(true\)|var goFile = \"server/|ShouldContain\(\"Should\"\))" \ dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Monitoring*.cs \ dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog ``` **Step 2: Validate tracker state** ```bash dotnet run --project tools/NatsNet.PortTracker -- batch show 22 --db porting.db dotnet run --project tools/NatsNet.PortTracker -- report summary --db porting.db dotnet run --project tools/NatsNet.PortTracker -- batch complete 22 --db porting.db ``` **Step 3: Generate report and commit** ```bash ./reports/generate-report.sh git add dotnet/src/ZB.MOM.NatsNet.Server dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog porting.db reports/ git commit -m "feat(batch22): complete monitoring endpoints and mapped tests" ```