Index: src/services/guardianship/index.js
===================================================================
--- src/services/guardianship/index.js	(revision d3aa63bf861c6f1ecca750376835f2b9960aa7aa)
+++ src/services/guardianship/index.js	(revision 0db3c72bed823ab28b6f74eedfed3a1cf11faf98)
@@ -19,5 +19,5 @@
 export { wireDelivery, c2sVisibility, deliverDirectNote } from './delivery.js';
 export { wireHandshake, handleOutbox as handleGuardianshipOutbox, handleInbox as handleGuardianshipInbox, parseRelationship, parseUndoRelationship, endGuardianship } from './handshake.js';
-export { offersCollection, followsCollection, outgoingFollowsCollection, wardsCollection, guardiansCollection, helpCollection } from './queues.js';
+export { offersCollection, followsCollection, outgoingFollowsCollection, logCollection, wardsCollection, guardiansCollection, helpCollection } from './queues.js';
 export * as availability from './availability.js';
 export { wireAvailability } from './availability.js';
Index: src/services/guardianship/queues.js
===================================================================
--- src/services/guardianship/queues.js	(revision d3aa63bf861c6f1ecca750376835f2b9960aa7aa)
+++ src/services/guardianship/queues.js	(revision 0db3c72bed823ab28b6f74eedfed3a1cf11faf98)
@@ -118,5 +118,32 @@
 }
 
-export default { offersCollection, followsCollection, outgoingFollowsCollection, wardsCollection, guardiansCollection, helpCollection, helpItemsFor, wardGates, wardGuardianStatuses };
+/**
+ * Het logboek (§4.2): wat er is besloten, en waarom.
+ *
+ * Geen wachtrij, en daarom een eigen sleutel op de actor. Elk item draagt zijn
+ * soort en, als die er was, de REDEN -- want zonder die reden merkte een ward
+ * een weigering alleen doordat er iets uit een lijst verdween.
+ *
+ * `type` is geen AS2-werkwoord: de meeste soorten zijn er geen. Een lapse-stem
+ * of een opgepakte hulpvraag is geen Accept, en het zo noemen zou netter lezen
+ * dan het is.
+ *
+ * De lezer levert `listEvents` aan; deze module kent ActivityPubService niet en
+ * houdt dat zo (zie de kop van delivery.js).
+ */
+export function logCollection(id, slug, listEvents) {
+  const items = (typeof listEvents === 'function' ? listEvents(slug) : []).map((e) => {
+    const { id: n, kind, created, ...rest } = e;
+    const item = { id: `${id}/${n}`, type: 'shaer:Event', 'shaer:kind': kind, published: created };
+    for (const [k, v] of Object.entries(rest)) {
+      if (v === undefined || v === null) continue;
+      item[k.startsWith('shaer:') ? k : `shaer:${k}`] = v;
+    }
+    return item;
+  });
+  return collection(id, items);
+}
+
+export default { offersCollection, followsCollection, outgoingFollowsCollection, wardsCollection, guardiansCollection, helpCollection, helpItemsFor, wardGates, wardGuardianStatuses, logCollection };
 
 // ── Wat er voor een ward gated is (shaer-ahy.1) ─────────────────────────
Index: src/services/guardianship/relations.js
===================================================================
--- src/services/guardianship/relations.js	(revision d3aa63bf861c6f1ecca750376835f2b9960aa7aa)
+++ src/services/guardianship/relations.js	(revision 0db3c72bed823ab28b6f74eedfed3a1cf11faf98)
@@ -82,4 +82,10 @@
       help: `${id}/queues/help`,
     },
+    // NAAST de wachtrijen, niet erin. Alles onder shaer:queues wacht op een
+    // antwoord; dit is wat er al besloten is, met de reden erbij (§4.2).
+    // Geschiedenis onderbrengen bij een woord dat "wachtend" betekent maakt van
+    // twee dingen één, en dat is precies de fout die de rest van deze module
+    // net heeft opgeruimd.
+    'shaer:log': `${id}/log`,
   };
   const guardians = listGuardians(slug).map((r) => r.other_uri);
