Changeset 69bd747 in Klonkt for test


Ignore:
Timestamp:
08/03/2026 06:26:57 AM (5 weeks ago)
Author:
Bart <bart@…>
Branches:
main
Children:
30d0e2c
Parents:
5327324
Message:

§4.2 bijgewerkt: wie wat te horen krijgt is niet voor iedereen hetzelfde

De herziene §4.2 maakt twee dingen expliciet die de implementatie van vanmiddag
verkeerd deed.

Eén: de kandidaat krijgt een KALE Reject. Commit is de laatste stap van §3.1,
dus een weigering die zichzelf als technisch aankondigt verklapt meteen dat alle
menselijke partijen al hadden geaccepteerd en alleen het protocol nog bezwaar
maakte. Bij een betwiste guardianship is dat precies wat een partij niet hoort
te weten. De ward en de bestaande guardians krijgen de reden wél: zij zijn
partij, de toestand komt uit publieke data (§2.1), en een stille void laat een
ward geloven dat een adoptie doorging die niet doorging.

Twee: dezelfde controle draait nu ook als de Offer binnenkomt. Daar heeft nog
niemand geaccepteerd, dus daar mag de reden gewoon mee — en een kandidaat die
alleen maar verkeerd geconfigureerd staat komt daar achter op het moment dat
dat nog alles is wat het betekent. De controle bij commit blijft verplicht als
vangnet voor wie tussendoor van toestand verandert.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • test/guardianship.test.js

    r5327324 r69bd747  
    160160  const stillPending = G.offersCollection(`${SAM}/queues/offers`, 'sam', SAM).orderedItems.filter((o) => o.id === id);
    161161  assert.deepEqual(stillPending, [], 'the handshake is void, not left hanging');
     162});
     163
     164test('an Offer from a candidate that is already a ward is refused on arrival (§4.2)', async () => {
     165  // The kind path. Nobody has accepted anything yet, so refusing here
     166  // discloses nothing about anyone's position, and a candidate who is merely
     167  // misconfigured gets told what is wrong while that is still all it means.
     168  const viv = site('s13', 'viv');   // adopted first, then tries to guard
     169  const zed = site('s14', 'zed');   // the would-be ward
     170  const bo = site('s15', 'bo');     // adopts Viv
     171  const [VIV, ZED, BO] = [A('viv'), A('zed'), A('bo')];
     172
     173  const adopt = await G.handleGuardianshipOutbox(bo, {
     174    type: 'Offer', object: { type: 'Relationship', subject: VIV, relationship: 'shaer:Guardian', object: BO },
     175  });
     176  await G.handleGuardianshipOutbox(viv, { type: 'Accept', object: adopt.id });
     177  assert.equal(G.listGuardians('viv').length, 1, 'Viv is a ward');
     178
     179  const handled = await G.handleGuardianshipInbox(zed, {
     180    id: `${VIV}/offers/x1`, type: 'Offer', actor: VIV, to: [ZED],
     181    object: { type: 'Relationship', subject: ZED, relationship: 'shaer:Guardian', object: VIV },
     182  });
     183  assert.equal(handled, true, 'the activity is handled — and handling it means refusing it');
     184  assert.deepEqual(
     185    G.offersCollection(`${ZED}/queues/offers`, 'zed', ZED).orderedItems, [],
     186    'never stored, so it never sits in Zed\'s queue looking like a decision to make',
     187  );
     188  assert.deepEqual(G.listGuardians('zed'), []);
    162189});
    163190
Note: See TracChangeset for help on using the changeset viewer.