Generated design docs and implementation plans via Codex for: - Batch 37: Stream Messages - Batch 38: Consumer Lifecycle - Batch 39: Consumer Dispatch - Batch 40: MQTT Server/JSA - Batch 41: MQTT Client/IO All plans include mandatory verification protocol and anti-stub guardrails. Updated batches.md with file paths and planned status. All 42 batches (0-41) now have design docs and implementation plans.
7.8 KiB
Batch 39 Consumer Dispatch Design
Date: 2026-02-27
Batch: 39 (Consumer Dispatch)
Scope: 93 features + 53 unit tests
Dependencies: Batch 38
Go source: golang/nats-server/server/consumer.go (dispatch-heavy region around lines 3925-6706)
Problem
Batch 39 contains the JetStream consumer dispatch/data-plane logic: pull request queueing, next-message request parsing, pending accounting, heartbeats/flow-control, delivery tracking, redelivery queue semantics, ack reply parsing, stream purge/stop paths, and monitor/signal flow.
If this batch is advanced with placeholders, the runtime behavior for pull consumers, redelivery correctness, and no-interest cleanup will look green in PortTracker while remaining behaviorally incomplete.
Context Findings
Required command outputs
/usr/local/share/dotnet/dotnet run --project tools/NatsNet.PortTracker -- batch show 39 --db porting.db- Status:
pending - Features:
93(all currentlydeferred) - Tests:
53(all currentlydeferred) - Depends on:
38 - Go file:
server/consumer.go
- Status:
/usr/local/share/dotnet/dotnet run --project tools/NatsNet.PortTracker -- batch list --db porting.db- Confirms dependency chain
38 -> 39
- Confirms dependency chain
/usr/local/share/dotnet/dotnet run --project tools/NatsNet.PortTracker -- report summary --db porting.db- Overall progress snapshot:
1924/6942 (27.7%)
- Overall progress snapshot:
Environment note: dotnet is not on PATH in this shell; use /usr/local/share/dotnet/dotnet.
Batch ownership split
Features by class:
NatsConsumer: 91NextMsgReq: 1NatsStream: 1
Tests by class:
JetStreamEngineTests: 34NatsConsumerTests: 14ConcurrencyTests1: 2JetStreamClusterTests1: 1JwtProcessorTests: 1RouteHandlerTests: 1
Current .NET baseline findings
dotnet/src/ZB.MOM.NatsNet.Server/JetStream/NatsConsumer.csis still a compact lifecycle shell and does not expose most Batch 39 mapped methods.WaitQueueandWaitingRequestexist inStreamTypes.cs, but only part of the Go dispatch behavior is represented.ImplBacklogfiles for Batch 39-related tests are mostly template placeholders and need full behavioral ports.
Approach Options
Approach A: Keep all dispatch work in NatsConsumer.cs
- Pros: fewer files and simpler discovery.
- Cons: 90+ methods in one file, poor reviewability, high merge risk, and weaker checkpoint isolation.
Approach B (Recommended): Dispatch-focused partial decomposition for NatsConsumer
- Pros: aligns with Go dispatch domains, improves review boundaries, supports group-by-group verification loops.
- Cons: more files and up-front organization overhead.
Approach C: Port all 53 tests first, then implement features
- Pros: strict red/green pressure.
- Cons: too many missing APIs initially, broad low-signal red phase, high churn in test scaffolding.
Decision: Approach B.
Proposed Design
1. Code Organization
Keep NatsConsumer as the central type but split dispatch concerns into partial files:
- Modify:
dotnet/src/ZB.MOM.NatsNet.Server/JetStream/NatsConsumer.cs(core state, shared lock helpers, partial type anchor) - Modify/Create:
dotnet/src/ZB.MOM.NatsNet.Server/JetStream/NatsConsumer.Dispatch.Waiting.cs - Modify/Create:
dotnet/src/ZB.MOM.NatsNet.Server/JetStream/NatsConsumer.Dispatch.Pull.cs - Modify/Create:
dotnet/src/ZB.MOM.NatsNet.Server/JetStream/NatsConsumer.Dispatch.Acks.cs - Modify/Create:
dotnet/src/ZB.MOM.NatsNet.Server/JetStream/NatsConsumer.Dispatch.Delivery.cs - Modify/Create:
dotnet/src/ZB.MOM.NatsNet.Server/JetStream/NatsConsumer.Dispatch.Redelivery.cs - Modify/Create:
dotnet/src/ZB.MOM.NatsNet.Server/JetStream/NatsConsumer.Dispatch.ReplyParsing.cs - Modify/Create:
dotnet/src/ZB.MOM.NatsNet.Server/JetStream/NatsConsumer.Dispatch.Shutdown.cs - Modify/Create:
dotnet/src/ZB.MOM.NatsNet.Server/JetStream/NatsStream.Consumers.cs(DeleteConsumermapping) - Modify:
dotnet/src/ZB.MOM.NatsNet.Server/JetStream/StreamTypes.cs(WaitQueue,WaitingRequest,PriorityGrouphelpers)
2. Functional Decomposition
- Waiting queue and request ingress: pending request map, pin assignment/ttl, request parsing (
ProcessNextMsgReq,ProcessResetReq,ProcessNextMsgRequest). - Dispatch loop and pending accounting:
GetNextMsg,ProcessWaiting,CheckAckFloor,LoopAndGatherMsgs, pending counters. - Delivery and flow control: heartbeat emission, flow-control reply generation, message delivery envelope conversion.
- Redelivery and ack reply parsing: pending tracking, redelivery queue operations, ack subject parsing (
ReplyInfo,AckReplyInfo, seq extraction). - Lifecycle and stream-interest cleanup: durable/push/pull helpers, purge/stop/cleanup, stream signals, monitor guard methods.
3. Test Design
Replace template tests with behavioral tests tied to mapped IDs:
- Modify:
dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/NatsConsumerTests.Impltests.cs(14) - Modify:
dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamEngineTests.Impltests.cs(34) - Modify:
dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/ConcurrencyTests1.Impltests.cs(2) - Modify:
dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JwtProcessorTests.Impltests.cs(1) - Modify:
dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/RouteHandlerTests.Impltests.cs(1) - Create:
dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamClusterTests1.Impltests.cs(1)
Also add/expand focused non-backlog unit tests where internal behaviors can be tested deterministically:
- Modify/Create:
dotnet/tests/ZB.MOM.NatsNet.Server.Tests/JetStream/NatsConsumerDispatchTests.cs - Modify:
dotnet/tests/ZB.MOM.NatsNet.Server.Tests/JetStream/NatsConsumerTests.cs
4. Verification Model (Design-level)
Batch 39 execution must be evidence-driven:
- Per-feature implementation loop with targeted tests.
- Per-test single-test and class-level verification.
- Stub scan before any status promotion.
- Build and test gates between groups.
- Status updates in max 15-ID chunks.
- Deferred-with-reason instead of stubbing when blocked.
Feature Groups (max ~20 each)
- Group A (18): waiting queue + pull request ingress
696,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715 - Group B (18): dispatch selection + ack floor + inbound loops
716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733 - Group C (19): delivery payload + flow control + redelivery foundation
734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752 - Group D (19): reply parsing + sequence selection + consumer identity helpers
753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,772 - Group E (19): stop/purge/no-interest/monitor signaling path
774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792
Test Waves
- Wave T1 (14):
1230,1232,1251,1261,1265,1267,1273,1277,1283,1284,1285,1286,1339,1370 - Wave T2 (17):
1469,1484,1485,1486,1487,1488,1489,1490,1492,1493,1495,1496,1498,1499,1500,1501,1502 - Wave T3 (17):
1508,1514,1515,1516,1517,1518,1519,1520,1521,1522,1526,1530,1531,1545,1547,1567,1665 - Wave T4 (5):
814,1840,2389,2407,2858
Risks and Mitigations
- Risk: dispatch loops can mask bugs via timing-sensitive behavior.
Mitigation: isolate pure logic from timers/network side-effects; unit-test selectors and parsers first. - Risk: placeholder tests could slip through due green-but-empty assertions.
Mitigation: mandatory stub scan and assertion-quality checks before status updates. - Risk: over-bulk status updates can misclassify unverified IDs.
Mitigation: enforce max 15 IDs per update and per-task checkpoints.
Non-Goals
- Executing Batch 39 implementation in this session.
- Re-scoping IDs outside Batch 39.
- Marking any feature/test as verified during planning.