97528c500f
I-1: Wrap the OnValueChangedAsync AppendAsync in try/catch so a durable-boundary failure (e.g. a PerEntry fsync hitting disk-full/I-O error) can no longer propagate out of the handler and trip Akka supervision into a restart loop. A canceled append during shutdown returns quietly; any other exception increments a new _outboxAppendFailures counter, logs a Warning (exception type name only), and drops the value without recording it or nudging the drain. The counter is surfaced on RecorderStatus (new OutboxAppendFailures field). I-2: Strengthen Writer_failure_keeps_entry_for_retry to prove the drain actually ran — assert the writer was invoked (the fake records even on Succeed=false) AND the outbox stayed at 1 (RemoveAsync not called), via AwaitAssertAsync. M-3: Capture Sender before the await in the GetStatus handler, then Tell the reply. M-4: Add Retry_after_writer_failure_eventually_acks proving the retry -> success -> ack path; FakeValueWriter gains a FailFirstN option + CallCount (Succeed behaviour unchanged). Short minBackoff keeps it fast and deterministic (AwaitAssert, no sleep). M-5: Deregister mux interest on PostStop via DependencyMuxActor.UnregisterInterest, mirroring VirtualTagActor.PostStop, closing the dead-letter window before Terminated. Claude-Session: https://claude.ai/code/session_012SDSQ3AcaXqPcBtDESBRii