Ignore:
Timestamp:
08/03/2026 06:38:16 AM (5 weeks ago)
Author:
Bart <bart@…>
Branches:
main
Children:
3d882bd
Parents:
69bd747
Message:

Een handshake blijft een week open, en faalt daarna onder zijn eigen naam

§4.2 leunt erop dat het uitstel begrensd is: als het venster sluit met de
controle nog onbeslist, faalt de beslissing dicht. Alleen had een
guardianship-offer in Klonkt helemaal geen venster, dus "uitgesteld" was
"voor altijd".

Nu een week. Lang genoeg dat niemand wordt opgejaagd — er moeten een ward, een
kandidaat en alle bestaande guardians antwoorden, en dat zijn mensen — en kort
genoeg dat een vergeten aanbod niet een maand in de wachtrij van een kind staat
alsof het nog een keuze is.

Twee eindtoestanden, want het zijn twee verschillende feiten:
'expired' (niemand heeft geantwoord; zegt niets over de kandidaat) en
'unverified' (iedereen heeft geantwoord, maar de kandidaat was nooit op te
halen). Geen van beide is 'void': de partijen mag niet verteld worden dat de
kandidaat geweigerd is, want dat is niet gebeurd — er heeft alleen nooit iemand
kunnen kijken.

Vervallen gebeurt bij het lezen, zoals een lapse dat ook doet: geen sweeper die
niemand draait. En het lezen van de wachtrij is meteen het moment waarop een
uitgestelde commit opnieuw wordt geprobeerd (§4.2 SHOULD) — nodig, want de
laatste Accept kan al binnen zijn en dan port niemand er ooit nog aan. Niet
awaited: een poll toont wat nu waar is.

Co-Authored-By: Claude Opus 5 <claude@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/guardianship/queues.js

    r69bd747 r30d0e2c  
    1212import * as relations from './relations.js';
    1313import * as availability from './availability.js';
     14import * as handshake from './handshake.js';
    1415
    1516const collection = (id, items) => ({
     
    2223 *  clients render both without a second fetch. */
    2324export function offersCollection(id, slug, me) {
     25  // §4.2: a handshake whose candidate could not be dereferenced is deferred,
     26  // not decided, and the last Accept may already have landed — so nothing else
     27  // would ever retry it. This poll is the schedule. Not awaited: the read
     28  // answers with what is true now, and a retry that succeeds surfaces in the
     29  // next one. `listForParty` settles closed windows on the way past.
     30  handshake.retryDeferred(slug).catch(() => { /* the next read tries again */ });
    2431  const items = offers.listForParty(slug, me).map((o) => offers.queueItem(o, me));
    2532  items.push(...availability.lapseQueueItems(slug, me, Date.now()));
Note: See TracChangeset for help on using the changeset viewer.