Index: src/routes/guardian.js
===================================================================
--- src/routes/guardian.js	(revision 5ae4d61c76ecec8dcb8eaeeb0ff5379e69be6f02)
+++ src/routes/guardian.js	(revision 6259305d61295ab18fffdd75204e61e27301ad75)
@@ -82,24 +82,11 @@
   const base = (process.env.PUBLIC_BASE_URL || '').replace(/\/+$/, '');
   const me = AP.actorId(base, site.slug);
-  const help = db.prepare(
-    `SELECT object_uri, note_url, actor_uri, actor_name, actor_handle, actor_icon, content, published, created_at,
-            emoji_json, actor_emoji_json, media_json, quote_json, embed_json
-     FROM ap_mentions WHERE slug = ? AND help_request = 1 ORDER BY created_at DESC LIMIT 50`
-  ).all(site.slug);
-  // De gedeelde staat in EEN query (shaer-lgo): wie er al op af is en of het is
-  // afgesloten. Per kaart vragen zou hier een N+1 opleveren, en dit is precies
-  // het scherm dat een guardian in een haast openslaat.
-  const helpStaat = Guardianship.help.statusFor(help.map((h) => h.object_uri));
-  // Wie bewaak je NU nog? Een hulpvraag van een oud-ward is niet meer van jou en
-  // hoort niet in de lijst die om je aandacht vraagt te blijven staan.
-  const mijnWards = new Set(Guardianship.listWards(site.slug).map((w) => w.other_uri));
-  const helpItems = help.map((h) => ({
+  // EEN weg naar de hulpvragen (Barts 429-jacht, 9-8): dit scherm had een
+  // eigen kopie van de queue-query, met een afkap op 50 -- dus de fix die open
+  // vragen nooit meer afkapt (shaer-6wt) ging aan het paneel voorbij, en juist
+  // de guardian met een caseload zag oude open vragen wegvallen. Nu dezelfde
+  // bron als de apps: open vragen volledig, geschiedenis afgekapt.
+  const helpItems = Guardianship.queues.helpItemsFor(site.slug).map((h) => ({
     ...h,
-    // Bij twijfel OPEN. Een hulpvraag die er afgehandeld uitziet terwijl hij dat
-    // niet is, is de gevaarlijke fout -- niet andersom.
-    state: Guardianship.help.withWardship(
-      helpStaat.get(h.object_uri) || { open: true, pickedUpBy: [], handled: null, oldestPickupAt: null },
-      mijnWards.has(h.actor_uri),
-    ),
     // The dashboard is built in the browser, so it gets the body finished: the
     // same partial de Krant and Berichten use. A 🛟 often carries a screenshot
Index: src/services/guardianship/queues.js
===================================================================
--- src/services/guardianship/queues.js	(revision 5ae4d61c76ecec8dcb8eaeeb0ff5379e69be6f02)
+++ src/services/guardianship/queues.js	(revision 6259305d61295ab18fffdd75204e61e27301ad75)
@@ -214,6 +214,14 @@
   let rijen = [];
   try {
+    // Alle velden die een kaart kan tonen, niet alleen die van de queue: de
+    // PWA had hierom een EIGEN kopie van deze query -- mét een afkap op 50,
+    // waardoor de fix hierboven aan het paneel voorbijging (Barts 429-jacht,
+    // 9-8). Een tweede weg naar dezelfde staat is precies wat er bij de
+    // reply-gate al misging; nu is dit de enige weg, en dan hoort hij ook te
+    // dragen wat een kaart nodig heeft. De extra kolommen kosten de queue
+    // niets: die leest ze gewoon niet.
     rijen = db.prepare(
-      `SELECT object_uri, actor_uri, actor_name, actor_handle, actor_icon, content, published, created_at
+      `SELECT object_uri, note_url, actor_uri, actor_name, actor_handle, actor_icon, content, published, created_at,
+              emoji_json, actor_emoji_json, media_json, quote_json, embed_json
        FROM ap_mentions WHERE slug = ? AND help_request = 1 ORDER BY created_at DESC`,
     ).all(slug);
Index: test/help-one-source.test.js
===================================================================
--- test/help-one-source.test.js	(revision 6259305d61295ab18fffdd75204e61e27301ad75)
+++ test/help-one-source.test.js	(revision 6259305d61295ab18fffdd75204e61e27301ad75)
@@ -0,0 +1,62 @@
+// Eén weg naar de hulpvragen (Barts 429-jacht, 9-8).
+//
+// De PWA had een eigen kopie van de queue-query MET een afkap op 50, dus de
+// fix die open vragen nooit meer afkapt (shaer-6wt) ging aan het paneel
+// voorbij: juist de guardian met een caseload -- de jeugdzorgmedewerker uit
+// die bead -- zag oude open vragen wegvallen. Dit legt vast dat er één bron
+// is, dat die bron alles draagt wat een kaart nodig heeft, en dat open vragen
+// ook boven de 50 blijven staan.
+//
+// In-memory SQLite. Run: npm test
+import { test } from 'node:test';
+import assert from 'node:assert/strict';
+
+process.env.DATABASE_PATH = ':memory:';
+process.env.PUBLIC_BASE_URL = 'https://klonkt.test';
+
+const dbMod = await import('../src/config/database.js');
+const db = dbMod.default;
+dbMod.initializeDatabase();
+const Guardianship = await import('../src/services/guardianship/index.js');
+
+db.prepare('INSERT INTO users (id, username, email, password_hash, role) VALUES (?,?,?,?,?)')
+  .run('u1', 'u1', 'u1@test', 'x', 'god');
+db.prepare('INSERT INTO sites (id, slug, title, owner_id) VALUES (?,?,?,?)').run('s1', 'zorg', 'Zorg', 'u1');
+
+// Een caseload: 80 hulpvragen van 80 ECHTE wards, allemaal open. Ruim boven
+// de oude afkap. De relaties moeten er zijn: withWardship sluit een vraag van
+// een oud-ward bewust (die is niet meer van jou), en zonder relatie zou dit
+// dus per ongeluk het oud-ward-pad toetsen in plaats van de afkap.
+const N = 80;
+for (let i = 0; i < N; i++) {
+  db.prepare(`INSERT INTO ap_guardianships (slug, role, other_uri, status)
+              VALUES ('zorg', 'guardian', ?, 'accepted')`).run(`https://elders/u/w${i}`);
+  db.prepare(`INSERT INTO ap_mentions (slug, object_uri, note_url, actor_uri, actor_name, content, help_request, media_json, created_at)
+              VALUES ('zorg', ?, ?, ?, ?, ?, 1, ?, datetime('now', ?))`)
+    .run(`https://elders/n${i}`, `https://elders/p${i}`, `https://elders/u/w${i}`, `Ward ${i}`,
+         `<p>hulp ${i}</p>`, '[{"url":"https://elders/plaatje.png","type":"image/png"}]', `-${i} minutes`);
+}
+
+test('alle open hulpvragen komen door, ook ver boven de oude afkap van 50', () => {
+  const items = Guardianship.queues.helpItemsFor('zorg');
+  const open = items.filter((h) => h.state.open);
+  assert.equal(open.length, N, `alle ${N} open vragen, niet ${open.length}`);
+});
+
+test('de bron draagt wat een kaart nodig heeft (de reden dat de PWA een kopie had)', () => {
+  const eerste = Guardianship.queues.helpItemsFor('zorg')[0];
+  // Precies de velden waarvoor het paneel zijn eigen query hield.
+  for (const veld of ['note_url', 'media_json', 'quote_json', 'embed_json', 'emoji_json', 'actor_emoji_json']) {
+    assert.ok(veld in eerste, `${veld} ontbreekt -- dan splitst de query zich opnieuw`);
+  }
+  assert.equal(eerste.note_url, 'https://elders/p0');
+});
+
+test('afgehandelde vragen worden WEL afgekapt: geschiedenis vraagt niets', () => {
+  // Zet alles op afgehandeld door een handled-notitie te plaatsen? Dat is de
+  // weg van help.statusFor; hier volstaat de vorm: met historyLimit 5 mogen
+  // er hoogstens 5 gesloten vragen mee, terwijl open er altijd allemaal zijn.
+  const items = Guardianship.queues.helpItemsFor('zorg', 5);
+  assert.equal(items.filter((h) => h.state.open).length, N);
+  assert.ok(items.filter((h) => !h.state.open).length <= 5);
+});
