9f83feff47
Batch B test-coverage gaps from the review: - testTransactionRollsBackOnTriggerAbort: a multi-insert transaction whose middle statement is rejected by `reject_deleted_events` rolls back ALL inserts in the transaction, not just the failing one. - testDeletionByThirdPartyDoesNothing: NIP-09 author check — another user's deletion event must not remove the original. - testKind5CanBeDeletedByAnotherKind5OfSameAuthor: pins the current behavior that kind-5 events are not specially protected; a same-author follow-up deletion can remove a previous one, and re-insertion of the removed deletion is then blocked. - testGiftWrapDeletionRequiresRecipient: NIP-59 GiftWraps key on the recipient (p-tag), not the (encrypted) inner author. Sender and unrelated third parties cannot delete; the recipient can. - testVanishForDifferentRelayIsNoOp: a kind-62 vanish naming a different relay must be stored but must not delete events on this relay nor block new inserts (RightToVanishModule.shouldVanishFrom contract). - testFtsCleanedUpAfterReplaceableRotation: FTS rows are cleaned via the AFTER DELETE trigger when an addressable is superseded — old content must no longer match search. - testVacuumAndAnalyseSmoke: VACUUM and ANALYZE run on a populated DB without throwing and preserve existing rows. - SqlSelectionBuilderTest: pins NotEquals(null) → IS NOT NULL, empty IN → "1 = 0", equalsOrIn singleton/multiple paths. https://claude.ai/code/session_01X163Nr31vGkvAXoJ3JgMov