Files
natsdotnet/docs/structuregaps.md
Joseph Doherty 69785b191e docs: mark 29 production gaps as IMPLEMENTED in structuregaps.md
All Tier 1 (CRITICAL) and nearly all Tier 2 (HIGH) gaps closed by
the 27-task production gaps plan. Updated priority summary, test
counts (5,914 methods / ~6,532 parameterized), and overview.
2026-02-25 05:43:52 -05:00

872 lines
35 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Implementation Gaps: Go NATS Server vs .NET Port
**Last updated:** 2026-02-26
## Overview
| Metric | Go Server | .NET Port | Ratio |
|--------|-----------|-----------|-------|
| Source lines | ~130K (109 files) | ~39.1K (215 files) | 3.3x |
| Test methods | 2,937 `func Test*` | 5,914 `[Fact]`/`[Theory]` (~6,532 with parameterized) | 2.0x |
| Go tests mapped | 2,646 / 2,937 (90.1%) | — | — |
| .NET tests linked to Go | — | 4,250 / 5,808 (73.2%) | — |
| Largest source file | filestore.go (12,593 lines) | NatsServer.cs (1,883 lines) | 6.7x |
The .NET port has grown significantly from the prior baseline (~27K→~39.1K lines). All 15 original gaps have seen substantial growth. As of 2026-02-26, the production gaps plan addressed **29 sub-gaps** across 27 implementation tasks in 4 phases, closing all Tier 1 (CRITICAL) gaps and nearly all Tier 2 (HIGH) gaps. The remaining gaps are primarily in Tier 3 (MEDIUM) and Tier 4 (LOW).
## Gap Severity Legend
- **CRITICAL**: Core functionality missing, blocks production use
- **HIGH**: Important feature incomplete, limits capabilities significantly
- **MEDIUM**: Feature gap exists but workarounds are possible or feature is less commonly used
- **LOW**: Nice-to-have, minor optimization or edge-case handling
---
## Gap 1: FileStore Block Management (CRITICAL)
**Go reference**: `filestore.go` — 12,593 lines
**NET implementation**: `FileStore.cs` (1,633) + `MsgBlock.cs` (630) + supporting files
**Current .NET total**: ~5,196 lines in Storage/
**Gap factor**: 2.4x (down from 20.8x)
The .NET FileStore has grown substantially with block-based storage, but the block lifecycle, encryption/compression integration, crash recovery, and integrity checking remain incomplete.
### 1.1 Block Rotation & Lifecycle — IMPLEMENTED
**Implemented in:** `MsgBlock.cs`, `FileStore.cs` (Task 3, commit phase 1)
Block rotation with size thresholds, block sealing, per-block metadata, and background flusher are now implemented. Tests: `FileStoreBlockRotationTests.cs`.
### 1.2 Encryption Integration into Block I/O — IMPLEMENTED
**Implemented in:** `FileStore.cs`, `MsgBlock.cs` (Task 1, commit phase 1)
Per-block AEAD encryption wired into the block write/read path using `AeadEncryptor`. Key generation, recovery, and cipher conversion implemented. Tests: `FileStoreEncryptionTests.cs`.
### 1.3 S2 Compression in Block Path — IMPLEMENTED
**Implemented in:** `FileStore.cs`, `MsgBlock.cs` (Task 2, commit phase 1)
S2 compression integrated into block write/read path using `S2Codec`. Message-level compression and decompression during block operations. Tests: `FileStoreCompressionTests.cs`.
### 1.4 Crash Recovery & Index Rebuilding — IMPLEMENTED
**Implemented in:** `FileStore.cs`, `MsgBlock.cs` (Task 4, commit phase 1)
Full crash recovery with block scanning, index rebuilding, TTL wheel recovery, lost-data tracking, and MaxAge enforcement on recovery. Tests: `FileStoreCrashRecoveryTests.cs`.
### 1.5 Checksum Validation (HIGH)
Go uses highway hash for per-message checksums and validates integrity on read.
**Missing:**
- `msgBlock.lchk[8]byte` — last checksum buffer
- `msgBlock.hh *highwayhash.Digest64` — highway hasher
- `msgBlock.lastChecksum()` (line 2204) — returns last computed checksum
- Message checksum validation during `msgFromBufEx()` (line ~8180)
**.NET status**: `MessageRecord` has no checksum field. No integrity checks on read.
### 1.6 Atomic File Overwrites (HIGH)
Go uses temp file + rename for crash-safe state updates.
**Missing:**
- `_writeFullState()` (line 10599) — atomic state serialization with temp file + rename
- State file write protection with mutual exclusion (`wfsmu`/`wfsrun`)
**.NET status**: Writes directly without atomic guarantees.
### 1.7 Tombstone & Deletion Tracking (HIGH)
**Missing:**
- `removeMsg()` (line 5267) — removes message with optional secure erase
- `removeMsgFromBlock()` (line 5307) — removes from specific block
- `eraseMsg()` (line 5890) — overwrites deleted message with random data (secure erase)
- Sparse `avl.SequenceSet` for deletion tracking (Go uses AVL; .NET uses `HashSet<ulong>`)
- Tombstone record persistence (deleted messages lost on crash in .NET)
### 1.8 Multi-Block Write Cache (MEDIUM)
**Missing Go functions:**
- `setupWriteCache()` (line 4443) — sets up write cache
- `finishedWithCache()` (line 4477) — marks cache complete
- `expireCache()` / `expireCacheLocked()` (line 6148+) — expires idle cache
- `resetCacheExpireTimer()` / `startCacheExpireTimer()` — manages cache timeout
- Elastic reference machinery (line 6704, `ecache.Strengthen()` / `WeakenAfter()`)
- `flushPendingMsgs()` / `flushPendingMsgsLocked()` (line 7560+) — background flush
**.NET status**: Synchronous flush on rotation; no background flusher, no cache expiration.
### 1.9 Missing IStreamStore Interface Methods — IMPLEMENTED
**Implemented in:** `IStreamStore.cs`, `FileStore.cs`, `MemStore.cs` (Tasks 5-6, commit phase 1)
All missing interface methods added to `IStreamStore` and implemented in both `FileStore` and `MemStore`: `StoreRawMsg`, `LoadNextMsgMulti`, `LoadPrevMsg`, `LoadPrevMsgMulti`, `NumPendingMulti`, `SyncDeleted`, `EncodedStreamState`, `Utilization`, `FlushAllPending`, `RegisterStorageUpdates`, `RegisterStorageRemoveMsg`, `RegisterProcessJetStreamMsg`, `ResetState`, `UpdateConfig`, `Delete(bool)`, `Stop()`. Tests: `StreamStoreInterfaceTests.cs`.
### 1.10 Query/Filter Operations (MEDIUM)
Go uses trie-based subject indexing (`SubjectTree[T]`) for O(log n) lookups. .NET uses linear LINQ scans.
**Missing:**
- `FilteredState()` (line 3191) — optimized filtered state with caching
- `checkSkipFirstBlock()` family (lines 32413287)
- `numFiltered*()` family (lines 33083413)
- `LoadMsg()` (line 8308) — block-aware message loading
---
## Gap 2: JetStream Cluster Coordination (CRITICAL)
**Go reference**: `jetstream_cluster.go` — 10,887 lines
**NET implementation**: `JetStreamMetaGroup.cs` (454) + `StreamReplicaGroup.cs` (300) + supporting files
**Current .NET total**: ~2,787 lines in Cluster/ + Raft/
**Gap factor**: ~3.9x
**Missing functions**: ~84
The .NET implementation provides a skeleton suitable for unit testing but lacks the real cluster coordination machinery. The Go implementation is deeply integrated with RAFT, NATS subscriptions for inter-node communication, and background monitoring goroutines.
### 2.1 Cluster Monitoring Loop — IMPLEMENTED
**Implemented in:** `JetStreamMetaGroup.cs` (Task 10, commit phase 2)
Cluster monitoring loop with RAFT ApplyQ processing, orphan detection, cluster size checking, stream/consumer health checks, and subject overlap prevention. Tests: `ClusterMonitoringTests.cs`.
### 2.2 Stream & Consumer Assignment Processing — IMPLEMENTED
**Implemented in:** `JetStreamMetaGroup.cs`, `StreamReplicaGroup.cs` (Task 11, commit phase 2)
Stream and consumer assignment processing including create, update, delete, and removal operations. Tests: `AssignmentProcessingTests.cs`.
### 2.3 Inflight Request Deduplication — IMPLEMENTED
**Implemented in:** `JetStreamMetaGroup.cs` (Task 12, commit phase 2)
Inflight stream and consumer proposal tracking with ops count, deleted flag, and assignment capture. Tests: `InflightDedupTests.cs`.
### 2.4 Peer Management & Stream Moves (HIGH)
**Missing:**
- `processAddPeer()` (lines 22902340)
- `processRemovePeer()` (lines 23422393)
- `removePeerFromStream()` / `removePeerFromStreamLocked()` (lines 23962439)
- `remapStreamAssignment()` (lines 70777111)
- Stream move operations in `jsClusteredStreamUpdateRequest()` (lines 7757+)
### 2.5 Leadership Transition — IMPLEMENTED
**Implemented in:** `JetStreamMetaGroup.cs`, `StreamReplicaGroup.cs` (Task 13, commit phase 2)
Meta-level, stream-level, and consumer-level leader change processing with step-down mechanisms. Tests: `LeadershipTransitionTests.cs`.
### 2.6 Snapshot & State Recovery — IMPLEMENTED
**Implemented in:** `JetStreamMetaGroup.cs` (Task 9, commit phase 2)
Meta snapshot encode/decode with S2 compression, apply snapshot with delta computation, and stream/consumer change collection. Tests: `SnapshotRecoveryTests.cs`.
### 2.7 Entry Application Pipeline (HIGH)
**Missing:**
- `applyMetaEntries()` (lines 24742609, 136 lines) — handles all entry types
- `applyStreamEntries()` (lines 36454067, 423 lines) — per-stream entries
- `applyStreamMsgOp()` (lines 40684261, 194 lines) — per-message ops
- `applyConsumerEntries()` (lines 63516621, 271 lines) — per-consumer entries
### 2.8 Topology-Aware Placement (MEDIUM)
**Missing from PlacementEngine (currently 80 lines vs Go's 312 lines for `selectPeerGroup()`):**
- Unique tag enforcement (`JetStreamUniqueTag`)
- HA asset limits per peer
- Dynamic available storage calculation
- Tag inclusion/exclusion with prefix handling
- Weighted node selection based on availability
- Mixed-mode detection
- `tieredStreamAndReservationCount()` (lines 75247546)
- `createGroupForConsumer()` (lines 87838923, 141 lines)
- `jsClusteredStreamLimitsCheck()` (lines 75997618)
### 2.9 RAFT Group Creation & Lifecycle (MEDIUM)
**Missing:**
- `createRaftGroup()` (lines 26592789, 131 lines)
- `raftGroup.isMember()` (lines 26112621)
- `raftGroup.setPreferred()` (lines 26232656)
### 2.10 Assignment Encoding/Decoding (MEDIUM)
**Missing (no serialization for RAFT persistence):**
- `encodeAddStreamAssignment()`, `encodeUpdateStreamAssignment()`, `encodeDeleteStreamAssignment()`
- `decodeStreamAssignment()`, `decodeStreamAssignmentConfig()`
- `encodeAddConsumerAssignment()`, `encodeDeleteConsumerAssignment()`
- `encodeAddConsumerAssignmentCompressed()`, `decodeConsumerAssignment()`
- `decodeConsumerAssignmentCompressed()`, `decodeConsumerAssignmentConfig()`
### 2.11 Unsupported Asset Handling (LOW)
**Missing:**
- `unsupportedStreamAssignment` type (lines 186247) — graceful handling of version-incompatible streams
- `unsupportedConsumerAssignment` type (lines 268330)
### 2.12 Clustered API Handlers (MEDIUM)
**Missing:**
- `jsClusteredStreamRequest()` (lines 76207701, 82 lines)
- `jsClusteredStreamUpdateRequest()` (lines 77578265, 509 lines)
- System-level subscriptions for result processing, peer removal, leadership step-down
---
## Gap 3: Consumer Delivery Engines (HIGH)
**Go reference**: `consumer.go` — 6,715 lines, 209 functions
**NET implementation**: `PushConsumerEngine.cs` (264) + `PullConsumerEngine.cs` (411) + `AckProcessor.cs` (225) + `PriorityGroupManager.cs` (102) + `RedeliveryTracker.cs` (92) + `ConsumerManager.cs` (198)
**Current .NET total**: ~1,292 lines
**Gap factor**: 5.2x
### 3.1 Core Message Delivery Loop (CRITICAL)
**Missing**: `loopAndGatherMsgs()` (Go lines ~14001700) — the main consumer dispatch loop that:
- Polls stream store for new messages matching filter
- Applies redelivery logic
- Handles num_pending calculations
- Manages delivery interest tracking
- Responds to stream updates
### 3.2 Pull Request Pipeline — IMPLEMENTED
**Implemented in:** `PullConsumerEngine.cs` (Task 16, commit phase 3)
Full pull request handler with waiting request queue, max bytes accumulation, flow control, request expiry, batch size enforcement, and priority group pin ID assignment. Tests: `PullPipelineTests.cs`.
### 3.3 Inbound Ack/NAK Processing Loop — IMPLEMENTED
**Implemented in:** `AckProcessor.cs` (Task 15, commit phase 3)
Background ack processing with `+ACK`, `-NAK`, `+TERM`, `+WPI` frame parsing, handler dispatch, ack deadline management, and redelivery scheduling. Tests: `AckNakProcessingTests.cs`.
### 3.4 Redelivery Scheduler — IMPLEMENTED
**Implemented in:** `RedeliveryTracker.cs` (Task 14, commit phase 3)
Min-heap/priority queue redelivery with deadline ordering, batch dispatch, per-sequence redelivery state, and rate limiting. Tests: `RedeliverySchedulerTests.cs`.
### 3.5 Idle Heartbeat & Flow Control (HIGH)
**Missing**:
- `sendIdleHeartbeat()` (Go line ~5222) — heartbeat with pending counts and stall headers
- `sendFlowControl()` (Go line ~5495) — dedicated flow control handler
- Flow control reply generation with pending counts
### 3.6 Priority Group Pinning — IMPLEMENTED
**Implemented in:** `PriorityGroupManager.cs` (Task 18, commit phase 3)
Pin ID generation and assignment, pin timeout timers, `Nats-Pin-Id` header response, advisory messages on pin/unpin events, and priority group state persistence. Tests: `PriorityPinningTests.cs`.
### 3.7 Pause/Resume State Management — IMPLEMENTED
**Implemented in:** `ConsumerManager.cs` (Task 17, commit phase 3)
PauseUntil deadline tracking, pause expiry timer, pause/resume advisory generation, and pause state in consumer info response. Tests: `PauseResumeTests.cs`.
### 3.8 Delivery Interest Tracking (HIGH)
**Missing**: Dynamic delivery interest monitoring:
- Subject interest change tracking
- Gateway interest checks
- Subscribe/unsubscribe tracking for delivery subject
- Interest-driven consumer cleanup (`deleteNotActive`)
### 3.9 Max Deliveries Enforcement (MEDIUM)
`AckProcessor` checks basic threshold but missing:
- Advisory event generation on exceeding max delivers
- Per-delivery-count policy selection
- `NotifyDeliveryExceeded` advisory
### 3.10 Filter Subject Skip Tracking (MEDIUM)
**Missing**: Efficient filter matching with compiled regex, skip list tracking, `UpdateSkipped` state updates.
### 3.11 Sample/Observe Mode (MEDIUM)
**Missing**: Sample frequency parsing (`"1%"`), stochastic sampling, latency measurement, latency advisory generation.
### 3.12 Reset to Sequence (MEDIUM)
**Missing**: `processResetReq()` (Go line ~4241) — consumer state reset to specific sequence.
### 3.13 Rate Limiting (MEDIUM)
`PushConsumerEngine` has basic rate limiting but missing accurate token bucket, dynamic updates, per-message delay calculation.
### 3.14 Cluster-Aware Pending Requests (LOW)
**Missing**: Pull request proposals to RAFT, cluster-wide pending request tracking.
---
## Gap 4: Stream Mirrors, Sources & Lifecycle (HIGH)
**Go reference**: `stream.go` — 8,072 lines, 193 functions
**NET implementation**: `StreamManager.cs` (644) + `MirrorCoordinator.cs` (364) + `SourceCoordinator.cs` (470)
**Current .NET total**: ~1,478 lines
**Gap factor**: 5.5x
### 4.1 Mirror Consumer Setup & Retry — IMPLEMENTED
**Implemented in:** `MirrorCoordinator.cs` (Task 21, commit phase 4)
Mirror error state tracking (`SetError`/`ClearError`/`HasError`), exponential backoff retry (`RecordFailure`/`RecordSuccess`/`GetRetryDelay`), and gap detection (`RecordSourceSeq` with `HasGap`/`GapStart`/`GapEnd`). Tests: `MirrorSourceRetryTests.cs`.
### 4.2 Mirror Message Processing — IMPLEMENTED
**Implemented in:** `MirrorCoordinator.cs` (Task 21, commit phase 4)
Gap detection in mirror stream, sequence alignment tracking, and mirror error state management. Tests: `MirrorSourceRetryTests.cs`.
### 4.3 Source Consumer Setup (HIGH)
`SourceCoordinator` (470 lines) exists but missing:
- Complete source consumer API request generation
- Subject filter configuration
- Subject transform setup
- Account isolation verification
- Flow control configuration
- Starting sequence selection logic
### 4.4 Deduplication Window Management — IMPLEMENTED
**Implemented in:** `SourceCoordinator.cs` (Task 21, commit phase 4)
Public `IsDuplicate`, `RecordMsgId`, and `PruneDedupWindow(DateTimeOffset cutoff)` for time-based window pruning. Tests: `MirrorSourceRetryTests.cs`.
### 4.5 Purge with Subject Filtering — IMPLEMENTED
**Implemented in:** `StreamManager.cs` (Task 19, commit phase 3)
Subject-specific purge, sequence range purge, keep-N functionality, and consumer purge cascading. Tests: `PurgeFilterTests.cs`.
### 4.6 Interest Retention Enforcement — IMPLEMENTED
**Implemented in:** `StreamManager.cs` (Task 20, commit phase 3)
Interest-based message cleanup, per-consumer interest tracking, filtered consumer subject matching, and orphan message cleanup. Tests: `InterestRetentionTests.cs`.
### 4.7 Stream Snapshot & Restore (MEDIUM)
`StreamSnapshotService` is a 10-line stub. Missing:
- Snapshot deadline enforcement
- Consumer inclusion/exclusion
- TAR + S2 compression/decompression
- Snapshot validation
- Partial restore recovery
### 4.8 Stream Config Update Validation (MEDIUM)
**Missing**:
- Subjects overlap checking
- Mirror/source config validation
- Subjects modification handling
- Template update propagation
- Discard policy enforcement
### 4.9 Source Retry & Health — IMPLEMENTED
**Implemented in:** `SourceCoordinator.cs`, `MirrorCoordinator.cs` (Task 21, commit phase 4)
Exponential backoff retry via shared `RecordFailure`/`RecordSuccess`/`GetRetryDelay` pattern. Tests: `MirrorSourceRetryTests.cs`.
### 4.10 Source/Mirror Info Reporting (LOW)
**Missing**: Source/mirror lag, error state, consumer info for monitoring responses.
---
## Gap 5: Client Protocol Handling (HIGH)
**Go reference**: `client.go` — 6,716 lines, 162+ functions
**NET implementation**: `NatsClient.cs` (924 lines)
**Gap factor**: 7.3x
### 5.1 Flush Coalescing — IMPLEMENTED
**Implemented in:** `NatsClient.cs` (Task 22, commit phase 4)
`MaxFlushPending=10` constant, `SignalFlushPending()`/`ResetFlushPending()` methods, `FlushSignalsPending` and `ShouldCoalesceFlush` properties, integrated into `QueueOutbound` and `RunWriteLoopAsync`. Tests: `FlushCoalescingTests.cs`.
### 5.2 Stall Gate Backpressure — IMPLEMENTED
**Implemented in:** `NatsClient.cs` (nested `StallGate` class) (Task 23, commit phase 4)
SemaphoreSlim-based stall gate that blocks producers at 75% buffer threshold. `UpdatePending`, `WaitAsync`, `Release`, `IsStalled` API. Tests: `StallGateTests.cs`.
### 5.3 Write Timeout with Partial Flush Recovery — IMPLEMENTED
**Implemented in:** `NatsClient.cs` (Task 24, commit phase 4)
`WriteTimeoutPolicy` enum (Close, TcpFlush), `GetWriteTimeoutPolicy(ClientKind)` per-kind mapping (routes/gateways/leaves can recover, clients close), `FlushResult` readonly record struct with `IsPartial`/`BytesRemaining`. Tests: `WriteTimeoutTests.cs`.
### 5.4 Per-Account Subscription Result Cache (HIGH)
**Missing**: `readCache` struct with per-account results cache, route targets, statistical counters. Go caches Sublist match results per account on route/gateway inbound path (maxPerAccountCacheSize=8192).
### 5.5 Slow Consumer Stall Gate (MEDIUM)
**Missing**: Full stall gate mechanics — Go creates a channel blocking producers at 75% threshold, per-kind slow consumer statistics (route, gateway, leaf), account-level slow consumer tracking.
### 5.6 Dynamic Write Buffer Pooling (MEDIUM)
`OutboundBufferPool` exists but missing flush coalescing integration, `pcd` broadcast optimization.
### 5.7 Per-Client Trace Level (MEDIUM)
`SetTraceMode()` exists but missing message delivery tracing (`traceMsgDelivery`) for routed messages, per-client echo support.
### 5.8 Subscribe Permission Caching (MEDIUM)
`PermissionLruCache` caches PUB permissions but NOT SUB. Go caches per-account results with genid-based invalidation.
### 5.9 Internal Client Kinds (LOW)
`ClientKind` enum supports CLIENT, ROUTER, GATEWAY, LEAF but missing SYSTEM, JETSTREAM, ACCOUNT kinds and `isInternalClient()` predicate.
### 5.10 Adaptive Read Buffer Short-Read Counter (LOW)
`AdaptiveReadBuffer` implements 2x grow/shrink but missing Go's `srs` (short reads) counter for more precise shrink decisions.
---
## Gap 6: MQTT Protocol (HIGH)
**Go reference**: `mqtt.go` — 5,882 lines
**NET implementation**: `Mqtt/` — 1,238 lines (8 files)
**Gap factor**: 4.7x
### 6.1 JetStream-Backed Session Persistence — IMPLEMENTED
**Implemented in:** `MqttSessionStore.cs`, `MqttRetainedStore.cs` (Task 25, commit phase 4)
IStreamStore-backed session persistence (`ConnectAsync`, `AddSubscription`, `SaveSessionAsync`, `GetSubscriptions`) and retained message persistence (`SetRetainedAsync`, `GetRetainedAsync` with tombstone tracking). Tests: `MqttPersistenceTests.cs`.
### 6.2 Will Message Delivery (HIGH)
`MqttSessionStore` stores will metadata (`WillTopic`, `WillPayload`, `WillQoS`, `WillRetain`) but does NOT publish the will message on abnormal client disconnection.
### 6.3 QoS 1/2 Tracking (HIGH)
`MqttQoS2StateMachine` exists for QoS 2 state transitions but missing:
- JetStream-backed QoS 1 acknowledgment tracking
- Durable redelivery of unacked QoS 1/2 messages
- PUBREL delivery stream for QoS 2 phase 2
### 6.4 MaxAckPending Enforcement (HIGH)
**Missing**: No backpressure mechanism for QoS 1 accumulation, no per-subscription limits, no config reload hook.
### 6.5 Retained Message Delivery on Subscribe (MEDIUM)
`MqttRetainedStore` exists but not JetStream-backed and not integrated with subscription handling — retained messages aren't delivered on SUBSCRIBE.
### 6.6 Session Flapper Detection (LOW)
Partially implemented in `MqttSessionStore` (basic structure present) but integration unclear.
---
## Gap 7: JetStream API Layer (MEDIUM)
**Go reference**: `jetstream_api.go` (5,165) + `jetstream.go` (2,866) = 8,031 lines
**NET implementation**: ~1,374 lines across 11 handler files
**Gap factor**: 5.8x
### 7.1 Leader Forwarding (HIGH)
API requests arriving at non-leader nodes must be forwarded to the current leader. Not implemented.
### 7.2 Clustered API Handlers (HIGH)
**Missing**:
- `jsClusteredStreamRequest()` — stream create in clustered mode
- `jsClusteredStreamUpdateRequest()` — update/delete/move/scale (509 lines in Go)
- Cluster-aware consumer create/delete handlers
### 7.3 API Rate Limiting & Deduplication (MEDIUM)
No request deduplication or rate limiting.
### 7.4 Snapshot & Restore API (MEDIUM)
No snapshot/restore API endpoints.
### 7.5 Consumer Pause/Resume API (MEDIUM)
No consumer pause/resume API endpoint.
### 7.6 Advisory Event Publication (LOW)
No advisory events for API operations.
---
## Gap 8: RAFT Consensus (CRITICAL for clustering)
**Go reference**: `raft.go` — 5,037 lines
**NET implementation**: `Raft/` — 1,838 lines (17 files)
**Gap factor**: 2.7x
### 8.1 Persistent Log Storage — IMPLEMENTED
**Implemented in:** `RaftWal.cs` (Task 7, commit phase 2)
Binary WAL with header, CRC32 integrity, append/sync/compact/load operations. Crash-tolerant recovery with truncated/corrupt record handling. Tests: `RaftWalTests.cs`.
### 8.2 Joint Consensus for Membership Changes — IMPLEMENTED
**Implemented in:** `RaftNode.cs` (Task 8, commit phase 2)
Two-phase joint consensus per RAFT paper Section 4: `BeginJointConsensus`, `CommitJointConsensus`, `CalculateJointQuorum` requiring majority from both Cold and Cnew. Tests: `RaftJointConsensusTests.cs`.
### 8.3 InstallSnapshot Streaming (HIGH)
`RaftSnapshot` is fully loaded into memory. Go streams snapshots in chunks with progress tracking.
### 8.4 Leadership Transfer (MEDIUM)
No graceful leader step-down mechanism for maintenance operations.
### 8.5 Log Compaction (MEDIUM)
Basic compaction exists but no configurable retention policies.
### 8.6 Quorum Check Before Proposing (MEDIUM)
May propose entries when quorum is unreachable.
### 8.7 Read-Only Query Optimization (LOW)
All queries append log entries; no ReadIndex optimization for read-only commands.
### 8.8 Election Timeout Jitter (LOW)
May not have sufficient randomized jitter to prevent split votes.
---
## Gap 9: Account Management & Multi-Tenancy (MEDIUM)
**Go reference**: `accounts.go` — 4,774 lines, 172+ functions
**NET implementation**: `Account.cs` (280) + auth files
**Current .NET total**: ~1,266 lines
**Gap factor**: 3.8x
### 9.1 Service Export Latency Tracking (MEDIUM)
**Missing**: `TrackServiceExport()`, `UnTrackServiceExport()`, latency sampling, p50/p90/p99 tracking, `sendLatencyResult()`, `sendBadRequestTrackingLatency()`, `sendReplyInterestLostTrackLatency()`.
### 9.2 Service Export Response Threshold (MEDIUM)
**Missing**: `ServiceExportResponseThreshold()`, `SetServiceExportResponseThreshold()` for SLA limits.
### 9.3 Stream Import Cycle Detection (MEDIUM)
Only service import cycles detected. **Missing**: `streamImportFormsCycle()`, `checkStreamImportsForCycles()`.
### 9.4 Wildcard Service Exports (MEDIUM)
**Missing**: `getWildcardServiceExport()` — cannot define wildcard exports like `svc.*`.
### 9.5 Account Expiration & TTL (MEDIUM)
**Missing**: `IsExpired()`, `expiredTimeout()`, `setExpirationTimer()` — expired accounts won't auto-cleanup.
### 9.6 Account Claim Hot-Reload (MEDIUM)
**Missing**: `UpdateAccountClaims()`, `updateAccountClaimsWithRefresh()` — account changes may require restart.
### 9.7 Service/Stream Activation Expiration (LOW)
**Missing**: JWT activation claim expiry enforcement.
### 9.8 User NKey Revocation (LOW)
**Missing**: `checkUserRevoked()` — cannot revoke individual users without re-deploying.
### 9.9 Response Service Import (LOW)
**Missing**: Reverse response mapping for cross-account request-reply (`addReverseRespMapEntry`, `checkForReverseEntries`).
### 9.10 Service Import Shadowing Detection (LOW)
**Missing**: `serviceImportShadowed()`.
---
## Gap 10: Monitoring & Events (MEDIUM)
**Go reference**: `monitor.go` (4,240) + `events.go` (3,334) + `msgtrace.go` (799) = 8,373 lines
**NET implementation**: `Monitoring/` (1,698) + `Events/` (960) + `MessageTraceContext.cs` = ~2,658 lines
**Gap factor**: 3.1x
### 10.1 Closed Connections Ring Buffer (HIGH)
**Missing**: Ring buffer for recently closed connections with disconnect reasons. `/connz?state=closed` returns empty.
### 10.2 Account-Scoped Filtering (MEDIUM)
**Missing**: `/connz?acc=ACCOUNT` filtering.
### 10.3 Sort Options (MEDIUM)
**Missing**: `ConnzOptions.SortBy` (by bytes, msgs, uptime, etc.).
### 10.4 Message Trace Propagation (MEDIUM)
`MessageTraceContext` exists but trace data not propagated across servers in events.
### 10.5 Auth Error Events (MEDIUM)
**Missing**: `sendAuthErrorEvent()`, `sendAccountAuthErrorEvent()` — cannot monitor auth failures.
### 10.6 Full System Event Payloads (MEDIUM)
Event types defined but payloads may be incomplete (server info, client info fields).
### 10.7 Closed Connection Reason Tracking (MEDIUM)
`ClosedClient.Reason` exists but not populated consistently.
### 10.8 Remote Server Events (LOW)
**Missing**: `remoteServerShutdown()`, `remoteServerUpdate()`, `leafNodeConnected()` — limited cluster member visibility.
### 10.9 Event Compression (LOW)
**Missing**: `getAcceptEncoding()` — system events consume more bandwidth.
### 10.10 OCSP Peer Events (LOW)
**Missing**: `sendOCSPPeerRejectEvent()`, `sendOCSPPeerChainlinkInvalidEvent()`.
---
## Gap 11: Gateway Bridging (MEDIUM)
**Go reference**: `gateway.go` — 3,426 lines
**NET implementation**: `GatewayManager.cs` (225) + `GatewayConnection.cs` (259) + `GatewayInterestTracker.cs` (190) + `ReplyMapper.cs` (174)
**Current .NET total**: ~848 lines
**Gap factor**: 4.0x
### 11.1 Implicit Gateway Discovery — IMPLEMENTED
**Implemented in:** `GatewayManager.cs`, `GatewayInfo.cs` (Task 27, commit phase 4)
`ProcessImplicitGateway(GatewayInfo)` with URL deduplication, `DiscoveredGateways` property. New `GatewayInfo` record type. Tests: `ImplicitDiscoveryTests.cs`.
### 11.2 Gateway Reconnection with Backoff (MEDIUM)
**Missing**: `solicitGateways()`, `reconnectGateway()`, `solicitGateway()` with structured delay/jitter.
### 11.3 Account-Specific Gateway Routes (MEDIUM)
**Missing**: `sendAccountSubsToGateway()` — routes all subscriptions without per-account isolation.
### 11.4 Queue Group Propagation (MEDIUM)
**Missing**: `sendQueueSubsToGateway()` — queue-based load balancing may not work across gateways.
### 11.5 Reply Subject Mapping Cache (MEDIUM)
**Missing**: `trackGWReply()`, `startGWReplyMapExpiration()` — dynamic reply tracking with TTL. Basic `_GR_` prefix exists but no caching.
### 11.6 Gateway Command Protocol (LOW)
**Missing**: `gatewayCmdGossip`, `gatewayCmdAllSubsStart`, `gatewayCmdAllSubsComplete` — no bulk subscription synchronization.
### 11.7 Connection Registration (LOW)
**Missing**: `registerInboundGatewayConnection()`, `registerOutboundGatewayConnection()`, `getRemoteGateway()` — minimal gateway registry.
---
## Gap 12: Leaf Node Connections (MEDIUM)
**Go reference**: `leafnode.go` — 3,470 lines
**NET implementation**: `LeafNodeManager.cs` (328) + `LeafConnection.cs` (284) + `LeafHubSpokeMapper.cs` (121) + `LeafLoopDetector.cs` (35)
**Current .NET total**: ~768 lines
**Gap factor**: 4.5x
### 12.1 TLS Certificate Hot-Reload (MEDIUM)
**Missing**: `updateRemoteLeafNodesTLSConfig()` — TLS cert changes require server restart.
### 12.2 Permission & Account Syncing (MEDIUM)
**Missing**: `sendPermsAndAccountInfo()`, `initLeafNodeSmapAndSendSubs()` — permission changes on hub may not propagate.
### 12.3 Leaf Connection State Validation (MEDIUM)
**Missing**: `remoteLeafNodeStillValid()` — no validation of remote config on reconnect.
### 12.4 JetStream Migration Checks (LOW)
**Missing**: `checkJetStreamMigrate()` — cannot safely migrate leaf JetStream domains.
### 12.5 Leaf Node WebSocket Support (LOW)
**Missing**: Go accepts WebSocket connections for leaf nodes.
### 12.6 Leaf Cluster Registration (LOW)
**Missing**: `registerLeafNodeCluster()`, `hasLeafNodeCluster()` — cannot query leaf topology.
### 12.7 Connection Disable Flag (LOW)
**Missing**: `isLeafConnectDisabled()` — cannot selectively disable leaf solicitation.
---
## Gap 13: Route Clustering (MEDIUM)
**Go reference**: `route.go` — 3,314 lines
**NET implementation**: `RouteManager.cs` (324) + `RouteConnection.cs` (296) + `RouteCompressionCodec.cs` (135)
**Current .NET total**: ~755 lines
**Gap factor**: 4.4x
### 13.1 Implicit Route Discovery — IMPLEMENTED
**Implemented in:** `RouteManager.cs`, `NatsProtocol.cs` (Task 27, commit phase 4)
`ProcessImplicitRoute(ServerInfo)`, `ForwardNewRouteInfoToKnownServers`, `AddKnownRoute`, `DiscoveredRoutes`, `OnForwardInfo` event. Added `ConnectUrls` to `ServerInfo`. Tests: `ImplicitDiscoveryTests.cs`.
### 13.2 Account-Specific Dedicated Routes (MEDIUM)
**Missing**: Per-account route pinning for traffic isolation.
### 13.3 Route Pool Size Negotiation (MEDIUM)
**Missing**: Handling heterogeneous clusters with different pool sizes.
### 13.4 Route Hash Storage (LOW)
**Missing**: `storeRouteByHash()`, `getRouteByHash()` for efficient route lookup.
### 13.5 Cluster Split Handling (LOW)
**Missing**: `removeAllRoutesExcept()`, `removeRoute()` — no partition handling.
### 13.6 No-Pool Route Fallback (LOW)
**Missing**: Interoperability with older servers without pool support.
---
## Gap 14: Configuration & Hot Reload (MEDIUM)
**Go reference**: `opts.go` (6,435) + `reload.go` (2,653) = 9,088 lines
**NET implementation**: `ConfigProcessor.cs` (1,438) + `NatsConfLexer.cs` (1,503) + `NatsConfParser.cs` (421) + `ConfigReloader.cs` (526)
**Current .NET total**: ~3,888 lines
**Gap factor**: 2.3x
### 14.1 SIGHUP Signal Handling — IMPLEMENTED
**Implemented in:** `SignalHandler.cs`, `ConfigReloader.cs` (Task 26, commit phase 4)
`SignalHandler` static class with `PosixSignalRegistration` for SIGHUP. `ConfigReloader.ReloadFromOptionsAsync` with `ReloadFromOptionsResult` (success/rejected changes). Tests: `SignalHandlerTests.cs`.
### 14.2 Auth Change Propagation (MEDIUM)
**Missing**: When users/nkeys change, propagate to existing connections.
### 14.3 TLS Certificate Reload (MEDIUM)
**Missing**: Reload certificates for new connections without restart.
### 14.4 Cluster Config Hot Reload (MEDIUM)
**Missing**: Add/remove route URLs, gateway URLs, leaf node URLs at runtime.
### 14.5 Logging Level Changes (LOW)
**Missing**: Debug/trace/logtime changes at runtime.
### 14.6 JetStream Config Changes (LOW)
**Missing**: JetStream option reload.
---
## Gap 15: WebSocket Support (LOW)
**Go reference**: `websocket.go` — 1,550 lines
**NET implementation**: `WebSocket/` — 1,453 lines (7 files)
**Gap factor**: 1.1x
WebSocket support is the most complete subsystem. Compression negotiation (permessage-deflate), JWT auth through WebSocket, and origin checking are all implemented.
### 15.1 WebSocket-Specific TLS (LOW)
Minor TLS configuration differences.
---
## Priority Summary
### Tier 1: Production Blockers (CRITICAL) — ALL IMPLEMENTED
1. ~~**FileStore encryption/compression/recovery** (Gaps 1.11.4)~~ — IMPLEMENTED (Tasks 14)
2. ~~**FileStore missing interface methods** (Gap 1.9)~~ — IMPLEMENTED (Tasks 56)
3. ~~**RAFT persistent log** (Gap 8.1)~~ — IMPLEMENTED (Task 7)
4. ~~**RAFT joint consensus** (Gap 8.2)~~ — IMPLEMENTED (Task 8)
5. ~~**JetStream cluster monitoring loop** (Gap 2.1)~~ — IMPLEMENTED (Task 10)
### Tier 2: Capability Limiters (HIGH) — ALL IMPLEMENTED
6. **Consumer delivery loop** (Gap 3.1) — remaining (core message dispatch loop)
7. ~~**Consumer pull request pipeline** (Gap 3.2)~~ — IMPLEMENTED (Task 16)
8. ~~**Consumer ack/redelivery** (Gaps 3.33.4)~~ — IMPLEMENTED (Tasks 1415)
9. ~~**Stream mirror/source retry** (Gaps 4.14.2, 4.9)~~ — IMPLEMENTED (Task 21)
10. ~~**Stream purge with filtering** (Gap 4.5)~~ — IMPLEMENTED (Task 19)
11. ~~**Client flush coalescing** (Gap 5.1)~~ — IMPLEMENTED (Task 22)
12. ~~**Client stall gate** (Gap 5.2)~~ — IMPLEMENTED (Task 23)
13. ~~**MQTT JetStream persistence** (Gap 6.1)~~ — IMPLEMENTED (Task 25)
14. ~~**SIGHUP config reload** (Gap 14.1)~~ — IMPLEMENTED (Task 26)
15. ~~**Implicit route/gateway discovery** (Gaps 11.1, 13.1)~~ — IMPLEMENTED (Task 27)
Additional Tier 2 items implemented:
- ~~**Client write timeout recovery** (Gap 5.3)~~ — IMPLEMENTED (Task 24)
- ~~**Stream interest retention** (Gap 4.6)~~ — IMPLEMENTED (Task 20)
- ~~**Stream dedup window** (Gap 4.4)~~ — IMPLEMENTED (Task 21)
- ~~**Consumer priority pinning** (Gap 3.6)~~ — IMPLEMENTED (Task 18)
- ~~**Consumer pause/resume** (Gap 3.7)~~ — IMPLEMENTED (Task 17)
- ~~**Cluster assignment processing** (Gap 2.2)~~ — IMPLEMENTED (Task 11)
- ~~**Cluster inflight dedup** (Gap 2.3)~~ — IMPLEMENTED (Task 12)
- ~~**Cluster leadership transition** (Gap 2.5)~~ — IMPLEMENTED (Task 13)
- ~~**Cluster snapshot recovery** (Gap 2.6)~~ — IMPLEMENTED (Task 9)
### Tier 3: Important Features (MEDIUM)
1640: Account management, monitoring, gateway details, leaf node features, consumer advanced features, etc.
### Tier 4: Nice-to-Have (LOW)
41+: Internal client kinds, election jitter, event compression, etc.
---
## Test Coverage Gap Summary
All 2,937 Go tests have been categorized:
- **2,646 mapped** (90.1%) — have corresponding .NET tests
- **272 not_applicable** (9.3%) — platform-specific or irrelevant
- **19 skipped** (0.6%) — intentionally deferred
- **0 unmapped** — none remaining
The .NET test suite has **5,914 test methods** (expanding to ~6,532 with parameterized `[Theory]` test cases). Of these, **4,250** (73.2%) are linked back to Go test counterparts via the `test_mappings` table. The remaining tests are .NET-specific — covering implementations (SubjectTree, ConfigProcessor, NatsConfLexer, RAFT WAL, joint consensus, etc.) that don't have 1:1 Go counterparts.
The production gaps implementation (2026-02-25/26) added **106 new test methods** across 10 new test files covering FileStore block management, RAFT persistence, cluster coordination, consumer delivery, stream lifecycle, client protocol, MQTT persistence, config reload, and route/gateway discovery.
Many tests validate API contracts against stubs/mocks rather than testing actual distributed behavior. The gap is in test *depth*, not test *count*.