Index: src/services/guardianship/delivery.js
===================================================================
--- src/services/guardianship/delivery.js	(revision 6d5ce0cde5b3d2911f42fcf2b4cd343d687c8c3b)
+++ src/services/guardianship/delivery.js	(revision fa33214eb34752fafee25fc95942f470701006f8)
@@ -13,4 +13,5 @@
 import crypto from 'crypto';
 import db from '../../config/database.js';
+import { carriesGuardians } from './context.js';
 
 const PUBLIC = 'https://www.w3.org/ns/activitystreams#Public';
@@ -49,4 +50,5 @@
   // Resolve every recipient for a mention anchor + a delivery inbox.
   const resolved = [];
+  const teapots = [];
   for (const uri of list) {
     // An actor we host is read from our own database, not fetched from our own
@@ -56,7 +58,25 @@
     const a = (localActor && localActor(uri)) || await fetchActor(uri).catch(() => null);
     if (!a || !(a.inbox || (a.endpoints && a.endpoints.sharedInbox))) continue;
+    // FEP-633c §4.1: an escalation addressed to a "guardian" that carries
+    // guardians of its own goes nowhere. There is no grand-guardian, so we
+    // MUST NOT recurse to that actor's guardians — and we fail SOFTLY: drop
+    // this one target and keep delivering to the rest, because a malformed
+    // guardian must never cost a child the guardians who are fine.
+    //
+    // Only for a call for help. An ordinary direct note is not an escalation,
+    // and a ward is perfectly entitled to message another ward.
+    if (helpRequest && carriesGuardians(a)) { teapots.push(uri); continue; }
     resolved.push({ uri, inbox: (a.endpoints && a.endpoints.sharedInbox) || a.inbox, local: !!a.local, handle: deriveHandle(uri), url: a.url || uri });
   }
-  if (!resolved.length) return null;
+  if (teapots.length) console.warn('[AP] not a teapot: escalation dropped for malformed guardian(s)', teapots.join(', '));
+  if (!resolved.length) {
+    // Every guardian was malformed. §4 does not say what to do here because
+    // §4.1 assumes there are others to continue to — but a ward whose whole
+    // safety net is broken has just called for help into nothing, which is the
+    // one outcome this FEP exists to prevent. Say so loudly; the caller can
+    // tell "nobody was reachable" from "nobody was valid".
+    if (teapots.length) console.error('[AP] EVERY guardian of', site.slug, 'is malformed: the call for help reached no one');
+    return null;
+  }
   const mention = resolved.map((r) => {
     const disp = r.handle && r.handle[0] === '@' ? r.handle : '@' + (r.handle || '');
@@ -104,5 +124,5 @@
   }
   console.log('[AP] direct note', site.slug, '→', resolved.length, 'recipient(s), delivered', delivered);
-  return { id, content, delivered };
+  return { id, content, delivered, teapots };
 }
 
