Index: src/services/guardianship/queues.js
===================================================================
--- src/services/guardianship/queues.js	(revision 6eab7e9673764601cadce6d5f98893e9a32f70a9)
+++ src/services/guardianship/queues.js	(revision 30d0e2cad3257e201abc243a96cf44c6e23237ed)
@@ -12,4 +12,5 @@
 import * as relations from './relations.js';
 import * as availability from './availability.js';
+import * as handshake from './handshake.js';
 
 const collection = (id, items) => ({
@@ -22,4 +23,10 @@
  *  clients render both without a second fetch. */
 export function offersCollection(id, slug, me) {
+  // §4.2: a handshake whose candidate could not be dereferenced is deferred,
+  // not decided, and the last Accept may already have landed — so nothing else
+  // would ever retry it. This poll is the schedule. Not awaited: the read
+  // answers with what is true now, and a retry that succeeds surfaces in the
+  // next one. `listForParty` settles closed windows on the way past.
+  handshake.retryDeferred(slug).catch(() => { /* the next read tries again */ });
   const items = offers.listForParty(slug, me).map((o) => offers.queueItem(o, me));
   items.push(...availability.lapseQueueItems(slug, me, Date.now()));
