34a8079d15
Row 82 (da23f2dc) fixed this leak shape in PartitionPurgeTests and NotifyDispatcherAuditTrailTests; three classes in the same assembly still had it. Each creates an actor with a fast periodic tick (100 ms purge override, ~0 s reconciliation override) against a shared MsSqlMigrationFixture database and never stops it deterministically, relying on TestKit's Dispose -> Shutdown — which is timeout-bounded and does NOT fail when it expires. A survivor keeps mutating the fixture DB while LATER test classes run. All three now use the same Watch(actor) / Sys.Stop(actor) / ExpectTerminated(actor) helperda23f2dcestablished, applied at EVERY actor-creation site — 11 in AuditLogPurgeActorTests, 10 in SiteAuditReconciliationActorTests, 2 in OutageReconciliationTests. The two real-DB cases are the ones that could corrupt another class: AuditLogPurgeActorTests' EndToEnd_RealPartition_… keeps switching partitions out of the shared DB, and SiteAuditReconciliationActorTests' Tick_Duplicates_NotDoubleInserted holds a live AuditLogRepository over a DbContext the test is about to dispose. The stub-repo cases are cheaper but not free: each burns a DI scope and a thread every 100 ms for the rest of the assembly run. OutageReconciliationTests needed more than the helper. It already called Sys.Stop, but (a) fire-and-forget, so the call returns before the in-flight tick has finished writing to MSSQL, and (b) from the LAST line of the enclosing `await using` block, so any earlier assertion failure skipped it entirely. Both stops move to immediately after the last step that needs the actor alive — before the read-back that counts rows — and the AuditLogIngestActor that BuildCentralPipeline creates is now stopped too (test 2 was discarding its ref outright, leaving it holding a service provider the block then disposed). Where a test's remaining assertions read a collection the actor appends to (client.Calls indexing, Assert.Empty on a switched-boundaries list), the stop is placed BEFORE them so they no longer read a moving target. AuditLog.Tests: 383/383 green (1 m 51 s), 0 skipped.