0cc3b23101
EnqueueAsync used synchronous SQLite I/O (conn.Open / ExecuteNonQuery / COUNT(*)) on the caller's thread, blocking the alarm-emitting thread under write contention with the drain worker. The cancellationToken parameter was silently ignored. - EnqueueAsync converted to genuine async: OpenAsync / ExecuteNonQueryAsync / ExecuteScalarAsync used throughout; ct threaded to every await. - ApplyPragmasAsync added alongside the existing ApplyPragmas helper so the WAL + busy_timeout PRAGMAs are applied on the async open path too. - EnforceCapacityAsync added to handle capacity eviction on the async path. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>