# Batch 17 (Client Core second half) Design **Date:** 2026-02-27 **Scope:** Design only for Batch 17 (`server/client.go` second-half mappings): 60 features and 9 tracked tests. ## Context Snapshot Batch metadata from PortTracker: - Batch ID: `17` - Name: `Client Core (second half)` - Dependency: batch `16` - Go file: `server/client.go` - Features: `60` (all currently `deferred`) - Tests: `9` (all currently `deferred`) Tracker status snapshot (`report summary`): - Features: `1271 verified`, `2377 deferred`, `24 n_a`, `1 stub` - Unit tests: `430 verified`, `2640 deferred`, `187 n_a` - Overall progress: `1924 / 6942 (27.7%)` ## Problem Statement Batch 17 is the heaviest `client.go` section: subscription/unsubscribe paths, delivery fanout, inbound message processing, header mutation helpers, service import plumbing, ping/stale timers, account-reload handling, reconnect/TLS handshakes, and rate-limited logging. The main execution risk is false progress through placeholder methods/tests because: 1. `ClientConnection.cs` still contains explicit second-half stubs/comments. 2. Batch 17 tests include JetStream/FileStore/MemStore/Server tests with many non-Batch-17 deferred dependencies. 3. Existing backlog tests include shallow placeholder patterns that can pass without validating behavior. ## Working Set Breakdown Feature groups (max ~20 each): - **Group A (20):** `477-496` Subscription shadowing, unsubscribe flow, message header composition, `deliverMsg`, permission pruning, publish allow checks, reply classifiers. - **Group B (20):** `497-515,520` Inbound message pipeline, reply/service import handling, header get/set/remove helpers, `processServiceImport`, route-target accumulation, `processMsgResults`, ping timer processing. - **Group C (20):** `521,522,534,535,537,540,541,542,543,544,545,546,547,548,553,565,566,567,568,569` Ping interval adjustments, stale watcher, reload/reconnect/account cache helpers, `ClientInfo.serviceAccount`, client info enrichment, TLS handshake trio, allowed connection type conversion, rate-limit logging, first ping timer. Tracked tests: - File store scheduling/delete-marker cluster: `528,545,552,553,568,598` - Memory store scheduling/delete-marker cluster: `2053,2057` - Server rate-limit logging: `2901` ## Approaches ### Approach A: Monolithic `ClientConnection.cs` port wave Implement all 60 features in the existing file, then patch tests. - Pros: fewer files and simpler search path. - Cons: high merge risk, hard reviewability, harder to isolate regressions. ### Approach B (Recommended): Three vertical feature groups with partial-class split and hard gates Split second-half methods into focused `ClientConnection` partial files and execute three 20-feature groups with explicit build/test/stub gates between groups. - Pros: reviewable increments, clearer ownership per concern, strong regression isolation. - Cons: slightly more up-front file organization. ### Approach C: Wrapper-heavy defer-first strategy Add shallow wrappers for signatures, defer behavior-heavy methods and most tests. - Pros: fastest status movement. - Cons: poor parity confidence, audit churn, high risk of anti-stub violations. ## Recommended Design ### 1. Architecture - Keep `ClientConnection` as the primary host, but split second-half methods into dedicated partial files: - `ClientConnection.SubscriptionsAndDelivery.cs` (Group A) - `ClientConnection.InboundAndHeaders.cs` (Group B) - `ClientConnection.LifecycleAndTls.cs` (Group C) - Keep `ClientInfo.serviceAccount` logic in `ClientTypes.cs` (or a focused companion file if needed). - Preserve existing first-half behavior in `ClientConnection.cs`; do not refactor unrelated code. ### 2. Data/Control Flow - Inbound path: `processInboundMsg` -> subject mapping/service-import path -> `processMsgResults`. - Delivery path: `deliverMsg` + header generation + permission/reply tracking. - Timer/lifecycle path: ping interval decisions, stale detection, reconnect, and handshake transitions. - Logging path: rate-limited wrappers funneling through existing server/client logging facilities. ### 3. Error Handling and Deferral - Port behavior from Go line ranges, including close reasons and permission-deny behavior. - If a feature/test requires missing infra (outside Batch 17 dependencies), keep it `deferred` with explicit reason and evidence. - Never use placeholder success paths to force status transitions. ### 4. Test Strategy - Add/expand focused client-core tests first (to make feature verification real). - Attempt the 9 tracked tests only after dependency precheck and feature readiness. - For blocked tests, keep `deferred` with concrete blocker notes rather than adding shallow assertions. ### 5. Verification Contract - Per-feature read/implement/build/test loop. - Group-level stub scan, build gate, and related test gate before status promotion. - Chunked status updates (`<=15` IDs/update) with captured evidence. ## Risks and Mitigations 1. **Large method complexity (`deliverMsg`, `processMsgResults`)** Mitigation: isolate in Group A/B, add targeted tests before and after each port. 2. **Cross-module test blockers (FileStore/MemStore/Server dependencies)** Mitigation: dependency precheck before each test; defer with explicit reason when blocked. 3. **Stub regression under schedule pressure** Mitigation: mandatory anti-stub scans and hard status gates. ## Success Criteria 1. All 60 Batch 17 features are either behavior-verified or explicitly deferred with reason. 2. All 9 Batch 17 tests are either genuinely verified or explicitly deferred with reason. 3. No forbidden stub patterns remain in touched feature/test files. 4. Status updates are evidence-backed, chunked, and auditable. ## Non-Goals 1. No implementation in this design document. 2. No unrelated refactors outside Batch 17 scope. 3. No synthetic "pass" tests or placeholder feature logic to satisfy tracker states.