Index: src/routes/guardian.js
===================================================================
--- src/routes/guardian.js	(revision 65abc8569b0cf766ad2c809114e7f385c1aff3b8)
+++ src/routes/guardian.js	(revision 2708282985faa68002d3d9051b403c0e12b11dd9)
@@ -317,5 +317,5 @@
     return res.json({ ok: true, allow, state: r.state, need: r.need, of: r.of });
   }
-  AP.deliverTo(site, uri, offer).catch(() => { /* queued, best-effort */ });
+  AP.deliverToActor(site, uri, offer).catch(() => { /* queued, best-effort */ });
   res.json({ ok: true, allow, state: 'open', federated: true });
 });
Index: src/services/ActivityPubService.js
===================================================================
--- src/services/ActivityPubService.js	(revision 65abc8569b0cf766ad2c809114e7f385c1aff3b8)
+++ src/services/ActivityPubService.js	(revision 2708282985faa68002d3d9051b403c0e12b11dd9)
@@ -3647,5 +3647,5 @@
 // { delivered, inbox }: delivered=false means the account could not be
 // resolved at all (a bad handle) — the offer stays recorded regardless.
-async function deliverToActor(site, actorUri, activity) {
+export async function deliverToActor(site, actorUri, activity) {
   const me = selfActorId(site.slug);
   const keys = getOrCreateKeys(site.slug);
@@ -3708,5 +3708,5 @@
   getInteractions, getInteractionById, setInteractionBoosted, setInteractionLiked, setMyReaction, getMyReactions, buildReplyNote, getOutboxNote, deliverReply, resolveRemoteNote,
   listOutbox, deliverOutboxDelete, deliverOutboxUpdate, deliverDirectNote,
-  webfingerResolve, followActor, resolveRemoteActor, unfollowActor, listFollowing, setAutoBoost, backfillFromOutbox, getTimeline, timelineAttachments, timelineEmojis, timelineObjectLinks, timelineQuote, timelineEmbed, applyQuoteProps, sendInteraction, voteOnPoll, voteOnRemotePoll,
+  webfingerResolve, followActor, resolveRemoteActor, unfollowActor, listFollowing, setAutoBoost, backfillFromOutbox, getTimeline, timelineAttachments, timelineEmojis, timelineObjectLinks, timelineQuote, timelineEmbed, applyQuoteProps, deliverToActor, sendInteraction, voteOnPoll, voteOnRemotePoll,
   acceptGatedFollow, rejectGatedFollow, isWardGuardian, sendFollowDecision,
   parseOwnPoll, pollTally, ownPollView, deliverPollUpdate, maybeCrawlThread, sendReport, localMentionSlugs,
