Files
natsnet/docs/plans/2026-02-27-batch-20-accounts-resolvers-implementation-plan.md
Joseph Doherty dc3e162608 Add batch plans for batches 13-15, 18-22 (rounds 8-11)
Generated design docs and implementation plans via Codex for:
- Batch 13: FileStore Read/Query
- Batch 14: FileStore Write/Lifecycle
- Batch 15: MsgBlock + ConsumerFileStore
- Batch 18: Server Core
- Batch 19: Accounts Core
- Batch 20: Accounts Resolvers
- Batch 21: Events + MsgTrace
- Batch 22: Monitoring

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

568 lines
24 KiB
Markdown

# Batch 20 Accounts Resolvers Implementation Plan
> **For Codex:** REQUIRED SUB-SKILL: Use `executeplan` to implement this plan task-by-task.
**Goal:** Port and verify Batch 20 (`Accounts Resolvers`) by implementing 38 resolver/account features from `server/accounts.go` and validating 98 mapped tests without introducing stubs.
**Architecture:** Implement in existing account/resolver files (`AccountResolver.cs`, `NatsServer.Accounts.cs`, `Account.cs`, `AccountTypes.cs`) in two feature groups (19 IDs each), then verify/port mapped tests in class-based waves. Status changes are evidence-driven and chunked to max 15 IDs per update.
**Tech Stack:** .NET 10, C# latest, xUnit 3, Shouldly, NSubstitute, PortTracker CLI, SQLite (`porting.db`)
**Design doc:** `docs/plans/2026-02-27-batch-20-accounts-resolvers-design.md`
---
## Batch 20 Scope
- Batch ID: `20`
- Name: `Accounts Resolvers`
- Dependency: batch `19`
- Go source: `golang/nats-server/server/accounts.go`
- Features: `38`
- Tests: `98`
Primary source files:
- `dotnet/src/ZB.MOM.NatsNet.Server/Accounts/AccountResolver.cs`
- `dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Accounts.cs`
- `dotnet/src/ZB.MOM.NatsNet.Server/Accounts/Account.cs`
- `dotnet/src/ZB.MOM.NatsNet.Server/Accounts/AccountTypes.cs`
Primary mapped test files:
- `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/AccountTests.Impltests.cs`
- `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/ConfigReloaderTests.Impltests.cs`
- `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/NatsConsumerTests.Impltests.cs`
- `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamEngineTests.Impltests.cs`
- `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JwtProcessorTests.Impltests.cs`
- `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/EventsHandlerTests.Impltests.cs`
- `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/MonitoringHandlerTests.Impltests.cs`
- `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/MqttHandlerTests.Impltests.cs`
- `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/MqttExternalTests.Impltests.cs`
- `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/GatewayHandlerTests.Impltests.cs`
- `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamBatchingTests.Impltests.cs`
- `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamFileStoreTests.Impltests.cs`
- `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/ConcurrencyTests1.Impltests.cs`
- `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/ConcurrencyTests2.Impltests.cs`
- `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/NatsServerTests.Impltests.cs`
---
## MANDATORY VERIFICATION PROTOCOL
> **NON-NEGOTIABLE:** Every feature and test in Batch 20 must follow this protocol.
### Per-Feature Verification Loop (REQUIRED for every feature ID)
1. Read feature metadata and Go source before editing:
```bash
dotnet run --project tools/NatsNet.PortTracker -- feature show <feature_id> --db porting.db
sed -n '<start_line>,<end_line>p' golang/nats-server/server/accounts.go
```
2. Implement C# behavior in mapped file/class/method (no placeholders).
3. Build immediately:
```bash
dotnet build dotnet/
```
4. Run smallest related test filter immediately (class-level minimum):
```bash
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ \
--filter "FullyQualifiedName~<RelatedClassName>"
```
5. Only after green build + related tests: add feature ID to group `complete` candidate list.
6. If failing, fix before starting the next feature ID.
### Stub Detection Check (REQUIRED after every feature group and test class)
Run on **touched files** and fail the task if new stub hits are introduced:
```bash
# Forbidden tokens and TODO markers
rg -n "(NotImplementedException|TODO|PLACEHOLDER|throw new Exception\(\"TODO\"\))" \
dotnet/src/ZB.MOM.NatsNet.Server/Accounts/AccountResolver.cs \
dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Accounts.cs \
dotnet/src/ZB.MOM.NatsNet.Server/Accounts/Account.cs \
dotnet/src/ZB.MOM.NatsNet.Server/Accounts/AccountTypes.cs \
dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/*.Impltests.cs
# Empty method-body detector
rg -n "^\s*(public|internal|private|protected)\s+[^=;]+\)\s*\{\s*\}$" \
dotnet/src/ZB.MOM.NatsNet.Server/Accounts/AccountResolver.cs \
dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Accounts.cs \
dotnet/src/ZB.MOM.NatsNet.Server/Accounts/Account.cs \
dotnet/src/ZB.MOM.NatsNet.Server/Accounts/AccountTypes.cs
```
If any new violations appear, remove/fix them or defer the blocked ID with reason. Do not continue.
### Build Gate (REQUIRED after each feature group)
```bash
dotnet build dotnet/
```
`Build succeeded` is required before any group IDs move to `complete` or `verified`.
### Test Gate (REQUIRED before setting any feature to `verified`)
All related mapped tests for that feature group must pass:
```bash
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.AccountTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.JwtProcessorTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.ConfigReloaderTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.EventsHandlerTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.MonitoringHandlerTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.NatsConsumerTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.JetStreamEngineTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.ConcurrencyTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.Mqtt"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.GatewayHandlerTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.JetStreamBatchingTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.JetStreamFileStoreTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.NatsServerTests"
```
No feature ID may be set to `verified` until mapped tests are passing or explicitly deferred with reason.
### Status Update Protocol (REQUIRED)
- Maximum `15` IDs per `feature batch-update` or `test batch-update` command.
- Allowed status flow only: `deferred/not_started -> stub -> complete -> verified`.
- Each status update chunk requires evidence captured in notes/log:
- successful build summary
- successful related test summary
- clean stub-scan outcome for touched files
- Never bulk-update across unrelated groups/classes in one command.
### Checkpoint Protocol Between Tasks (REQUIRED)
After every implementation/testing task before starting next task:
1. Full build:
```bash
dotnet build dotnet/
```
2. Full unit test run:
```bash
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/
```
3. Commit checkpoint:
```bash
git add dotnet/src/ZB.MOM.NatsNet.Server/Accounts \
dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Accounts.cs \
dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog \
porting.db
git commit -m "<task-specific message>"
```
---
## ANTI-STUB GUARDRAILS (NON-NEGOTIABLE)
### Forbidden Patterns
The following patterns are forbidden in any completed Batch 20 feature or test:
- `throw new NotImplementedException()`
- Empty method bodies for mapped feature methods (`{ }`)
- `// TODO` or `// PLACEHOLDER` inside newly implemented feature/test bodies
- Placeholder pass assertions (`Assert.True(true)`, equivalent always-pass checks)
- Fake behavior returns (`return null;`, `return string.Empty;`, `return 0;`, `return false;`) where Go behavior is non-trivial
- Tests with no real Arrange/Act/Assert against production code
### Hard Limits
- Max `~20` features per implementation group (this plan uses 19 + 19).
- Max `15` IDs per any status-update command.
- Max one feature group in active status transition at a time.
- No feature may reach `verified` while its mapped tests are still stubbed/unverified without explicit deferred reason.
- Mandatory checkpoint commit after every task.
### If You Get Stuck (REQUIRED BEHAVIOR)
1. Stop work on the blocked ID immediately.
2. Remove any partial placeholder code for that ID.
3. Keep or set status to `deferred` with explicit reason:
```bash
dotnet run --project tools/NatsNet.PortTracker -- feature update <id> --status deferred --override "blocked: <specific reason>" --db porting.db
dotnet run --project tools/NatsNet.PortTracker -- test update <id> --status deferred --override "blocked: <specific reason>" --db porting.db
```
4. Continue with the next unblocked ID.
5. Do not create stubs to preserve momentum.
---
## Feature Groups (Max ~20)
### Group 1 (19 Features)
`150,183,197,208,209,215,250,251,252,253,258,259,260,261,306,307,310,316,318`
### Group 2 (19 Features)
`319,320,326,327,328,330,331,334,335,336,337,338,339,341,343,345,346,347,349`
---
## Test Waves (98 Total)
### Wave 1 (18 tests)
- Account: `86,87,105,108`
- JWT: `1819,1821,1823,1825,1830,1831,1841,1849,1894`
- Events: `307,346,347`
- Monitoring: `2125,2141`
### Wave 2 (40 tests)
- Config reload: `2721,2722,2724,2725,2726,2727,2728,2729,2730,2731,2732,2733,2734,2735,2736,2737,2738,2739,2741,2742,2743,2744,2745,2746,2750,2752,2753,2754,2761,2767,2768,2769,2770,2771,2773,2775,2776,2779,2781,2793`
### Wave 3 (40 tests)
- NatsConsumer: `1238,1254,1296,1300,1305,1307,1322,1324,1329,1331,1351,1354,1360,1375,1377,1378`
- JetStreamEngine: `1566,1578,1579,1679,1680,1698,1705,1706,1712,1729,1730,1738`
- Concurrency: `2379,2386,2444,2445,2500`
- MQTT/Gateway/Other: `2169,2184,2262,683,723,493,2893`
---
## Task 1: Preflight and Batch Start
**Files:**
- Read: `docs/standards/dotnet-standards.md`
- Read: `golang/nats-server/server/accounts.go`
- Read: `docs/plans/2026-02-27-batch-20-accounts-resolvers-design.md`
**Step 1: Confirm dependency and scope**
```bash
dotnet run --project tools/NatsNet.PortTracker -- batch list --db porting.db
dotnet run --project tools/NatsNet.PortTracker -- batch show 20 --db porting.db
dotnet run --project tools/NatsNet.PortTracker -- report summary --db porting.db
```
Expected: Batch 20 depends on Batch 19 and remains pending or ready.
**Step 2: Start the batch**
```bash
dotnet run --project tools/NatsNet.PortTracker -- batch start 20 --db porting.db
```
Expected: batch status becomes `in_progress`.
**Step 3: Baseline verification**
```bash
dotnet build dotnet/
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/
```
Expected: baseline output captured before edits.
**Step 4: Commit checkpoint**
```bash
git add porting.db
git commit -m "chore(batch20): start accounts resolvers batch"
```
---
## Task 2: Implement Feature Group 1 (19 IDs)
**Files:**
- Modify: `dotnet/src/ZB.MOM.NatsNet.Server/Accounts/AccountTypes.cs`
- Modify: `dotnet/src/ZB.MOM.NatsNet.Server/Accounts/Account.cs`
- Modify: `dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Accounts.cs`
**Step 1: Move Group 1 to `stub` in max-15 chunks**
```bash
dotnet run --project tools/NatsNet.PortTracker -- feature batch-update --ids "150,183,197,208,209,215,250,251,252,253,258,259,260,261,306" --set-status stub --db porting.db --execute
dotnet run --project tools/NatsNet.PortTracker -- feature batch-update --ids "307,310,316,318" --set-status stub --db porting.db --execute
```
**Step 2: Execute per-feature verification loop for all 19 IDs**
For each ID: `feature show` -> read Go range -> implement -> build -> run related tests.
**Step 3: Group build + focused tests**
```bash
dotnet build dotnet/
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.AccountTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.JwtProcessorTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.EventsHandlerTests"
```
**Step 4: Run stub detection check**
Use the mandatory stub-scan commands.
**Step 5: Move Group 1 to `complete` in max-15 chunks**
```bash
dotnet run --project tools/NatsNet.PortTracker -- feature batch-update --ids "150,183,197,208,209,215,250,251,252,253,258,259,260,261,306" --set-status complete --db porting.db --execute
dotnet run --project tools/NatsNet.PortTracker -- feature batch-update --ids "307,310,316,318" --set-status complete --db porting.db --execute
```
**Step 6: Checkpoint protocol + commit**
```bash
dotnet build dotnet/
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/
git add dotnet/src/ZB.MOM.NatsNet.Server/Accounts/Account.cs \
dotnet/src/ZB.MOM.NatsNet.Server/Accounts/AccountTypes.cs \
dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Accounts.cs \
porting.db
git commit -m "feat(batch20): implement resolver/latency/account refresh group"
```
---
## Task 3: Implement Feature Group 2 (19 IDs)
**Files:**
- Modify: `dotnet/src/ZB.MOM.NatsNet.Server/Accounts/AccountResolver.cs`
- Modify: `dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Accounts.cs`
- Modify: `dotnet/src/ZB.MOM.NatsNet.Server/Accounts/Account.cs`
**Step 1: Move Group 2 to `stub` in max-15 chunks**
```bash
dotnet run --project tools/NatsNet.PortTracker -- feature batch-update --ids "319,320,326,327,328,330,331,334,335,336,337,338,339,341,343" --set-status stub --db porting.db --execute
dotnet run --project tools/NatsNet.PortTracker -- feature batch-update --ids "345,346,347,349" --set-status stub --db porting.db --execute
```
**Step 2: Execute per-feature verification loop for all 19 IDs**
For each ID: `feature show` -> Go source -> implement -> build -> targeted tests.
**Step 3: Group build + focused tests**
```bash
dotnet build dotnet/
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.AccountTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.ConfigReloaderTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.MonitoringHandlerTests"
```
**Step 4: Run stub detection check**
Use the mandatory stub-scan commands.
**Step 5: Move Group 2 to `complete` in max-15 chunks**
```bash
dotnet run --project tools/NatsNet.PortTracker -- feature batch-update --ids "319,320,326,327,328,330,331,334,335,336,337,338,339,341,343" --set-status complete --db porting.db --execute
dotnet run --project tools/NatsNet.PortTracker -- feature batch-update --ids "345,346,347,349" --set-status complete --db porting.db --execute
```
**Step 6: Checkpoint protocol + commit**
```bash
dotnet build dotnet/
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/
git add dotnet/src/ZB.MOM.NatsNet.Server/Accounts/AccountResolver.cs \
dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Accounts.cs \
dotnet/src/ZB.MOM.NatsNet.Server/Accounts/Account.cs \
porting.db
git commit -m "feat(batch20): implement resolver backends and operator helper paths"
```
---
## Task 4: Port and Verify Test Wave 1 (18 IDs)
**Files:**
- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/AccountTests.Impltests.cs`
- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JwtProcessorTests.Impltests.cs`
- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/EventsHandlerTests.Impltests.cs`
- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/MonitoringHandlerTests.Impltests.cs`
**Step 1: Move Wave 1 IDs to `stub` in max-15 chunks**
```bash
dotnet run --project tools/NatsNet.PortTracker -- test batch-update --ids "86,87,105,108,1819,1821,1823,1825,1830,1831,1841,1849,1894,307,346" --set-status stub --db porting.db --execute
dotnet run --project tools/NatsNet.PortTracker -- test batch-update --ids "347,2125,2141" --set-status stub --db porting.db --execute
```
**Step 2: Per-test loop for each ID**
For each test ID: `test show` -> read Go test range -> port behavior -> run single test -> verify `Passed: 1`.
**Step 3: Class-level gates**
```bash
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.AccountTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.JwtProcessorTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.EventsHandlerTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.MonitoringHandlerTests"
```
**Step 4: Stub scan + move Wave 1 to `verified`**
```bash
dotnet run --project tools/NatsNet.PortTracker -- test batch-update --ids "86,87,105,108,1819,1821,1823,1825,1830,1831,1841,1849,1894,307,346" --set-status verified --db porting.db --execute
dotnet run --project tools/NatsNet.PortTracker -- test batch-update --ids "347,2125,2141" --set-status verified --db porting.db --execute
```
**Step 5: Checkpoint protocol + commit**
```bash
dotnet build dotnet/
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/
git add dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog porting.db
git commit -m "test(batch20): verify account jwt events monitoring mapped tests"
```
---
## Task 5: Port and Verify Test Wave 2 (Config Reload, 40 IDs)
**Files:**
- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/ConfigReloaderTests.Impltests.cs`
**Step 1: Move Wave 2 IDs to `stub` in max-15 chunks**
```bash
dotnet run --project tools/NatsNet.PortTracker -- test batch-update --ids "2721,2722,2724,2725,2726,2727,2728,2729,2730,2731,2732,2733,2734,2735,2736" --set-status stub --db porting.db --execute
dotnet run --project tools/NatsNet.PortTracker -- test batch-update --ids "2737,2738,2739,2741,2742,2743,2744,2745,2746,2750,2752,2753,2754,2761,2767" --set-status stub --db porting.db --execute
dotnet run --project tools/NatsNet.PortTracker -- test batch-update --ids "2768,2769,2770,2771,2773,2775,2776,2779,2781,2793" --set-status stub --db porting.db --execute
```
**Step 2: Port in sub-batches of ~10 tests**
For each sub-batch: port tests -> run single-test checks -> run full class filter.
**Step 3: Class gate**
```bash
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.ConfigReloaderTests"
```
Expected: all 40 mapped IDs passing.
**Step 4: Stub scan + move Wave 2 IDs to `verified` in same 3 chunks**
Run the same ID chunks with `--set-status verified`.
**Step 5: Checkpoint protocol + commit**
```bash
dotnet build dotnet/
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/
git add dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/ConfigReloaderTests.Impltests.cs porting.db
git commit -m "test(batch20): verify config reload mapped tests"
```
---
## Task 6: Port and Verify Test Wave 3 (40 IDs)
**Files:**
- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/NatsConsumerTests.Impltests.cs`
- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamEngineTests.Impltests.cs`
- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/ConcurrencyTests1.Impltests.cs`
- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/ConcurrencyTests2.Impltests.cs`
- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/MqttExternalTests.Impltests.cs`
- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/MqttHandlerTests.Impltests.cs`
- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/GatewayHandlerTests.Impltests.cs`
- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamBatchingTests.Impltests.cs`
- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamFileStoreTests.Impltests.cs`
- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/NatsServerTests.Impltests.cs`
**Step 1: Move Wave 3 IDs to `stub` in max-15 chunks**
```bash
dotnet run --project tools/NatsNet.PortTracker -- test batch-update --ids "1238,1254,1296,1300,1305,1307,1322,1324,1329,1331,1351,1354,1360,1375,1377" --set-status stub --db porting.db --execute
dotnet run --project tools/NatsNet.PortTracker -- test batch-update --ids "1378,1566,1578,1579,1679,1680,1698,1705,1706,1712,1729,1730,1738,2379,2386" --set-status stub --db porting.db --execute
dotnet run --project tools/NatsNet.PortTracker -- test batch-update --ids "2444,2445,2500,2169,2184,2262,683,723,493,2893" --set-status stub --db porting.db --execute
```
**Step 2: Port and verify per class**
Run single-test loops and then class filters for each touched class.
**Step 3: Class gates**
```bash
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.NatsConsumerTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.JetStreamEngineTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.ConcurrencyTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.Mqtt"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.GatewayHandlerTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.JetStreamBatchingTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.JetStreamFileStoreTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ImplBacklog.NatsServerTests"
```
**Step 4: Stub scan + move Wave 3 IDs to `verified` in same 3 chunks**
Run the same ID chunks with `--set-status verified`.
**Step 5: Checkpoint protocol + commit**
```bash
dotnet build dotnet/
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/
git add dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog porting.db
git commit -m "test(batch20): verify jetstream mqtt concurrency and misc mapped tests"
```
---
## Task 7: Final Feature Verification, Batch Completion, and Report
**Files:**
- Modify: `porting.db`
- Generate: `reports/current.md` (via report script)
**Step 1: Promote feature groups from `complete` to `verified` in max-15 chunks**
Group 1:
```bash
dotnet run --project tools/NatsNet.PortTracker -- feature batch-update --ids "150,183,197,208,209,215,250,251,252,253,258,259,260,261,306" --set-status verified --db porting.db --execute
dotnet run --project tools/NatsNet.PortTracker -- feature batch-update --ids "307,310,316,318" --set-status verified --db porting.db --execute
```
Group 2:
```bash
dotnet run --project tools/NatsNet.PortTracker -- feature batch-update --ids "319,320,326,327,328,330,331,334,335,336,337,338,339,341,343" --set-status verified --db porting.db --execute
dotnet run --project tools/NatsNet.PortTracker -- feature batch-update --ids "345,346,347,349" --set-status verified --db porting.db --execute
```
**Step 2: Final full gates**
```bash
dotnet build dotnet/
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/
dotnet run --project tools/NatsNet.PortTracker -- batch show 20 --db porting.db
dotnet run --project tools/NatsNet.PortTracker -- batch complete 20 --db porting.db
```
Expected: batch completion succeeds (or explicit list of blocked IDs).
**Step 3: Dependency/report update and commit**
```bash
dotnet run --project tools/NatsNet.PortTracker -- dependency ready --db porting.db
./reports/generate-report.sh
git add porting.db reports/
git commit -m "chore(batch20): complete accounts resolvers batch"
```
---
## Evidence Checklist (Use Before Every Status Update)
1. Feature/test IDs updated are listed explicitly (<=15 per command).
2. Build output captured and green.
3. Related test output captured and green.
4. Stub scan re-run and no new violations in touched files.
5. Any blocked IDs are deferred with explicit reason (no placeholders).