Index: src/services/ActivityPubService.js
===================================================================
--- src/services/ActivityPubService.js	(revision 2b4252c2c84fdd36dbdc75db1a4931f813b18a90)
+++ src/services/ActivityPubService.js	(revision 4f15f67e63db354140cf9c47d228433f046f00a6)
@@ -158,4 +158,8 @@
   const id = actorId(base, site.slug);
   const keys = getOrCreateKeys(site.slug);
+  // FEP-633c §5.3: a ward's follows are gated (guardians approve), so the actor
+  // MUST advertise manuallyApprovesFollowers:true — otherwise a follower's server
+  // (Mastodon) assumes auto-accept and shows "Following" while we hold it pending.
+  const isWard = (() => { try { return Guardianship.listGuardians(site.slug).length > 0; } catch { return false; } })();
   const actor = {
     '@context': AP_CONTEXT,
@@ -166,5 +170,5 @@
     summary: site.tagline || site.description || '',
     url: `${base}/${site.slug === site.primary_slug ? '' : 'user/' + encodeURIComponent(site.slug)}`,
-    manuallyApprovesFollowers: false,
+    manuallyApprovesFollowers: isWard,
     discoverable: true,
     inbox: `${id}/inbox`,
