Files
natsnet/docs/plans/2026-02-27-batch-19-accounts-core-design.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

124 lines
5.3 KiB
Markdown

# Batch 19 Accounts Core Design
## Context
- Batch: `19` (`Accounts Core`)
- Scope: `92` features, `9` tests
- Dependencies: Batches `16`, `18`
- Primary Go reference: `golang/nats-server/server/accounts.go`
- Primary .NET target: `dotnet/src/ZB.MOM.NatsNet.Server/Accounts/Account.cs`
Batch 19 is the largest non-JetStream account behavior surface: service import/export wiring, reverse reply tracking, activation and issuer checks, leaf-node cluster bookkeeping, and account-level message tracing hooks.
## Constraints
- No stubs for feature or test completion.
- Port behavior from Go intent, not line-for-line syntax.
- Keep batch execution chunked (max ~20 features per task group).
- Keep PortTracker status updates evidence-based and chunked (max 15 IDs per update call).
- Dependencies `16` and `18` must be complete before execution starts.
## Approaches Considered
### Approach A (Recommended): Incremental Port in Existing `Account.cs` + Backlog Test Hardening
- Keep `Account` in its current file and add missing methods in ordered regions.
- Use feature groups aligned to Go line ranges and behavior domains.
- Promote features `stub -> complete` during implementation; only promote to `verified` after related tests are green.
- Port only Batch 19 test IDs in existing backlog classes first, then run broader account-related suite gates.
Pros:
- Lowest structural risk and least file churn.
- Preserves current locking/state conventions already used in `Account.cs`.
- Easier diff review against Go line ranges and PortTracker IDs.
Cons:
- `Account.cs` grows further until later refactor batch.
### Approach B: Convert `Account` to Partial Class and Split by Domain During Port
- First convert `Account` to `partial`, then create files like `Account.ServiceImports.cs`, `Account.StreamImports.cs`, etc.
- Port methods into these new files while adding tests.
Pros:
- Cleaner file organization.
- Better long-term readability.
Cons:
- Larger structural change while behavior is still moving.
- Higher merge risk and harder one-to-one audit against existing method maps.
### Approach C: Minimal Compile-First Skeletons, Fill Later
- Add signatures and placeholders quickly to satisfy compile, then fill behavior in later passes.
Pros:
- Fast initial progress indicators.
Cons:
- Violates anti-stub requirements.
- High risk of false progress and broken verification integrity.
Decision: **Approach A**.
## Proposed Architecture
### 1. Keep Account Behavior Localized to `Account.cs`
- Implement missing Batch 19 methods directly in `Account.cs`.
- Only modify `AccountTypes.cs` when a missing helper type/field is required by real behavior.
- Avoid cross-module refactors while porting this batch.
### 2. Feature Grouping Strategy
Use five implementation groups with contiguous, behavior-aligned IDs:
1. Group 1 (17 features): identity, trace destination, connection/interest, leaf cluster registration, base service export registration
2. Group 2 (20 features): latency tracking send paths + service import cycle checks + pending response counters
3. Group 3 (20 features): service import map mutation, reverse response tracking, internal subscription lifecycle, response wildcard processing
4. Group 4 (20 features): service reply generation, thresholds, response import wiring, stream import/export add and authorization checks
5. Group 5 (15 features): activation expiration paths, issuer trust checks, bearer/expiration handling, external auth helpers
Each group is independently buildable and testable.
### 3. Test Porting Strategy for the 9 Batch Tests
Port only these IDs in backlog classes:
- `81`, `82`, `95` -> `ImplBacklog/AccountTests.Impltests.cs`
- `658`, `666` -> `ImplBacklog/GatewayHandlerTests.Impltests.cs`
- `1935`, `1952`, `1955` -> `ImplBacklog/LeafNodeHandlerTests.Impltests.cs`
- `2359` -> `ImplBacklog/MessageTracerTests.Impltests.cs`
Replace placeholder tests with behavioral assertions derived from Go test intent.
### 4. Verification-First Status Flow
- During coding: move feature IDs to `stub`.
- After implementation + build + related tests: move to `complete`.
- After full related test gate and evidence capture: move to `verified`.
- If blocked: keep `deferred` with explicit reason (no placeholder code).
## Error Handling and Concurrency Design Notes
- Preserve lock discipline already used in `Account.cs` (`_mu`, `_lmu`, `_sqmu`, `_eventIdsMu`).
- Do not widen lock scopes unless required for correctness parity with Go behavior.
- Preserve existing exception-return pattern used by account APIs (`Exception?` return for validation paths).
- Preserve current JWT placeholder boundaries; if JWT-infra dependency is missing, defer with reason instead of stubbing.
## Risks and Mitigations
- Risk: long `Account.cs` diffs become hard to review.
- Mitigation: strict feature grouping + per-group checkpoints + frequent commits.
- Risk: false-positive "passing" backlog tests.
- Mitigation: anti-stub scans and required per-test behavioral assertions.
- Risk: status inflation without evidence.
- Mitigation: max-15 ID update chunks + required command output evidence per chunk.
## Success Criteria
- All 92 Batch 19 feature IDs are `verified` or explicitly `deferred` with reason.
- All 9 Batch 19 test IDs are `verified` or explicitly `deferred` with reason.
- No forbidden stub patterns in touched source/tests.
- Full build and required test gates pass at each checkpoint.