From ee0827d7d455fe11c6baa85743e4e898fc509b2e Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Fri, 27 Feb 2026 13:20:29 -0500 Subject: [PATCH] Reconcile batch 0 with 553 implementable tests and add design/plan docs Map 553 deferred tests whose feature dependencies are all verified into batch 0 (batch_tests table). Add Codex-generated design and implementation plan for batch 0 execution. --- ...2-27-batch-0-implementable-tests-design.md | 156 ++++++ ...-02-27-batch-0-implementable-tests-plan.md | 444 ++++++++++++++++++ porting.db | Bin 6320128 -> 6340608 bytes reports/current.md | 2 +- reports/report_c5e0416.md | 37 ++ 5 files changed, 638 insertions(+), 1 deletion(-) create mode 100644 docs/plans/2026-02-27-batch-0-implementable-tests-design.md create mode 100644 docs/plans/2026-02-27-batch-0-implementable-tests-plan.md create mode 100644 reports/report_c5e0416.md diff --git a/docs/plans/2026-02-27-batch-0-implementable-tests-design.md b/docs/plans/2026-02-27-batch-0-implementable-tests-design.md new file mode 100644 index 0000000..d329d17 --- /dev/null +++ b/docs/plans/2026-02-27-batch-0-implementable-tests-design.md @@ -0,0 +1,156 @@ +# Batch 0 Implementable Tests Design + +**Date:** 2026-02-27 +**Scope:** Plan how to port/implement Batch 0 unit tests only (no execution in this document). + +## Problem + +Batch 0 is defined as: deferred tests whose feature dependencies are already verified/complete/n_a. +However, current tracker output is inconsistent: + +- `batch show 0` reports `Tests: 0` +- `report summary` reports `2640 deferred` unit tests +- direct DB query shows **553 deferred tests** already satisfy Batch 0 dependency rules +- all 553 have `dotnet_class` + `dotnet_method` mappings and method names already present in test source + +This means Batch 0 implementation planning must treat the DB `batch_tests` mapping as stale and use a dependency query as the source of truth. + +## Context Findings + +### Command Findings + +- `batch show 0 --db porting.db`: Batch metadata exists but has no mapped tests. +- `batch list --db porting.db`: total mapped tests across batches = 2087. +- `report summary --db porting.db`: deferred tests = 2640. +- Gap: `2640 - 2087 = 553` deferred tests are currently unassigned to any batch. + +### Source-of-Truth Query (Batch 0 Candidates) + +```sql +WITH implementable AS ( + SELECT t.id + FROM unit_tests t + WHERE t.status = 'deferred' + AND EXISTS ( + SELECT 1 + FROM dependencies d + JOIN features f ON f.id = d.target_id AND d.target_type = 'feature' + WHERE d.source_type = 'unit_test' AND d.source_id = t.id + ) + AND NOT EXISTS ( + SELECT 1 + FROM dependencies d + JOIN features f ON f.id = d.target_id AND d.target_type = 'feature' + WHERE d.source_type = 'unit_test' + AND d.source_id = t.id + AND f.status NOT IN ('verified', 'complete', 'n_a') + ) +) +SELECT COUNT(*) FROM implementable; -- 553 +``` + +### Candidate Distribution (553 tests) + +All 553 are in module `server` and currently land in `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/*.Impltests.cs`. + +Largest classes: + +- `JetStreamEngineTests` (89) +- `MonitoringHandlerTests` (76) +- `MqttHandlerTests` (56) +- `LeafNodeHandlerTests` (47) +- `NatsConsumerTests` (35) +- `JwtProcessorTests` (28) +- `RouteHandlerTests` (25) + +## Approaches + +### Approach A: Use Existing `batch_tests` Mapping Only + +- Work only from `batch show 0`. +- Pros: Uses existing CLI flow exactly. +- Cons: Batch 0 is empty today, so this blocks all useful work and misses 553 valid candidates. + +### Approach B: Query-Driven Batch 0 (No DB Mapping Changes) + +- Treat the SQL dependency query as authoritative for execution order/status updates. +- Pros: No batch table mutation; can start immediately. +- Cons: `batch show 0` remains misleading; no built-in batch completion visibility. + +### Approach C (Recommended): Query-Driven Execution + Batch 0 Mapping Reconciliation + +- First, reconcile `batch_tests` for Batch 0 from dependency query. +- Then implement tests by class waves using a manifest generated from the same query. +- Pros: Correct batch visibility, supports `batch show 0`, preserves workflow consistency. +- Cons: One upfront tracker-maintenance step. + +## Recommended Design + +### 1. Batch 0 Candidate Manifest + +Create a reproducible manifest (CSV/SQL output) containing: + +- `test_id` +- `dotnet_class` +- `dotnet_method` +- `go_file` +- `go_method` + +The manifest is regenerated from DB each session to avoid stale lists. + +### 2. Batch Mapping Reconciliation + +Insert missing candidate tests into `batch_tests(batch_id=0)` only when absent. +Do not reassign already-mapped tests in other batches. + +### 3. Implementation Model + +Port tests class-by-class in `ImplBacklog` files first (lowest-risk), then optionally move mature tests to domain folders later. + +Per test workflow: + +1. Open Go test body at mapped `go_file + go_method`. +2. Classify test as: + - `implementable-unit` (no running server/cluster required) + - `runtime-blocked` (needs real server/cluster infra) -> keep `deferred`, add note +3. Replace placeholder/assertion-only body with behavior-faithful xUnit 3 + Shouldly test. +4. Run method and class filters. +5. Update tracker status only after green test evidence. + +### 4. Wave Sequencing + +Order by lowest infra risk first: + +1. Accounts/Auth/JWT/Options/reload +2. Routes/Gateways/Leaf/WebSocket +3. Events/Monitoring/MsgTrace/Server core +4. JetStream lightweight deterministic tests +5. JetStream heavy + MQTT + concurrency edge cases + +### 5. Verification Gates + +- Gate 1: Method-level run passes after each test port. +- Gate 2: Class-level run passes before status updates. +- Gate 3: Wave-level run passes before commit. +- Gate 4: End-of-batch query returns zero remaining implementable deferred tests. + +## Error Handling and Risk Controls + +- If Go test requires unavailable runtime infra, do not force a brittle port; keep `deferred` with explicit note. +- If ported test reveals feature regression, stop and create a feature-fix branch of work before marking test `verified`. +- Keep DB updates idempotent: only update statuses for IDs proven by passing runs. +- Avoid mass `test batch-update ... verified` without per-class pass evidence. + +## Success Criteria + +- Batch 0 mapping reflects true implementable set (or documented query-based equivalent). +- All implementable unit tests in the set are ported and passing. +- Runtime-blocked tests remain deferred with explicit reason notes. +- `report summary` and Batch 0 progress trend down deterministically after each wave. + +## Non-Goals + +- No server/cluster integration infrastructure build-out in this batch. +- No refactoring of production server code except where discovered test failures require follow-up work. +- No attempt to complete non-Batch-0 deferred tests. + diff --git a/docs/plans/2026-02-27-batch-0-implementable-tests-plan.md b/docs/plans/2026-02-27-batch-0-implementable-tests-plan.md new file mode 100644 index 0000000..f8b72e8 --- /dev/null +++ b/docs/plans/2026-02-27-batch-0-implementable-tests-plan.md @@ -0,0 +1,444 @@ +# Batch 0 Implementable Tests Implementation Plan + +> **For Codex:** REQUIRED SUB-SKILL: Use `executeplan` to implement this plan task-by-task. + +**Goal:** Port and verify all currently implementable Batch 0 deferred tests (553 candidates) whose feature dependencies are already verified, while keeping runtime-blocked tests deferred with explicit notes. + +**Architecture:** Use a query-driven manifest as the Batch 0 source of truth, then execute class-by-class test porting in `ImplBacklog` files with tight red/green verification loops. After each class wave, update only the proven test IDs in PortTracker (`verified` for passing ports, `deferred` with notes for runtime-blocked tests). Keep production code unchanged unless a test reveals a real feature regression. + +**Tech Stack:** .NET 10, xUnit 3, Shouldly, NSubstitute, SQLite (`porting.db`), PortTracker CLI + +**Design doc:** `docs/plans/2026-02-27-batch-0-implementable-tests-design.md` + +--- + +### Task 1: Generate Batch 0 Manifest and Reconcile Mapping + +**Files:** +- Modify: `porting.db` (`batch_tests`, `implementation_batches`) +- Create: `/tmp/batch0-implementable-tests.csv` + +**Step 1: Generate manifest** + +Run: + +```bash +sqlite3 -header -csv porting.db " +WITH implementable AS ( + SELECT t.id, t.dotnet_class, t.dotnet_method, t.go_file, t.go_method + FROM unit_tests t + WHERE t.status='deferred' + AND EXISTS ( + SELECT 1 FROM dependencies d + JOIN features f ON f.id=d.target_id AND d.target_type='feature' + WHERE d.source_type='unit_test' AND d.source_id=t.id + ) + AND NOT EXISTS ( + SELECT 1 FROM dependencies d + JOIN features f ON f.id=d.target_id AND d.target_type='feature' + WHERE d.source_type='unit_test' AND d.source_id=t.id + AND f.status NOT IN ('verified','complete','n_a') + ) +) +SELECT * FROM implementable ORDER BY dotnet_class, id; +" > /tmp/batch0-implementable-tests.csv +``` + +Expected: CSV created with ~553 rows. + +**Step 2: Reconcile Batch 0 mapping** + +Run: + +```bash +sqlite3 porting.db " +INSERT INTO batch_tests (batch_id, test_id) +SELECT 0, t.id +FROM unit_tests t +WHERE t.status='deferred' + AND EXISTS ( + SELECT 1 FROM dependencies d + JOIN features f ON f.id=d.target_id AND d.target_type='feature' + WHERE d.source_type='unit_test' AND d.source_id=t.id + ) + AND NOT EXISTS ( + SELECT 1 FROM dependencies d + JOIN features f ON f.id=d.target_id AND d.target_type='feature' + WHERE d.source_type='unit_test' AND d.source_id=t.id + AND f.status NOT IN ('verified','complete','n_a') + ) + AND NOT EXISTS (SELECT 1 FROM batch_tests bt WHERE bt.test_id=t.id); + +UPDATE implementation_batches +SET test_count=(SELECT COUNT(*) FROM batch_tests WHERE batch_id=0) +WHERE id=0; +" +``` + +Expected: `batch show 0` now reports Batch 0 tests > 0. + +**Step 3: Verify mapping** + +Run: + +```bash +/usr/local/share/dotnet/dotnet run --project tools/NatsNet.PortTracker -- batch show 0 --db porting.db +``` + +Expected: Batch 0 includes mapped tests. + +**Step 4: Commit** + +```bash +git add porting.db +git commit -m "chore(porttracker): reconcile batch 0 implementable test mappings" +``` + +--- + +### Task 2: Apply Porting Template to One Seed Test Per Class + +**Files:** +- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/*.Impltests.cs` (one method per class) +- Read: `golang/nats-server/server/*_test.go` + +**Step 1: Replace one placeholder method body with behavior-faithful assertions** + +Template: + +```csharp +[Fact] // T: +public void () +{ + // Arrange (from Go test setup) + var subject = /* translated setup */; + + // Act + var result = /* invocation under test */; + + // Assert (exact behavioral intent from Go) + result.ShouldBe(/* expected */); +} +``` + +**Step 2: Run method-level filter** + +Run: + +```bash +/usr/local/share/dotnet/dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ \ + --filter "FullyQualifiedName~ZB.MOM.NatsNet.Server.Tests.ImplBacklog.." +``` + +Expected: fail first if placeholder previously masked behavior; pass after fixing setup/assertions. + +**Step 3: Repeat for all 28 classes as seed tests** + +Expected: each class has at least one real, non-placeholder port. + +**Step 4: Commit** + +```bash +git add dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog +git commit -m "test(batch0): replace seed placeholders with behavior ports across classes" +``` + +--- + +### Task 3: Port Account/Auth/Options Cluster (Core Low-Infra) + +**Files:** +- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/AccountTests.Impltests.cs` +- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/AuthHandlerTests.Impltests.cs` +- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/AuthCalloutTests.Impltests.cs` +- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JwtProcessorTests.Impltests.cs` +- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/ServerOptionsTests.Impltests.cs` +- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/ConfigReloaderTests.Impltests.cs` +- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/CertificateStoreWindowsTests.Impltests.cs` + +**Step 1: Port methods for these classes from Go tests** + +Reference Go files: + +- `golang/nats-server/server/accounts_test.go` +- `golang/nats-server/server/auth_test.go` +- `golang/nats-server/server/auth_callout_test.go` +- `golang/nats-server/server/jwt_test.go` +- `golang/nats-server/server/opts_test.go` +- `golang/nats-server/server/reload_test.go` + +**Step 2: Tag runtime-blocked cases** + +If Go method requires live server/cluster/process orchestration, keep deferred and add explicit reason note later. + +**Step 3: Run per-class tests** + +Run one class at a time: + +```bash +/usr/local/share/dotnet/dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ \ + --filter "FullyQualifiedName~ZB.MOM.NatsNet.Server.Tests.ImplBacklog.AccountTests" +``` + +Expected: class green before status updates. + +**Step 4: Update statuses for proven IDs** + +Run: + +```bash +IDS=$(sqlite3 porting.db " +WITH implementable AS ( + SELECT t.id,t.dotnet_class + FROM unit_tests t + WHERE t.status='deferred' + AND EXISTS (SELECT 1 FROM dependencies d JOIN features f ON f.id=d.target_id AND d.target_type='feature' + WHERE d.source_type='unit_test' AND d.source_id=t.id) + AND NOT EXISTS (SELECT 1 FROM dependencies d JOIN features f ON f.id=d.target_id AND d.target_type='feature' + WHERE d.source_type='unit_test' AND d.source_id=t.id + AND f.status NOT IN ('verified','complete','n_a')) +) +SELECT group_concat(id, ',') FROM implementable +WHERE dotnet_class IN ('AccountTests','AuthHandlerTests','AuthCalloutTests','JwtProcessorTests','ServerOptionsTests','ConfigReloaderTests','CertificateStoreWindowsTests'); +") +/usr/local/share/dotnet/dotnet run --project tools/NatsNet.PortTracker -- \ + test batch-update --ids "$IDS" --set-status verified --db porting.db --execute +``` + +Expected: IDs verified only after passing evidence. + +**Step 5: Commit** + +```bash +git add dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog porting.db +git commit -m "test(batch0): port account/auth/options implementable tests" +``` + +--- + +### Task 4: Port Routing and Edge Transport Cluster + +**Files:** +- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/RouteHandlerTests.Impltests.cs` +- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/GatewayHandlerTests.Impltests.cs` +- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/LeafNodeHandlerTests.Impltests.cs` +- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/WebSocketHandlerTests.Impltests.cs` + +**Step 1: Port deterministic tests from Go route/gateway/leaf/websocket files** + +**Step 2: Keep runtime-only topology tests deferred with notes** + +**Step 3: Run class filters** + +```bash +/usr/local/share/dotnet/dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ \ + --filter "FullyQualifiedName~ZB.MOM.NatsNet.Server.Tests.ImplBacklog.RouteHandlerTests" +``` + +Expected: pass per class. + +**Step 4: Update statuses for passing IDs and commit** + +Use `test batch-update --ids "$IDS" --set-status verified --execute` for this class set, then commit. + +--- + +### Task 5: Port Server Introspection and Events Cluster + +**Files:** +- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/EventsHandlerTests.Impltests.cs` +- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/MonitoringHandlerTests.Impltests.cs` +- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/MessageTracerTests.Impltests.cs` +- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/NatsServerTests.Impltests.cs` + +**Step 1: Replace placeholder assertions with behavior-based assertions from Go tests** + +**Step 2: Validate log/JSON/monitor payload contracts with strict Shouldly checks** + +**Step 3: Run class filters and update statuses** + +Expected: each class green before DB status updates. + +**Step 4: Commit** + +```bash +git add dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog porting.db +git commit -m "test(batch0): port monitoring/events/server implementable tests" +``` + +--- + +### Task 6: Port Concurrency and Process-Control Cluster + +**Files:** +- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/ConcurrencyTests1.Impltests.cs` +- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/ConcurrencyTests2.Impltests.cs` + +**Step 1: Port race-safe deterministic cases only** + +Use timeout-safe async assertions and avoid nondeterministic sleep-based checks. + +**Step 2: Run each class repeatedly** + +Run: + +```bash +for i in 1 2 3; do + /usr/local/share/dotnet/dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ \ + --filter "FullyQualifiedName~ZB.MOM.NatsNet.Server.Tests.ImplBacklog.ConcurrencyTests1"; +done +``` + +Expected: stable pass across repeated runs. + +**Step 3: Update statuses + commit** + +Mark passing IDs verified; keep flaky/runtime-bound cases deferred with notes. + +--- + +### Task 7: Port JetStream Small/Deterministic Cluster + +**Files:** +- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamVersioningTests.Impltests.cs` +- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamBatchingTests.Impltests.cs` +- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamJwtTests.Impltests.cs` +- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamTpmTests.Impltests.cs` +- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamLeafNodeTests.Impltests.cs` +- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/StorageEngineTests.Impltests.cs` + +**Step 1: Port only no-cluster/no-live-server methods** + +**Step 2: For cluster-required tests, keep deferred and annotate notes** + +Example note: `deferred: requires running JetStream cluster/runtime`. + +**Step 3: Run class filters; update statuses; commit** + +Expected: deterministic classes pass; blocked cases stay deferred with reasons. + +--- + +### Task 8: Port JetStream Consumer/Engine Heavy Cluster + +**Files:** +- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/NatsConsumerTests.Impltests.cs` +- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamEngineTests.Impltests.cs` +- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamClusterTests2.Impltests.cs` + +**Step 1: Work test-by-test with strict triage** + +For each method: + +1. Port and run method-level filter. +2. If runtime-bound, revert method to deferred state marker and keep status deferred. +3. If unit-portable, finish port and keep in verified candidate list. + +**Step 2: Run full class filters** + +Expected: passing set is stable. + +**Step 3: Update statuses and commit** + +Use class-specific ID lists from manifest to avoid accidental status drift. + +--- + +### Task 9: Port MQTT Cluster + +**Files:** +- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/MqttHandlerTests.Impltests.cs` +- Modify: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/MqttExternalTests.Impltests.cs` + +**Step 1: Port unit-level parser/options/utility tests** + +**Step 2: Defer broker-runtime tests with explicit notes** + +**Step 3: Run class filters; update statuses; commit** + +Expected: no silent skips; each deferred item has rationale. + +--- + +### Task 10: Final Batch 0 Verification and Status Closure + +**Files:** +- Modify: `porting.db` +- Optional update: `reports/current.md` (via report generation script) + +**Step 1: Run targeted regression sweep for all touched Batch 0 classes** + +Run: + +```bash +/usr/local/share/dotnet/dotnet test dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ +``` + +Expected: all touched classes pass. + +**Step 2: Validate remaining implementable deferred count** + +Run: + +```bash +sqlite3 porting.db " +WITH implementable AS ( + SELECT t.id + FROM unit_tests t + WHERE t.status='deferred' + AND EXISTS ( + SELECT 1 FROM dependencies d + JOIN features f ON f.id=d.target_id AND d.target_type='feature' + WHERE d.source_type='unit_test' AND d.source_id=t.id + ) + AND NOT EXISTS ( + SELECT 1 FROM dependencies d + JOIN features f ON f.id=d.target_id AND d.target_type='feature' + WHERE d.source_type='unit_test' AND d.source_id=t.id + AND f.status NOT IN ('verified','complete','n_a') + ) +) +SELECT COUNT(*) FROM implementable; +" +``` + +Expected: `0` (or only explicitly documented runtime-blocked exceptions). + +**Step 3: Verify Batch 0 visibility** + +Run: + +```bash +/usr/local/share/dotnet/dotnet run --project tools/NatsNet.PortTracker -- batch show 0 --db porting.db +/usr/local/share/dotnet/dotnet run --project tools/NatsNet.PortTracker -- report summary --db porting.db +``` + +Expected: Batch 0 test count reduced/closed and summary reflects updates. + +**Step 4: Final commit** + +```bash +git add dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog porting.db reports/current.md +git commit -m "test(batch0): port implementable deferred tests and close batch 0" +``` + +--- + +## Batch 0 Working Set (Current) + +- Total implementable candidates: **553** +- Primary files: `dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/*.Impltests.cs` +- Highest-volume classes: + - `JetStreamEngineTests` (89) + - `MonitoringHandlerTests` (76) + - `MqttHandlerTests` (56) + - `LeafNodeHandlerTests` (47) + - `NatsConsumerTests` (35) + +## TDD Guardrails + +- Never bulk-mark IDs `verified` before class-level green runs. +- Preserve `T:` comments to keep DB traceability. +- If production behavior mismatches Go spec, stop and open feature-fix work rather than weakening assertions. +- Keep tests deterministic: avoid timing races and process-global side effects where possible. + diff --git a/porting.db b/porting.db index c5e2d1cdf57be332eb250af8d1efec68f782ec97..cecddda5845b8c531bdddae35054971433dcab5a 100644 GIT binary patch delta 20583 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 F{U1Ax-ZKCI delta 3965 zcmZ{md7MpGw#V-|dph^-bIz{8T!l*^$~;Dup%h|PF;>u}?pZ#RM6@8{rSXzm!tO+e zHro|Kh`AL?giDY@B1CD*kfco=jRZ-QB!&#Gr;tpakFo{9&RXUSkf2G>B_Ih{0+B!^FbRePzl4AUF2R&wNw6gd2?-Js zB_v5mmQYDTWeHUzRFzOoLUjo>B&0}4l~7YcEeW+H1SQmwP**~lgnAO{OK2eBDG3cF zq)TWdp|OM}5}HbACZV~677|)YXeFVwgfId^Kn8V z5uZjKPzK0>4?naQ5A2id*sEW3@}$PU_7Y}3}Q2lz1Fi?`zqcm-aBXX7xQ zg2&;Jcqq=n-Ebyuj_czToQN6v4c$RE(bwn;RE7?s2-u=U-tH}DRHOrc2 zO|-^XBdkGIFDuJxV>PmZRu#*%bn}5(VO}%Oo8{(b=05WSbECP^Tx|ZuEHwWMRV5Qh z0m&n)*>KjMbzsTncyqLwXAUxZo7rYNvzb{x+e|f+&48)#2mChwmS5s$c^N;%_wW+F zfv@CC_#8fyPvevL3*6z)@f`jP@4#E}bROhYxy^|(7C>vR`yco#{MY>F{pD)qKxae~ z{gnPtzl|)^m_1@YvzzQP`-+`lhuJ>1gKc8(u_f$nHiNy&#}4Xd95^1gZ>aH&UHp<1pANCEy~PwCJV|nw%!}S z0>81fs&%oG)*bTz+Zvn23ESim=9q1algUav3h=6ISG+BWeHf?OY>&^U^@(U#^d6dW zrUJ>uW_uRP+JM=R{TLf)Hek0sqGo+o5pN5!?>!2bwb^$bF+Ply#oG9@>`0uNu|q0t zt@DcdbdA$S&0FKNRsGgD8LH75CtX=5+Pg2 z8uAXAMDJL>WgoqE+_*vM>S9)GW6f|`}!^Yntnmt z5?6(qaoVY@7IzJ$s!-4w(-mJZ`?%@wwAsY0YgRLD6XX5-SN@}$4Hx-oepH;qNBBWE zBeuI4v4St+vw4_L;p2G$&*!v0qpPyT;D5a(0xJvYl)*Tg?=k%Vx5vt{N7wJT{Q^WSv-Rmd~E#XImOJo-Jn6wk%8@O1n#9*Z5E zi~Hg(xE*ea({ObxFmZM29=e6Dp$q6V`Wzi_m1-+mhnBmt`zCq~O-5tgs^DE<6<(R` z^r&i}f)#mGDR7cWRkG3P)h9kiun&AbFA{_{Wk4Jz_KibMtC%m_|1n)1^TktH#3S2Z zLKnF~KO`FT17bnnH<9PEV_tU>AIOe+REg)X&pb-tjoCqus_=AH>XFSGu#e+yX>7ko zRe4>uPqp0Sv{LQXITw{$>#S3A--C3_wvriT zI*)`_?0YkQAgf}sR4Gu-{=5quEf{uB;1ztwCmxA=;$?$ok1Qc?lNsbyGM30v!}mDW;gu3L_$TQ6H>!)aB|kELHGVR#8<&hT z#^*+%@qS)@)Iy!LD;}lLa{P0g zj^kK)tA#SPi}7*owM%Nu>yW0toCd*q?X>f;vBpFaQ-E41L%R^4pN*HgOQ`i>sIS_F z;g6(dU?mGh_N{;;ny49gnYHo;)(nJLEmib7yjz#-#f@T<$wOQacVpoxaWb)6IKz+@ zNu3Upb&*OV_^Q{HNfYpTy9AY^qi(I(jY`l)vCH0^epF>`Z?vTAr z#;S((AXnW=gQwKRhA>=pN{4DGK>B+9A=1aQ`J}gJ|3G@Fjp@)dr9bKFH9SkYcs7S* zd$u3xtP1Ztl~a0>j$T6#(!sOcNPEv_lgvoTeP<4i3~3C7n)>g0P%U!yvC}k-@eHli z|92wg2cAA2|ALa*4vEMikgTbOLtu#dVK8)2`v*e{wPG*?l^hJ!)OhzVZ982YT`pSN zJiCo9^z2r;z_VNE{K(N^&=IM}L!sO-9#h-BkpHEFIC8cLG*8C93r0?aC4?ecbPMxn vB&QdA$fCEGLyCM6S6_>?=*{U~|9xGx*Z?H5ZWH8DF9-t5S>E~)Q0adFl6O62 diff --git a/reports/current.md b/reports/current.md index df8ed34..327f026 100644 --- a/reports/current.md +++ b/reports/current.md @@ -1,6 +1,6 @@ # NATS .NET Porting Status Report -Generated: 2026-02-27 18:02:44 UTC +Generated: 2026-02-27 18:20:30 UTC ## Modules (12 total) diff --git a/reports/report_c5e0416.md b/reports/report_c5e0416.md new file mode 100644 index 0000000..327f026 --- /dev/null +++ b/reports/report_c5e0416.md @@ -0,0 +1,37 @@ +# NATS .NET Porting Status Report + +Generated: 2026-02-27 18:20:30 UTC + +## Modules (12 total) + +| Status | Count | +|--------|-------| +| verified | 12 | + +## Features (3673 total) + +| Status | Count | +|--------|-------| +| deferred | 2377 | +| n_a | 24 | +| stub | 1 | +| verified | 1271 | + +## Unit Tests (3257 total) + +| Status | Count | +|--------|-------| +| deferred | 2640 | +| n_a | 187 | +| verified | 430 | + +## Library Mappings (36 total) + +| Status | Count | +|--------|-------| +| mapped | 36 | + + +## Overall Progress + +**1924/6942 items complete (27.7%)**