Files
natsnet/docs/plans/2026-02-27-batch-24-leaf-nodes-implementation-plan.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

648 lines
24 KiB
Markdown

# Batch 24 Leaf Nodes Implementation Plan
> **For Codex:** REQUIRED SUB-SKILL: Use `executeplan` to implement this plan task-by-task.
**Goal:** Port and verify Batch 24 (`Leaf Nodes`) by implementing 67 deferred leaf-node features from `server/leafnode.go` and implementing/verifying the 2 mapped tests with real behavioral coverage.
**Architecture:** Implement leaf-node behavior in domain-focused partials for `ClientConnection` and `NatsServer`, plus helper logic in `LeafNodeHandler`/`LeafNodeCfg` and account propagation updates in `Account`. Execute in four feature groups (18/18/14/17 IDs), each with a strict per-feature verification loop and hard gates. Only promote `complete -> verified` after both mapped tests and all related regression 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-24-leaf-nodes-design.md`
---
## Batch 24 Scope
- Batch ID: `24`
- Name: `Leaf Nodes`
- Dependencies: `19`, `23`
- Go source: `golang/nats-server/server/leafnode.go`
- Features: `67`
- Tests: `2`
Reference commands:
```bash
dotnet run --project tools/NatsNet.PortTracker -- batch show 24 --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
```
If `dotnet` is not on `PATH` in your shell, use `/usr/local/share/dotnet/dotnet` in the same commands.
Primary production files:
- Create: `dotnet/src/ZB.MOM.NatsNet.Server/ClientConnection.LeafNodes.cs`
- Create: `dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.LeafNodes.ConfigAndConnect.cs`
- Create: `dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.LeafNodes.Subscriptions.cs`
- Create: `dotnet/src/ZB.MOM.NatsNet.Server/LeafNode/LeafNodeHandler.cs`
- Modify: `dotnet/src/ZB.MOM.NatsNet.Server/LeafNode/LeafNodeTypes.cs`
- Modify: `dotnet/src/ZB.MOM.NatsNet.Server/Accounts/Account.cs`
- Modify: `dotnet/src/ZB.MOM.NatsNet.Server/Protocol/ProtocolParser.cs`
- Modify (as needed): `dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Lifecycle.cs`
Mapped test files:
- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/LeafNodeHandlerTests.Impltests.cs`
- 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/Accounts/ResolverDefaultsOpsTests.cs`
- `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ClientTests.cs`
---
## MANDATORY VERIFICATION PROTOCOL
> **NON-NEGOTIABLE:** Every Batch 24 feature/test update must follow this protocol.
### Per-Feature Verification Loop (REQUIRED for every feature ID)
1. Read tracked metadata and Go source before coding:
```bash
dotnet run --project tools/NatsNet.PortTracker -- feature show <feature_id> --db porting.db
# then open golang/nats-server/server/leafnode.go at go_line_number..(go_line_number + go_line_count)
```
2. Write/adjust C# implementation for that specific feature.
3. Build immediately after each feature (or tightly coupled pair):
```bash
dotnet build dotnet/
```
4. Run the smallest related tests immediately (feature-local gate):
```bash
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ \
--filter "FullyQualifiedName~ProtocolParserTests|FullyQualifiedName~ResolverDefaultsOpsTests|FullyQualifiedName~ClientTests|FullyQualifiedName~LeafNodeHandlerTests|FullyQualifiedName~RouteHandlerTests"
```
5. Record evidence per feature ID: Go line(s) read, files touched, build status, test command, test summary.
6. If any command is red, fix before moving to the next ID.
### Stub Detection Check (REQUIRED after every feature group and test wave)
Run before any status promotion:
```bash
# 1) Forbidden markers in mapped production and test files
grep -R -n -E "(NotImplementedException|TODO|PLACEHOLDER)" \
dotnet/src/ZB.MOM.NatsNet.Server/ClientConnection*.cs \
dotnet/src/ZB.MOM.NatsNet.Server/NatsServer*.cs \
dotnet/src/ZB.MOM.NatsNet.Server/LeafNode/*.cs \
dotnet/src/ZB.MOM.NatsNet.Server/Accounts/Account.cs \
dotnet/src/ZB.MOM.NatsNet.Server/Protocol/ProtocolParser.cs \
dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/LeafNodeHandlerTests.Impltests.cs \
dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/RouteHandlerTests.Impltests.cs
# 2) Empty method bodies in mapped production files
grep -R -n -E "^[[:space:]]*(public|internal|private|protected)[^{;=]*\\)[[:space:]]*\\{[[:space:]]*\\}$" \
dotnet/src/ZB.MOM.NatsNet.Server/ClientConnection*.cs \
dotnet/src/ZB.MOM.NatsNet.Server/NatsServer*.cs \
dotnet/src/ZB.MOM.NatsNet.Server/LeafNode/*.cs \
dotnet/src/ZB.MOM.NatsNet.Server/Accounts/Account.cs \
dotnet/src/ZB.MOM.NatsNet.Server/Protocol/ProtocolParser.cs
```
Any hit must be fixed or deferred with a reason. Do not promote status with unresolved hits.
### Build Gate (REQUIRED after each feature group)
```bash
dotnet build dotnet/
```
`Build succeeded` is mandatory before any `stub -> complete` update.
### Test Gate (REQUIRED before any `complete -> verified` promotion)
All related tests must pass:
```bash
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ZB.MOM.NatsNet.Server.Tests.Protocol.ProtocolParserTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ZB.MOM.NatsNet.Server.Tests.Accounts.ResolverDefaultsOpsTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ZB.MOM.NatsNet.Server.Tests.ClientTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~LeafNodeHandlerTests.LeafNodeRoutedSubKeyDifferentBetweenLeafSubAndRoutedSub_ShouldSucceed"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~RouteHandlerTests.ClusterQueueGroupWeightTrackingLeak_ShouldSucceed"
```
No Batch 24 feature may be marked `verified` until both mapped tests and this regression gate are green.
### Status Update Protocol (REQUIRED)
- Never include more than `15` IDs in a single `feature batch-update` or `test batch-update`.
- Required progression:
- `deferred -> stub` when active work begins.
- `stub -> complete` only after clean stub checks + build gate.
- `complete -> verified` only after full Test Gate passes.
- Evidence is required for each update chunk:
- build output summary,
- related test output summary,
- clean stub scan output,
- explicit IDs being promoted and why.
Command templates:
```bash
dotnet run --project tools/NatsNet.PortTracker -- \
feature batch-update --ids "<max 15 ids>" --set-status <stub|complete|verified> --db porting.db --execute
dotnet run --project tools/NatsNet.PortTracker -- \
test batch-update --ids "<max 15 ids>" --set-status <stub|complete|verified> --db porting.db --execute
```
### Checkpoint Protocol Between Tasks (REQUIRED)
After each task (feature group or test wave), before starting the next task:
```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 "<batch24 checkpoint message>"
```
Do not continue if checkpoint gates fail.
### If You Get Stuck (REQUIRED)
1. Stop on the blocked ID.
2. Remove partial placeholders; do not leave stubs in-tree.
3. Mark the blocked item `deferred` with a specific 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. Move to next unblocked ID.
5. Do not create fake-pass code/tests to force progress.
---
## ANTI-STUB GUARDRAILS (NON-NEGOTIABLE)
### Forbidden Patterns
The following are forbidden in Batch 24 feature and test work:
- `throw new NotImplementedException()` in mapped feature methods
- Empty method bodies for mapped features
- `// TODO` or `// PLACEHOLDER` in mapped code paths
- Non-semantic default placeholders (`return null;`, `return false;`, `return 0;`, `return string.Empty;`) for non-trivial methods
- ImplBacklog fake assertions such as `"...".ShouldContain("Should")`
- Tests that do not call production code
- Tests with no meaningful assertions on behavior under test
### Hard Limits
- Maximum `20` features per feature task
- Maximum `15` IDs per status-update command
- One feature group active at a time
- Zero unresolved stub-scan hits before any promotion
- Mandatory checkpoint (full build + full tests + commit) between tasks
---
## Feature Groups (<=20 IDs each)
### Group 1 (18 IDs): Identity, validation, and remote-config bootstrap
IDs:
`1979,1980,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997`
Focus:
- Leaf role identity checks (`solicited`, `spoke`, `isolated`)
- Remote solicitation validity checks and TLS config updates
- Leaf config construction and URL/delay helpers
- Validation helpers (`validateLeafNode*`) and proxy tunnel setup
### Group 2 (18 IDs): Connect loop, listener, CONNECT/INFO foundation
IDs:
`1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015`
Focus:
- Outbound connect/reconnect and observer/migration timer handling
- Listener accept loop and leaf client creation path
- Leaf CONNECT payload generation and INFO handling
- Compression negotiation and server leaf-info broadcast helpers
### Group 3 (14 IDs): Connection registration and account/smap propagation
IDs:
`2016,2017,2018,2019,2021,2022,2024,2025,2026,2027,2029,2030,2031,2032`
Focus:
- Remote URL update flow and host/port/IP advertisement
- Leaf connection registration and inbound CONNECT processing
- Account permission and subscription map initialization
- Gateway interest update and account leaf propagation (`UpdateLeafNodesEx`)
### Group 4 (17 IDs): Sub keys, sub/unsub and inbound message pipeline
IDs:
`2033,2034,2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049`
Focus:
- Routed-sub key generation (`keyFromSub`, `keyFromSubWithOrigin`)
- Leaf sub protocol serialization and sub/unsub handlers
- Leaf MSG/HMSG arg parsing and inbound message processing
- Permission violation/error paths
- TLS/ws solicit helpers and resume/finish connect process
---
## Mapped Test Wave (2 IDs)
IDs:
`1966,2825`
Target methods:
- `LeafNodeHandlerTests.LeafNodeRoutedSubKeyDifferentBetweenLeafSubAndRoutedSub_ShouldSucceed`
- `RouteHandlerTests.ClusterQueueGroupWeightTrackingLeak_ShouldSucceed`
Target files:
- `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/LeafNodeHandlerTests.Impltests.cs`
- `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/RouteHandlerTests.Impltests.cs`
---
## Task 1: Preflight and Dependency Gate
**Files:**
- Read: `docs/standards/dotnet-standards.md`
- Read: `docs/plans/2026-02-27-batch-24-leaf-nodes-design.md`
- Read: `golang/nats-server/server/leafnode.go`
**Step 1: Confirm batch context**
```bash
dotnet run --project tools/NatsNet.PortTracker -- batch show 24 --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: Verify dependency readiness**
```bash
dotnet run --project tools/NatsNet.PortTracker -- batch ready --db porting.db
```
Expected: Batch `24` is listed as ready. If not, stop implementation and keep planning-only state.
**Step 3: Start batch and run baseline gate**
```bash
dotnet run --project tools/NatsNet.PortTracker -- batch start 24 --db porting.db
dotnet build dotnet/
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/
```
**Step 4: Checkpoint commit**
```bash
git add porting.db
git commit -m "chore(batch24): start leaf nodes batch"
```
---
## Task 2: Implement Feature Group 1 (18 IDs)
**Files:**
- Create/Modify: `dotnet/src/ZB.MOM.NatsNet.Server/LeafNode/LeafNodeHandler.cs`
- Create/Modify: `dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.LeafNodes.ConfigAndConnect.cs`
- Modify: `dotnet/src/ZB.MOM.NatsNet.Server/LeafNode/LeafNodeTypes.cs`
- Modify (as needed): `dotnet/src/ZB.MOM.NatsNet.Server/ClientConnection.cs`
**Step 1: Move Group 1 to `stub` in chunks <=15**
```bash
dotnet run --project tools/NatsNet.PortTracker -- \
feature batch-update --ids "1979,1980,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994" --set-status stub --db porting.db --execute
dotnet run --project tools/NatsNet.PortTracker -- \
feature batch-update --ids "1995,1996,1997" --set-status stub --db porting.db --execute
```
**Step 2: Execute Per-Feature Verification Loop for all 18 IDs**
**Step 3: Run mandatory stub checks + build gate + related tests**
```bash
# run stub detection check from protocol section
dotnet build dotnet/
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ProtocolParserTests|FullyQualifiedName~ClientTests"
```
**Step 4: Move Group 1 to `complete` in chunks <=15**
```bash
dotnet run --project tools/NatsNet.PortTracker -- \
feature batch-update --ids "1979,1980,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994" --set-status complete --db porting.db --execute
dotnet run --project tools/NatsNet.PortTracker -- \
feature batch-update --ids "1995,1996,1997" --set-status complete --db porting.db --execute
```
**Step 5: Run Checkpoint Protocol and commit**
```bash
git commit -m "feat(batch24): implement leaf validation and remote config bootstrap"
```
---
## Task 3: Implement Feature Group 2 (18 IDs)
**Files:**
- Create/Modify: `dotnet/src/ZB.MOM.NatsNet.Server/ClientConnection.LeafNodes.cs`
- Create/Modify: `dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.LeafNodes.ConfigAndConnect.cs`
- Modify: `dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Lifecycle.cs`
- Modify: `dotnet/src/ZB.MOM.NatsNet.Server/LeafNode/LeafNodeTypes.cs`
**Step 1: Move Group 2 to `stub` in chunks <=15**
```bash
dotnet run --project tools/NatsNet.PortTracker -- \
feature batch-update --ids "1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012" --set-status stub --db porting.db --execute
dotnet run --project tools/NatsNet.PortTracker -- \
feature batch-update --ids "2013,2014,2015" --set-status stub --db porting.db --execute
```
**Step 2: Execute Per-Feature Verification Loop for all 18 IDs**
**Step 3: Run mandatory stub checks + build gate + related tests**
```bash
# run stub detection check from protocol section
dotnet build dotnet/
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ProtocolParserTests|FullyQualifiedName~ClientTests"
```
**Step 4: Move Group 2 to `complete` in chunks <=15**
```bash
dotnet run --project tools/NatsNet.PortTracker -- \
feature batch-update --ids "1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012" --set-status complete --db porting.db --execute
dotnet run --project tools/NatsNet.PortTracker -- \
feature batch-update --ids "2013,2014,2015" --set-status complete --db porting.db --execute
```
**Step 5: Run Checkpoint Protocol and commit**
```bash
git commit -m "feat(batch24): implement leaf connect lifecycle and handshake foundation"
```
---
## Task 4: Implement Feature Group 3 (14 IDs)
**Files:**
- Create/Modify: `dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.LeafNodes.Subscriptions.cs`
- Create/Modify: `dotnet/src/ZB.MOM.NatsNet.Server/ClientConnection.LeafNodes.cs`
- Modify: `dotnet/src/ZB.MOM.NatsNet.Server/Accounts/Account.cs`
**Step 1: Move Group 3 to `stub`**
```bash
dotnet run --project tools/NatsNet.PortTracker -- \
feature batch-update --ids "2016,2017,2018,2019,2021,2022,2024,2025,2026,2027,2029,2030,2031,2032" --set-status stub --db porting.db --execute
```
**Step 2: Execute Per-Feature Verification Loop for all 14 IDs**
**Step 3: Run mandatory stub checks + build gate + related tests**
```bash
# run stub detection check from protocol section
dotnet build dotnet/
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ResolverDefaultsOpsTests|FullyQualifiedName~ClientTests|FullyQualifiedName~ProtocolParserTests"
```
**Step 4: Move Group 3 to `complete`**
```bash
dotnet run --project tools/NatsNet.PortTracker -- \
feature batch-update --ids "2016,2017,2018,2019,2021,2022,2024,2025,2026,2027,2029,2030,2031,2032" --set-status complete --db porting.db --execute
```
**Step 5: Run Checkpoint Protocol and commit**
```bash
git commit -m "feat(batch24): implement leaf registration and account interest propagation"
```
---
## Task 5: Implement Feature Group 4 (17 IDs)
**Files:**
- Create/Modify: `dotnet/src/ZB.MOM.NatsNet.Server/ClientConnection.LeafNodes.cs`
- Modify: `dotnet/src/ZB.MOM.NatsNet.Server/Protocol/ProtocolParser.cs`
- Create/Modify: `dotnet/src/ZB.MOM.NatsNet.Server/LeafNode/LeafNodeHandler.cs`
- Create/Modify: `dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.LeafNodes.ConfigAndConnect.cs`
**Step 1: Move Group 4 to `stub` in chunks <=15**
```bash
dotnet run --project tools/NatsNet.PortTracker -- \
feature batch-update --ids "2033,2034,2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047" --set-status stub --db porting.db --execute
dotnet run --project tools/NatsNet.PortTracker -- \
feature batch-update --ids "2048,2049" --set-status stub --db porting.db --execute
```
**Step 2: Execute Per-Feature Verification Loop for all 17 IDs**
**Step 3: Run mandatory stub checks + build gate + related tests**
```bash
# run stub detection check from protocol section
dotnet build dotnet/
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ProtocolParserTests|FullyQualifiedName~ResolverDefaultsOpsTests|FullyQualifiedName~ClientTests"
```
**Step 4: Move Group 4 to `complete` in chunks <=15**
```bash
dotnet run --project tools/NatsNet.PortTracker -- \
feature batch-update --ids "2033,2034,2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047" --set-status complete --db porting.db --execute
dotnet run --project tools/NatsNet.PortTracker -- \
feature batch-update --ids "2048,2049" --set-status complete --db porting.db --execute
```
**Step 5: Run Checkpoint Protocol and commit**
```bash
git commit -m "feat(batch24): implement leaf sub and inbound message pipeline"
```
---
## Task 6: Implement and Verify the 2 Mapped Tests
**Files:**
- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/LeafNodeHandlerTests.Impltests.cs`
- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/RouteHandlerTests.Impltests.cs`
**Step 1: Move tests to `stub`**
```bash
dotnet run --project tools/NatsNet.PortTracker -- \
test batch-update --ids "1966,2825" --set-status stub --db porting.db --execute
```
**Step 2: Per-test loop for each ID**
```bash
dotnet run --project tools/NatsNet.PortTracker -- test show 1966 --db porting.db
dotnet run --project tools/NatsNet.PortTracker -- test show 2825 --db porting.db
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ \
--filter "FullyQualifiedName~LeafNodeHandlerTests.LeafNodeRoutedSubKeyDifferentBetweenLeafSubAndRoutedSub_ShouldSucceed"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ \
--filter "FullyQualifiedName~RouteHandlerTests.ClusterQueueGroupWeightTrackingLeak_ShouldSucceed"
```
**Step 3: Mandatory stub scan on test files + class-level run**
```bash
grep -n -E "(NotImplementedException|Assert\\.True\\(true\\)|TODO|PLACEHOLDER|ShouldContain\\(\"Should\"\\))" \
dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/LeafNodeHandlerTests.Impltests.cs \
dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/RouteHandlerTests.Impltests.cs
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~LeafNodeHandlerTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~RouteHandlerTests"
```
**Step 4: Move tests to `complete`**
```bash
dotnet run --project tools/NatsNet.PortTracker -- \
test batch-update --ids "1966,2825" --set-status complete --db porting.db --execute
```
**Step 5: Run Checkpoint Protocol and commit**
```bash
git commit -m "test(batch24): port mapped leaf-node tests"
```
---
## Task 7: Verification Gate and Promote to `verified`
**Files:**
- Modify: `porting.db`
**Step 1: Run full Batch 24 test gate**
```bash
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ZB.MOM.NatsNet.Server.Tests.Protocol.ProtocolParserTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ZB.MOM.NatsNet.Server.Tests.Accounts.ResolverDefaultsOpsTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~ZB.MOM.NatsNet.Server.Tests.ClientTests"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~LeafNodeHandlerTests.LeafNodeRoutedSubKeyDifferentBetweenLeafSubAndRoutedSub_ShouldSucceed"
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ --filter "FullyQualifiedName~RouteHandlerTests.ClusterQueueGroupWeightTrackingLeak_ShouldSucceed"
```
**Step 2: Promote tests to `verified`**
```bash
dotnet run --project tools/NatsNet.PortTracker -- \
test batch-update --ids "1966,2825" --set-status verified --db porting.db --execute
```
**Step 3: Promote all features to `verified` in chunks <=15**
```bash
dotnet run --project tools/NatsNet.PortTracker -- \
feature batch-update --ids "1979,1980,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994" --set-status verified --db porting.db --execute
dotnet run --project tools/NatsNet.PortTracker -- \
feature batch-update --ids "1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009" --set-status verified --db porting.db --execute
dotnet run --project tools/NatsNet.PortTracker -- \
feature batch-update --ids "2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2021,2022,2024,2025,2026" --set-status verified --db porting.db --execute
dotnet run --project tools/NatsNet.PortTracker -- \
feature batch-update --ids "2027,2029,2030,2031,2032,2033,2034,2035,2036,2037,2038,2039,2040,2041,2042" --set-status verified --db porting.db --execute
dotnet run --project tools/NatsNet.PortTracker -- \
feature batch-update --ids "2043,2044,2045,2046,2047,2048,2049" --set-status verified --db porting.db --execute
```
**Step 4: Run Checkpoint Protocol and commit**
```bash
git commit -m "feat(batch24): verify all leaf-node features and mapped tests"
```
---
## Task 8: Batch Closure and Reporting
**Files:**
- Modify: `porting.db`
- Generate: `reports/current.md`
**Step 1: Final build/test sweep**
```bash
dotnet build dotnet/
dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/
```
**Step 2: Final Batch 24 stub audit**
```bash
grep -R -n -E "(NotImplementedException|TODO|PLACEHOLDER)" \
dotnet/src/ZB.MOM.NatsNet.Server/ClientConnection*.cs \
dotnet/src/ZB.MOM.NatsNet.Server/NatsServer*.cs \
dotnet/src/ZB.MOM.NatsNet.Server/LeafNode/*.cs \
dotnet/src/ZB.MOM.NatsNet.Server/Accounts/Account.cs \
dotnet/src/ZB.MOM.NatsNet.Server/Protocol/ProtocolParser.cs \
dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/LeafNodeHandlerTests.Impltests.cs \
dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/RouteHandlerTests.Impltests.cs
```
**Step 3: Verify batch closure**
```bash
dotnet run --project tools/NatsNet.PortTracker -- batch show 24 --db porting.db
dotnet run --project tools/NatsNet.PortTracker -- batch complete 24 --db porting.db
dotnet run --project tools/NatsNet.PortTracker -- report summary --db porting.db
```
**Step 4: Generate report and final 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(batch24): complete leaf nodes implementation and verification"
```