Index: src/routes/guardian.js
===================================================================
--- src/routes/guardian.js	(revision 8b83cba3c913ba25bf488e535d2562506bc58441)
+++ src/routes/guardian.js	(revision abbb72a2d108bc5a3d5d84e3ddb6f81ca6a51427)
@@ -433,6 +433,22 @@
   Guardianship.help.record(noteUri, me, kind, null);
 
-  const anderen = Guardianship.listGuardians(wardUri.replace(/.*\/ap\/users\//, '')) || [];
-  const ontvangers = [wardUri, ...anderen.map((g) => g.other_uri)].filter((u) => u && u !== me);
+  // DE MEDE-GUARDIANS, en dit ging mis (shaer-lgo, gevonden 11-8 met @mee).
+  //
+  // Hier stond listGuardians(wardUri.replace(/.*\/ap\/users\//, '')): de staart
+  // van de URI als slug. listGuardians kent alleen relaties van LOKALE sites,
+  // dus voor een ward elders leverde dat altijd een lege lijst -- en juist die
+  // ward is het hele punt, want een ward op je eigen instance heeft geen
+  // federatie nodig. De markering ging dus alleen naar het kind en nooit naar
+  // de andere guardian. Precies de faalstand waar deze bead voor bestaat:
+  // iedereen denkt dat de ander het oppakt.
+  //
+  // Erger nog: had er toevallig een lokale site met die naam bestaan, dan
+  // waren het DIENS guardians geweest.
+  //
+  // existingGuardiansOf kende de goede weg al -- lokaal opzoeken, en anders
+  // shaer:guardians uit de actor van de ward. Die stond alleen niet aan deze
+  // route vast.
+  const anderen = await Guardianship.existingGuardiansOf(wardUri).catch(() => []);
+  const ontvangers = [wardUri, ...anderen].filter((u) => u && u !== me);
   const r = await AP.deliverDirectNote(site, {
     recipients: ontvangers,
Index: src/services/guardianship/handshake.js
===================================================================
--- src/services/guardianship/handshake.js	(revision 8b83cba3c913ba25bf488e535d2562506bc58441)
+++ src/services/guardianship/handshake.js	(revision abbb72a2d108bc5a3d5d84e3ddb6f81ca6a51427)
@@ -87,6 +87,12 @@
 }
 
-/** The existing guardians of a ward: local list, or the remote actor's shaer:guardians. */
-async function existingGuardiansOf(wardUri) {
+/**
+ * The existing guardians of a ward: local list, or the remote actor's
+ * shaer:guardians.
+ *
+ * Geexporteerd sinds shaer-lgo: de markeerroute had zijn EIGEN afleiding, en
+ * die was fout voor precies het geval dat telt (zie routes/guardian.js).
+ */
+export async function existingGuardiansOf(wardUri) {
   const local = deps.localSlug(wardUri);
   if (local) return relations.listGuardians(local).map((r) => r.other_uri);
@@ -627,3 +633,3 @@
 }
 
-export default { wireHandshake, handleOutbox, handleInbox, parseRelationship, parseUndoRelationship, endGuardianship, retryDeferred };
+export default { wireHandshake, handleOutbox, handleInbox, parseRelationship, parseUndoRelationship, endGuardianship, retryDeferred, existingGuardiansOf };
Index: src/services/guardianship/index.js
===================================================================
--- src/services/guardianship/index.js	(revision 8b83cba3c913ba25bf488e535d2562506bc58441)
+++ src/services/guardianship/index.js	(revision abbb72a2d108bc5a3d5d84e3ddb6f81ca6a51427)
@@ -18,5 +18,5 @@
 export { helpRequestProps, isHelpRequest, waveProps, isWave, awayProps, hasGuardiansProps, objectHasGuardians, externalEmbedsAllowed, externalPlaybackAllowed, wardGateAllowed } from './notes.js';
 export { wireDelivery, c2sVisibility, deliverDirectNote } from './delivery.js';
-export { wireHandshake, handleOutbox as handleGuardianshipOutbox, handleInbox as handleGuardianshipInbox, parseRelationship, parseUndoRelationship, endGuardianship } from './handshake.js';
+export { wireHandshake, handleOutbox as handleGuardianshipOutbox, handleInbox as handleGuardianshipInbox, parseRelationship, parseUndoRelationship, endGuardianship, existingGuardiansOf } from './handshake.js';
 export { offersCollection, followsCollection, outgoingFollowsCollection, logCollection, wardsCollection, guardiansCollection, helpCollection } from './queues.js';
 export * as availability from './availability.js';
Index: test/help-mark-coguardians.test.js
===================================================================
--- test/help-mark-coguardians.test.js	(revision abbb72a2d108bc5a3d5d84e3ddb6f81ca6a51427)
+++ test/help-mark-coguardians.test.js	(revision abbb72a2d108bc5a3d5d84e3ddb6f81ca6a51427)
@@ -0,0 +1,65 @@
+// De markering hoort naar de MEDE-GUARDIANS te gaan (shaer-lgo).
+//
+// Gevonden op 11 augustus met de echte relatie: dev.klonkt.com is guardian van
+// @mee@xn--zz9h.is.wildenvrij.nl, en die heeft er nog een -- boiert.eu. In
+// ap_help_state stond geen enkele markering van boiert, en dev had er ook nooit
+// een naartoe gestuurd.
+//
+// De oorzaak: de route leidde de mede-guardians af met
+// listGuardians(uri.replace(/.*\/ap\/users\//, '')) -- de staart van de URI als
+// slug. listGuardians kent alleen relaties van LOKALE sites, dus voor een ward
+// elders was dat altijd leeg. En juist die ward is het punt.
+import { test } from 'node:test';
+import assert from 'node:assert/strict';
+
+process.env.DATABASE_PATH = ':memory:';
+process.env.PUBLIC_BASE_URL = 'https://oma.test';
+
+const dbMod = await import('../src/config/database.js');
+const db = dbMod.default;
+dbMod.initializeDatabase();
+const rel = await import('../src/services/guardianship/relations.js');
+const G = await import('../src/services/guardianship/index.js');
+
+db.prepare('INSERT INTO users (id, username, email, password_hash, role) VALUES (?,?,?,?,?)')
+  .run('u1', 'u1', 'u1@t', 'x', 'god');
+db.prepare('INSERT INTO sites (id, slug, title, owner_id) VALUES (?,?,?,?)').run('s1', 'oma', 'Oma', 'u1');
+
+const KIND = 'https://elders.test/ap/users/mee';
+
+test('de oude afleiding gaf leeg voor een ward elders -- de fout, vastgelegd', () => {
+  // Wat er stond: de staart van de URI als slug. Er is geen lokale site 'mee',
+  // dus dit was altijd een lege lijst, en de markering ging alleen naar het kind.
+  assert.deepEqual(rel.listGuardians(KIND.replace(/.*\/ap\/users\//, '')), []);
+});
+
+// De handshake krijgt zijn afhankelijkheden normaal bij het opstarten; hier
+// alleen de twee die existingGuardiansOf raakt, met een NEPACTOR in plaats van
+// het netwerk -- anders test dit of de testmachine internet heeft.
+const gevraagd = [];
+G.wireHandshake({
+  localSlug: (uri) => {
+    const m = String(uri).match(/^https:\/\/oma\.test\/ap\/users\/([^/?#]+)$/);
+    return m ? m[1] : null;
+  },
+  fetchActor: async (uri) => {
+    gevraagd.push(uri);
+    return { id: uri, 'shaer:guardians': ['https://oma.test/ap/users/oma', 'https://elders2.test/ap/users/oom'] };
+  },
+});
+
+test('voor een ward ELDERS komen ze uit shaer:guardians van zijn actor', async () => {
+  const uit = await G.existingGuardiansOf(KIND);
+  assert.deepEqual(gevraagd, [KIND], 'de actor van de ward wordt opgehaald');
+  assert.deepEqual(uit, ['https://oma.test/ap/users/oma', 'https://elders2.test/ap/users/oom']);
+});
+
+test('voor een LOKALE ward blijft het de eigen tabel', async () => {
+  db.prepare('INSERT INTO sites (id, slug, title, owner_id) VALUES (?,?,?,?)').run('s2', 'kind', 'Kind', 'u1');
+  rel.commitGuardianForWard('kind', 'https://oma.test/ap/users/oma', { handle: '@oma@oma.test' });
+  const voor = gevraagd.length;
+  const uit = await G.existingGuardiansOf('https://oma.test/ap/users/kind');
+  assert.deepEqual(uit, ['https://oma.test/ap/users/oma'],
+    'lokaal opzoeken blijft werken -- de fix mag dat pad niet slopen');
+  assert.equal(gevraagd.length, voor, 'en haalt geen actor op die we zelf hosten');
+});
